OpenVINO2023使用简介
1 下载安装
先在anaconda中创建一个虚拟环境,该环境的python版本为3.7,之所以使用python3.7,是因为我在3.9上安装过程中出现不少bug,后面新建了一个3.7的环境才解决,我不知道是否由于和我已有环境中某些包不兼容,还是python3.9版本的问题,总是折腾了很久都没解决,最后新建了一个虚拟环境。
地址
实际上就是下面这条命令:
pip install openvino-dev[pytorch]==2023.0.1
这里可以使用清华镜像或者阿里镜像
接下来使用下面这串代码,测试是否安装成功,如果没有报错,说明OpenVINO安装成功
python -c "from openvino.runtime import Core"
2 查看可用设备
下面是查看本地可用设备
from openvino.runtime import Core
core = Core()
devices = core.available_devices
for device in devices:device_name = core.get_property(device, "FULL_DEVICE_NAME")print(f"{device}: {device_name}")
输出:
CPU: Intel(R) Core(TM) i7-10870H CPU @ 2.20GHz
GPU.0: Intel(R) UHD Graphics (iGPU)
GPU.1: NVIDIA GeForce RTX 3060 Laptop GPU (dGPU)
这里有两个GPU,一个是集显,一个是独显。
3 模型的中间表示
在OpenVINO的使用过程中,经常可以听见一个词叫IR,它的全程叫Intermediate Representation,即模型的中间表示,主要包括.xml
文件和.bin
文件,前者用于描述网络拓扑(即网络结构),后者则是包含了网络中的权重和偏置的二进制数据文件,IR是OpenVINO中模型的专有格式。
由于模型的部署环境通常不会安装PyTorch、TensorFlow这些深度学习框架,因此在训练完成之后,一般是将模型导出为onnx文件,这样可以摆脱对框架和模型所属类的依赖。ONNX定义了一组与环境和平台无关的标准格式,为AI模型的互操作性提供了基础,使AI模型可以在不同框架和环境下交互使用。硬件和软件厂商可以基于ONNX标准优化模型性能,让所有兼容ONNX标准的框架受益,简单来说,ONNX就是模型转换的中间人。
在一些比较老的教程中,是拿到onnx文件后,将其转化为IR,然后OpenVINO再读取IR文件,并将其编译到硬件上面进行推理,这是之前OpenVINO推荐的部署流程,代码如下(只显示转化成IR的代码):
from openvino.tools import mo
from openvino.runtime import serialize # pycharm可能会提示找不到serialize,但实际能执行,IDE有bugov_model = mo.convert_model(onnx_path) # onnx_path是onnx文件的路径,ov_model是OpenVINO模型
serialize(ov_model, xml_path) # xml_path是IR中xml文件的路径
serialize
方法不但会生成xml文件,还会在相同目录下生成bin文件,mo.convert_model
可以完成模型的压缩、剪枝、前处理、设置输入等操作,这个能力很加分,但本文的目的是了解OpenVINO的大致使用流程,关于模型的压缩剪枝等操作暂时不展开,可以看官方手册详细了解mo.conver_model
的功能链接
如果在训练环境中安装了OpenVINO2023,那么可以在训练结束后,跳过ONNX,直接将模型转化为OpenVINO的IR,代码如下:
from openvino.tools import mo
from openvino.runtime import serializeov_model = mo.convert_model(net) # net是PyTorch模型,ov_model是OpenVINO模型
serialize(ov_model, xml_path)
注意:将PyTorch模型直接转换成OpenVINO模型,这项功能仅仅是OpenVINO 2023.0 release才开始有的,在OpenVINO 2022之前都不支持,另外,因为这项功能比较新,因此并不是所有模型都能这么转,假如转换失败,还能老老实实先转ONNX,再转IR。
4 模型推理
得到IR之后(IR既可以在训练环境直接右PyTorch模型得到,也可以在部署环境中通过ONNX文件得到),将其读取到OpenVINO模型,然后编译到指定设备,就可以进行推理了,代码如下(省略了输入数据预处理的操作,比如图像缩放、数据压缩到0-1等):
from openvino.runtime import Core
# 创建推理核
core = Core()
# 读取IR文件
ov_model = core.read_model(model=ir_path) # ir_path是IR中xml文件的路径
# 编译到指定设备
compiled_model = core.compile_model(ov_model, 'CPU') # 'CPU'可以改成'GPU.0'、'GPU.1'或'AUTO'
# res是推理结果
res = compiled_model(input_tensor)[0]
设备除了CPU之外,还可以是GPU.0或GPU.1,也可以让系统自动选择(AUTO),看自己的电脑上有什么设备,可以使用core.available_devices
,详见第2节。
上面的流程是标准流程,实际上,core.read_model
可以直接读onnx文件,这使得我们可以跳过IR那一步,代码如下:
from openvino.runtime import Core
core = Core()
# 读取onnx文件
ov_model = core.read_model(model=onnx_path) # onnx_path是onnx文件的路径
# 编译到指定设备
compiled_model = core.compile_model(ov_model, 'CPU') # 除了CPU,还可以
# res是推理结果
res = compiled_model(input_tensor)[0]
其实,也可以使用mo.convert_model
将onnx模型转成OpenVINO模型后编译到指定设备,但这需要部署环境中有OpenVINO开发工具(即openvino.tools
),而一般情况下,部署环境没这个,只有runtime(即openvino.runtime
),所以这种方式用的不多。
5 总结
本文介绍了如何使用OpenVINO部署PyTorch模型,主要内容可以用下面几幅图表示
好了,至此,当我们得到一个PyTorch模型后,已经可以将其部署到OpenVINO上去了,当然,由于篇幅所限,还有很多细节没有展开,我们今天先把Pipeline打通,日后会具体介绍。
https://docs.openvino.ai/2023.0/notebooks/102-pytorch-to-openvino-with-output.html
https://docs.openvino.ai/2023.0/notebooks/102-pytorch-onnx-to-openvino-with-output.html
https://docs.openvino.ai/2023.0/openvino_docs_model_processing_introduction.html
https://mp.weixin.qq.com/s?__biz=MzU2NjU3OTc5NA==&mid=2247560125&idx=2&sn=001988bca941a9404ac8fe7a351b514d&chksm=fca9ec80cbde659689922250b3138e752cfccf50fde18f07016b7673bf1289bb8bd25bb4f636&scene=27
相关文章:

