Window下配置OpenVINO加速Pytorch模型

Window下配置OpenVINO加速Pytorch模型

1.OpneVINO介绍

OpenVINO™是英特尔基于自身现有的硬件平台开发的一种可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,用于快速开发应用程序和解决方案,以解决各种任务(包括人类视觉模拟、自动语音识别、自然语言处理和推荐系统等)。

该工具套件基于最新一代的人工神经网络,包括卷积神经网络 (CNN)、递归网络和基于注意力的网络,可扩展跨英特尔® 硬件的计算机视觉和非视觉工作负载,从而最大限度地提高性能。它通过从边缘到云部署的高性能、人工智能和深度学习推理来为应用程序加速,并且允许直接异构执行。

  • 提高计算机视觉、自动语音识别、自然语言处理和其他常见任务中的深度学习性能

  • 使用使用流行的框架(如TensorFlow,PyTorch等)训练的模型

  • 减少资源需求,并在从边缘到云的一系列英特尔®平台上高效部署

  • 支持在Windows与Linux系统,官方支持编程语言为Python与C++语言。

框架展示

​ OpenVINOTMTM 工具套件2022.1版于2022年3月22日正式发布,根据官宣《OpenVINOTM 迎来迄今为止最重大更新,2022.1新特性抢先看》,OpenVINOTM 2022.1将是迄今为止最大变化的版本。从开发者的角度来看,对于提升开发效率或运行效率有用的特性有:

  • 提供预处理API函数

  • ONNX前端API

  • AUTO 设备插件

  • 支持直接读入飞桨模型

2.OpenVINO安装

2.1 创建虚拟环境

​ 在命令行中输入这个命令就能创建好openvino运行所需要的anaconda所需要的虚拟环境。

conda create -n openvino python=3.9

创建openvino环境

再输入以下命令就能激活openvino环境

activate openvino

激活环境

2.2 OpenVINO

OpenVINOTM安装分为完整版(Development Tools)安装与不完整版(Runtime)安装。

完整版安装会安装所有部件,包括模型优化器和推理部署套件运行工具(Runtime),目前该方式支持PIP安装方式,因此建议采用PIP安装在虚拟环境中,防止安装出错照成电脑环境出现问题。该安装方式至此Python、C++同时使用,由于安装路径较长,对C++使用不太方便,因此该安装方式最好使用Python编程。

非完整版安装主要安装编译环境(Runtime),安装比较简单,且一般会安装到根目录下,方便使用,因此如果不使用模型优化且情况下,或者使用C++编译环境的话,建议选用此方式。

2.2.1 Development Tools(完整版安装)

​ 点击上方链接就能进到这个页面,按照你的电脑的情况选择参数,需要注意的是最后一项的框架要根据你需需要使用的框架选择。例如我这边需要用到pytorch和ONNX就选了这两项。

openvino pip安装

官网会自动生成pip命令

pip命令

​ 将最后一个命令在刚刚新建好的openvino环境中运行即可安装成功。

pip install openvino-dev[ONNX,pytorch]==2022.1.0

openvino安装成功

2.2.2 Runtime(不完整版安装)

​ 操作基本与完整版的相同,只需要更改一下安装的参数即可。

runtime安装

官网会自动生成pip命令

runtime命令

pip install openvino==2022.1.0

openvino安装成功

3.框架转换

​ pytorch是一个用于深度学习的开源机器学习框架,通常情况下可以直接在本地或者云端进行模型训练和预测等操作。 但是当需要将pytorch模型部署到硬件加速器(如NSC)上时,需要将pytorch模型转换为指定格式的IR模型。

​ 原因是,不同的硬件加速器对于模型的支持有所差别,而IR(intermediate representation)模型作为一种通用的中间表示形式,可以在不同的平台之间进行转换和适配。 因此,将pytorch模型转换为IR模型能够使得模型在不同平台上具备更好的可移植性和兼容性,从而更方便地进行模型的部署和推理操作。

3.1 Pytorch转ONNX

​ Pytorch转成ONNX关键是是要将权重参数文件与模型的输入输出方式加载进ONNX文件。

# 转为ONNX
def get_ONNX(n_channels, n_classes, image_width, image_height, model_path, onnx_path):
    # 加载模型
    model = UNet(n_channels, n_classes)
    weights = torch.load(model_path, map_location=torch.device('cpu'))

    if 'mask_values' in weights:
        del weights['mask_values']

    model.load_state_dict(weights)

    # 输入输出
    input_names = ['input']
    output_names = ['output']

    # 评估模式
    model.eval()

    # 虚拟输出
    input_shape = (1, 3, image_height, image_width)
    dummy_input = torch.randn(input_shape)

    # 模型转换
    torch.onnx.export(model, dummy_input, onnx_path, input_names=input_names,
                      output_names=output_names,
                      opset_version=11)
    # 模型测试
    model = onnx.load(onnx_path)
    onnx.checker.check_model(model)

    print('Model sucessfully converted to ONNX format.')

onnx模型检测

import onnx

model = onnx.load('model/model1.onnx')
onnx.checker.check_model(model)

测试模型

若没有报错则说明ONNX文件完整可用。

3.2 ONNX转IR

方式1

​ openvino在安装之后会在安装目录底下附带模型转换的工具包,需要再你安装openvino的根目录下搜索mo_onnx.py文件。我的目录如下命令显示。

cd D:\Development\1.Tools\Python\Anaconda3\envs\openvino\Lib\site-packages\openvino\tools\mo

mo

然后再此目录下将配置好的环境打开

activate openvino

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k5TJXvI9-1681872349675)(null)]

然后运行该文件将ONNX格式转为IR格式。

python mo_onnx.py 
--input_model D:\Development\Python\Project\model_test\model\model1.onnx 
--model_name D:\Development\Python\Project\model_test\model

转换成功

转换成功后会在你设定的输出目录下有这3个文件。

IR模型文件

方式2

​ 由于每次都要在命令行输入命令来转化模型比较麻烦,因此可以把该python文件复制下来粘贴到项目中。

mo_onnx.py

#!/usr/bin/env python3

# Copyright (C) 2018-2022 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

if __name__ == "__main__":
    from openvino.tools.mo.subprocess_main import subprocess_main
    subprocess_main(framework='onnx')

​ 然后再用os库来向命令行中输入命令来生成模型。

# 转为IR
def get_IR(onnx_path, ir_path):
    command = f'python ../model_transfor/mo_onnx.py --input_model {onnx_path} --model_name {ir_path}'
    os.system(command)

​ 这样就能在Pycharm中一键转化模型了。

4.模型加速

openvino开发

下面的就是openvino基础的基础开发流程的实例演示。想要学习更多有关openvino开发知识,可以去openvino的官网了解跟多。

4.1 初始化核

# 引入核心
ie = IECore()
for device in ie.available_devices:
    print(device)

4.2 读取模型

# 加载模型
model_xml = "../model_infor/model_ir/model.xml"
model_bin = "../model_infor/model_ir/model.bin"

4.3 配置出入

# 输入输出
input_blob = next(iter(net.input_info))
out_blob = next(iter(net.outputs))

4.4 加载网络

# 加载网络
exec_net = ie.load_network(network=net, device_name="CPU")

4.5 设置推断

# 图像推断
result = exec_net.infer(inputs={input_blob: img})

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaoXinJT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值