1 下載安裝OpenVINO開發(fā)工具
先在anaconda中創(chuàng)建一個(gè)虛擬環(huán)境,該環(huán)境的python版本為3.7,之所以使用python3.7,是因?yàn)槲以?.9上安裝過(guò)程中出現(xiàn)不少bug,后面新建了一個(gè)3.7的環(huán)境才解決,我不知道是否由于和我已有環(huán)境中某些包不兼容,還是python3.9版本的問(wèn)題,總是折騰了很久都沒(méi)解決,最后新建了一個(gè)虛擬環(huán)境。
地址
實(shí)際上就是下面這條命令:
pip install openvino-dev[pytorch]==2023.0.1
這里可以使用清華鏡像或者阿里鏡像
接下來(lái)使用下面這串代碼,測(cè)試是否安裝成功,如果沒(méi)有報(bào)錯(cuò),說(shuō)明OpenVINO安裝成功
python -c "from openvino.runtime import Core"
2 查看可用設(shè)備
下面是查看本地可用設(shè)備
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)
這里有兩個(gè)GPU,一個(gè)是集顯,一個(gè)是獨(dú)顯。
3 模型的中間表示
在OpenVINO的使用過(guò)程中,經(jīng)??梢月犚娨粋€(gè)詞叫IR,它的全程叫Intermediate Representation,即模型的中間表示,主要包括.xml
文件和.bin
文件,前者用于描述網(wǎng)絡(luò)拓?fù)洌淳W(wǎng)絡(luò)結(jié)構(gòu)),后者則是包含了網(wǎng)絡(luò)中的權(quán)重和偏置的二進(jìn)制數(shù)據(jù)文件,IR是OpenVINO中模型的專有格式。
由于模型的部署環(huán)境通常不會(huì)安裝PyTorch、TensorFlow這些深度學(xué)習(xí)框架,因此在訓(xùn)練完成之后,一般是將模型導(dǎo)出為onnx文件,這樣可以擺脫對(duì)框架和模型所屬類的依賴。ONNX定義了一組與環(huán)境和平臺(tái)無(wú)關(guān)的標(biāo)準(zhǔn)格式,為AI模型的互操作性提供了基礎(chǔ),使AI模型可以在不同框架和環(huán)境下交互使用。硬件和軟件廠商可以基于ONNX標(biāo)準(zhǔn)優(yōu)化模型性能,讓所有兼容ONNX標(biāo)準(zhǔn)的框架受益,簡(jiǎn)單來(lái)說(shuō),ONNX就是模型轉(zhuǎn)換的中間人。
在一些比較老的教程中,是拿到onnx文件后,將其轉(zhuǎn)化為IR,然后OpenVINO再讀取IR文件,并將其編譯到硬件上面進(jìn)行推理,這是之前OpenVINO推薦的部署流程,代碼如下(只顯示轉(zhuǎn)化成IR的代碼):
from openvino.tools import mo
from openvino.runtime import serialize # pycharm可能會(huì)提示找不到serialize,但實(shí)際能執(zhí)行,IDE有bug
ov_model = mo.convert_model(onnx_path) # onnx_path是onnx文件的路徑,ov_model是OpenVINO模型
serialize(ov_model, xml_path) # xml_path是IR中xml文件的路徑
serialize
方法不但會(huì)生成xml文件,還會(huì)在相同目錄下生成bin文件,mo.convert_model
可以完成模型的壓縮、剪枝、前處理、設(shè)置輸入等操作,這個(gè)能力很加分,但本文的目的是了解OpenVINO的大致使用流程,關(guān)于模型的壓縮剪枝等操作暫時(shí)不展開,可以看官方手冊(cè)詳細(xì)了解mo.conver_model
的功能鏈接
如果在訓(xùn)練環(huán)境中安裝了OpenVINO2023,那么可以在訓(xùn)練結(jié)束后,跳過(guò)ONNX,直接將模型轉(zhuǎn)化為OpenVINO的IR,代碼如下:
from openvino.tools import mo
from openvino.runtime import serialize
ov_model = mo.convert_model(net) # net是PyTorch模型,ov_model是OpenVINO模型
serialize(ov_model, xml_path)
注意:將PyTorch模型直接轉(zhuǎn)換成OpenVINO模型,這項(xiàng)功能僅僅是OpenVINO 2023.0 release才開始有的,在OpenVINO 2022之前都不支持,另外,因?yàn)檫@項(xiàng)功能比較新,因此并不是所有模型都能這么轉(zhuǎn),假如轉(zhuǎn)換失敗,還能老老實(shí)實(shí)先轉(zhuǎn)ONNX,再轉(zhuǎn)IR。
4 模型推理
得到IR之后(IR既可以在訓(xùn)練環(huán)境直接右PyTorch模型得到,也可以在部署環(huán)境中通過(guò)ONNX文件得到),將其讀取到OpenVINO模型,然后編譯到指定設(shè)備,就可以進(jìn)行推理了,代碼如下(省略了輸入數(shù)據(jù)預(yù)處理的操作,比如圖像縮放、數(shù)據(jù)壓縮到0-1等):
from openvino.runtime import Core
# 創(chuàng)建推理核
core = Core()
# 讀取IR文件
ov_model = core.read_model(model=ir_path) # ir_path是IR中xml文件的路徑
# 編譯到指定設(shè)備
compiled_model = core.compile_model(ov_model, 'CPU') # 'CPU'可以改成'GPU.0'、'GPU.1'或'AUTO'
# res是推理結(jié)果
res = compiled_model(input_data)[0] #
設(shè)備除了CPU之外,還可以是GPU.0或GPU.1,也可以讓系統(tǒng)自動(dòng)選擇(AUTO),看自己的電腦上有什么設(shè)備,可以使用core.available_devices
,詳見第2節(jié);推理時(shí),input_data
,既可以是torch的tensor,也可以是numpy的array;
上面的流程是標(biāo)準(zhǔn)流程,實(shí)際上,自從OpenVINO2020R04之后,core.read_model
可以直接讀onnx文件,這使得我們可以跳過(guò)IR那一步(但據(jù)說(shuō)OpenVINO加載onnx文件會(huì)比加載IR文件更慢,不過(guò)對(duì)推理速度無(wú)影響,可以做個(gè)實(shí)驗(yàn)驗(yàn)證一下),代碼如下:
from openvino.runtime import Core
core = Core()
# 讀取onnx文件
ov_model = core.read_model(model=onnx_path) # onnx_path是onnx文件的路徑
# 編譯到指定設(shè)備
compiled_model = core.compile_model(ov_model, 'CPU')
# res是推理結(jié)果
res = compiled_model(input_data)[0]
其實(shí),也可以使用mo.convert_model
將onnx模型轉(zhuǎn)成OpenVINO模型后編譯到指定設(shè)備,但這需要部署環(huán)境中有OpenVINO開發(fā)工具(即openvino.tools
),而一般情況下,部署環(huán)境中沒(méi)這個(gè),只有runtime(即openvino.runtime
),所以這種方式用的不多。
5 根據(jù)IR或ONNX文件獲取模型的輸入輸出尺寸和數(shù)據(jù)類型
在很多大公司中,算法模型的研發(fā)與部署不是同一批人做,部署人員拿到 IR/ONNX 文件之后,需要知道模型的輸入shape是什么,數(shù)據(jù)類型是什么,OpenVINO中可以根據(jù)模型文件獲得相關(guān)信息。
我們先創(chuàng)建一個(gè)ONNX文件,程序如下:
import torch
from torchvision import models
# 定義模型并下載權(quán)重
model = models.resnet18(pretrained=True, num_classes=1000)
# 導(dǎo)出ONNX文件
model.eval()
dummy_input = torch.randn(1, 3, 228, 228)
torch.onnx.export(model, (dummy_input), 'resnet18.onnx')
此時(shí),當(dāng)前目錄下會(huì)有一個(gè)名為resnet18.onnx的模型文件,假設(shè)這是別人給你的,你不知道它的輸入輸出信息,你想獲得它的輸入輸出,可以使用如下程序:
from openvino.runtime import Core
# 創(chuàng)建推理核
core = Core()
# 讀取ONNX文件并編譯到指定設(shè)備
ov_model = core.read_model(model='resnet18.onnx')
compiled_model = core.compile_model(ov_model, 'CPU')
# 獲取模型的輸入輸出信息
input_key = compiled_model.input(0)
output_key = compiled_model.output(0) # 如果獲得了output_key,推理時(shí)可以寫成compiled_model(input_data)[output_key]
# 打印輸入輸出信息
print('input_key:', input_key)
print('output_key:', output_key)
print('input_key.shape:', input_key.shape)
print('output_key.shape:', output_key.shape)
打印如下:
input_key: <ConstOutput: names[input.1] shape[1,3,228,228] type: f32>
output_key: <ConstOutput: names[191] shape[1,1000] type: f32>
input_key.shape: [1,3,228,228]
output_key.shape: [1,1000]
好的,我們可以看到該ONNX文件對(duì)應(yīng)的模型,其輸入的shape為(1,3,228,228)
,數(shù)據(jù)類型為f32(即單精度浮點(diǎn)型),輸出的shape為(1, 1000)
,數(shù)據(jù)類型為f32。
6 總結(jié)
本文介紹了如何使用OpenVINO部署PyTorch模型,主要內(nèi)容可以用下面幾幅圖表示
好了,至此,當(dāng)我們得到一個(gè)PyTorch模型后,已經(jīng)可以將其部署到OpenVINO上去了,當(dāng)然,由于篇幅所限,還有很多細(xì)節(jié)沒(méi)有展開,我們今天先把Pipeline打通,日后會(huì)具體介紹。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-684039.html
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文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-684039.html
到了這里,關(guān)于OpenVINO2023使用簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!