OpenVINO2023使用简介
1 下载安装 先在anaconda中创建一个虚拟环境,该环境的python版本为3.7,之所以使用python3.7,是因为我在3.9上安装过程中出现不少bug,后面新建了一个3.7的环境才解决,我不知道是否由于和我已有环境中某些包不兼容&…...

基于React实现无限滚动的日历详细教程,附源码【手写日历教程第二篇】
前言 最常见的日历大部分都是滚动去加载更多的月份,而不是让用户手动点击按钮切换日历月份。滚动加载的交互方式对于用户而言是更加丝滑和舒适的,没有明显的操作割裂感。 那么现在需要做一个这样的无限滚动的日历,前端开发者应该如何去思考…...

68、使用aws官方的demo和配置aws服务,进行视频流上传播放
基本思想:参考官方视频,进行了配置aws,测试了视频推流,rtsp和mp4格式的视频貌似有问题,待调研和解决 第一步:1) 进入aws的网站,然后进入ioT Core 2)先配置 Thing types & Thing,选择香港的节点,然后AWS ioT--->Manage---> Thing type 然后输入名字,创建Th…...
数据库
表 记录:行 字段(属性): 列 以行列的形式就组成了表(数据存储在表中) 关系数据库的表由记录组成,记录由字段组成,字段由字符或数字组成。它可以供各种用户共享, 具有最小冗余度和较高…...

深入了解fcntl函数:Linux系统编程中的文件控制
文章目录 概述介绍函数原型与参数 拓展:fcntl改文件属性总结 概述 摘要: fcntl函数是Linux系统编程中一个重要的函数,用于对文件描述符进行各种控制操作。本文将详细介绍fcntl函数的原型、各个参数的用法,以及阻塞和非阻塞模式切换的方法&am…...
汇川技术内推码
[庆祝]不一样的内推码[庆祝]:IVSM2R 投递了可以评论下名字,我会帮忙留意进度。 汇尔成川,共赴星海,欢迎加入,职等你来。 嵌入式软硬件,机器人算法,电机控制,通信软件,PLC…...

nacos服务器启动报错集合
报错1 Error creating bean with name ‘user‘: Unsatisfied dependency expressed through field ‘jwtTokenManage 开启鉴权之后,你可以自定义用于生成JWT令牌的密钥,application.properties中的配置信息为: ### Since 1.4.1, worked when…...

C语言_分支和循环语句(2)
文章目录 前言一、for 循环1.1语法1.2 for 语句的循环控制变量1.3 一些 for 循环的变种 二、do ... while()循环2.1 do 语句的语法2.2 do ... while 循环中的 break 和 continue2.3 练习1 **- 计算n的阶乘**2. - **在一个有序数组中查找具体的某个数字 n** 二分查找算法&#x…...

JMeter 接口自动化测试:从入门到精通的完全指南
JMeter 是一个开源的负载测试工具,它可以模拟多种协议和应用程序的负载,包括 HTTP、FTP、SMTP、JMS、SOAP 和 JDBC 等。在进行接口自动化测试时,使用 JMeter 可以帮助我们快速地构建测试用例,模拟多种场景,发现接口的性…...
【Java】集合List的toArray()方法及其重载
在Java中,集合(List 接口的实现类)提供了一个名为 toArray 的方法,用于将集合中的元素转换成数组。该方法有两个主要的重载形式,分别用于不同的情况。 toArray()重载方法1 <T> T[] toArray(T[] a)这个方法将集…...

Python学习笔记:Requests库安装、通过url下载文件
1.下载安装requests库 在pipy或者github下载,通常是个zip,解压缩后在路径输入cmd,并运行以下代码 Python setup.py install 安装完成后,输入python再输入import requests得到可以判断时候完成安装 2.通过url下载文件 使用的是u…...
git pull --rebase 用法
git pull --rebase git pull --rebase 是 Git 命令中的一个选项,它的作用是在从远程仓库拉取更新时使用 rebase 而不是默认的合并方式。使用这个命令会使您的提交历史更加整洁,因为它将您的本地提交在远程更新之前重新应用到新的提交之上。 这个命令的…...

react antd框架中的徽标获取数据对应状态的数量
实现思路:获取数量的思路是通过filter过滤符合数据来实现。 列表数组.filter(item > item.status 值).length; 例子:以下这个例子是判断data数组中的status中在职的数量。 data.filter((item) > item.status 在职).length 效果展示ÿ…...

【多线程】Thread类的用法
文章目录 1. Thread类的创建1.1 自己创建类继承Thread类1.2 实现Runnable接口1.3 使用匿名内部类创建Thread子类对象1.4 使用匿名内部类创建Runnable子类对象1.5 使用lambda创建 2. Thread常见的构造方法2.1 Thread()2.2 Thread(Runnable target)2.3 Thread(String name)2.4 Th…...

第八章 贪心算法 part03 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果 (day34补)
本文章代码以c为例! 一、力扣第1005题:K 次取反后最大化的数组和 题目: 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择…...

Android Activity启动过程一:从Intent到Activity创建
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、概览二、应用内启动源码流程 (startActivity)2.1 startActivit…...

第9章:聚类
聚类任务 性能度量 距离度量 非度量距离 原型聚类 有很好的统计学上的意义,但是只能找到椭球形的聚类。 密度聚类 层次聚类...

程序员为什么要写bug,不能一次性写好吗?
仅仅听到“Bug”这个词就会让你作为一个开发人员感到畏缩。我们相信,优秀的程序员是那些编写无错误代码的人。随着一些开发人员强调要成为一名零错误程序员,我们进行了更深刻的思考,并发现事实的准确性。 所有制作的软件都应该没有错误。对此…...
Nginx反向代理其他服务
Nginx反向代理 嘿,你的网络遇到了限制,不能直接通过服务的端口进行访问?别担心,我们可以借助Nginx这个超级英雄来解决这个问题!让我给你讲讲关于Nginx反向代理的故事吧。 首先,让我们明确一下反向代理的概…...
MQ 简介-RabbitMQ
一. MQ 简介 消息队列作为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和系统 稳定性,消息队列主要具有以下特点: 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题系统解耦:解决不同重要程度、不…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...