没有“中间商赚差价”, OpenVINO™ 直接支持 PyTorch 模型对象

news2024/11/24 1:06:54

点击蓝字

关注我们,让开发变得更有趣

作者 | 杨亦诚

排版 | 李擎

没有“中间商赚差价”, OpenVINO™ 

直接支持 PyTorch 模型对象

背景

作为最热门的开源深度学习框架之一,PyTorch 的易用性和灵活性使其深受学术和研究界的喜爱。之前 OpenVINO™ 对于 PyTorch 模型的支持也仅仅停留在 ONNX 过渡阶段,需要通过将 PyTorch 动态模型导出为 ONNX 静态格式后,才可以直接被 OpenVINO™ runtime 离线加载,虽然 PyTorch 也提供了官方的 torch.onnx.export 接口帮助开发者导出 ONNX 模型,但毕竟有这么一个“中间商”在那里,其中很多额外的配置工作也为 OpenVINO™ 开发者带来了不便,诸如动态/静态输入设定,以及 opset 版本设定等。

一、OpenVINO™ 直接支持 PyTorch 模型对象

f4209414be9c61105ede77ab045d7ec5.png

随着 OpenVINO™ 2023.0 版本的发布,OpenVINO™ 工具库中预置了全新的 PyTorch 前端,为开发者们提供了一条全新的 PyTorch 模型支持路径,带来更友好的用户体验—— OpenVINO™ 的 mo 工具可以直接将 PyTorch 模型对象转化为 OpenVINO™ 的模型对象,开发者可以不需要将 ONNX 模型作为中间过渡。

import torchvision
import torch
from openvino.tools.mo import convert_model


model = torchvision.models.resnet50(pretrained=True)
ov_model = convert_model(model)

对比以 ONNX 作为中间过度的方式,新 PyTorch 前端有以下特点:

79d4a045ccf2c1a86306dfac157d96c4.png

目前支持的 PyTorch 模型对象有:

· torch.nn.Module

· torch.jit.ScriptModule

· torch.jit.ScriptFunction

在 OpenVINO™ 内部,PyTorch 前端基于 TorchScript 进行模型导出,而 TorchScript 支持两种模型导出模式,一种称为 Tracing,一种称为 Scripting。其中 Tracing 指的是 PyTorch 在模型运行时,追踪运行经过的模块算子,实时构建计算流图,并最终总结为一种中间表示,Trace 是个双刃剑,好处是用户无需了解 Python 代码个中细节,无论是 Function、Module 还是 Generators、Coroutines,Tracing 都会忠实地记录下经过的 Tensor 以及 Tensor Function,非常适用于不涉及数据相关控制流的简单模块和功能,例如标准卷积神经网络,坏处就在于 Tracing 不能感知控制流和计算图的动态,如 if 语句或循环。比如他会把循环展开,一方面可能可以增加编译优化的空间,另一方面如果该循环在不同 infer 的时候是动态变长的,那么 Tracing 不能感知到这一点,只会将 Tracing 时候的循环记录下来。为了转换包含依赖于数据的控制流的模块和函数,提供了一种 Scripting 机制,Scripting 从 Python 源代码级别进行解析,而非在运行时构建。Scripting 会去理解所有的 code,真正像一个编译器一样去进行语法分析等操作。Scripting 相当于一个嵌入在 Python/Pytorch 的DSL,其语法只是 PyTorch 语法的子集,这意味着存在一些 op 和语法 Scripting 不支持,这样在编译的时候就会遇到问题。

在刚刚的例子中 PyTorch 前端使用 Scripting 进行模型导出,如果想使用 Tracing 的方式,可以在接口中新增一个 example_input 参数,此时 PyTorch 前端会优先调用 Tracing 的方式,当 Tracing 的方式失败后,再调用 Scripting 方式。

import torchvision
import torch
from openvino.tools.mo import convert_model


model = torchvision.models.resnet50(pretrained=True)
ov_model = convert_model(model, example_input=torch.zeros(1, 3, 100, 100))

目前 examle_input 支持的数据格式有:

· openvino.runtime.Tensor

· torch.Tensor

· np.ndarray

· list or tuple with tensors (openvino.runtime.Tensor / torch.Tensor / np.ndarray)

· dictionary where key is the input name, value is the tensor (openvino.runtime.Tensor / torch.Tensor / np.ndarray)

值得注意的是,以上两个例子导出的均为动态输入模型对象,如果想指定模型的输入 shape,可以再次添加额外的参数 input_shape/input, 将输入 shape 作为参数传入,选其一即可。案例可参考以下的实战部分。

最后,如果开发者希望导出静态 IR 文件以便后续使用,也可以调用以下接口,将 OpenVINO™ 的模型对象进行序列化:

serialize(ov_model, str(ir_model_xml))

二、BERT 模型案例实战

接下来我们通过一个实例来看下如何完成从 BERT 模型转化到量化的全过程。

1. 获取 PyTorch 模型对象

torch_model = 
BertForSequenceClassification.from_pretrained(PRETRAINED_MODEL_DIR)

2. 设置模型参数并转化为 OpenVINO™ 模型对象

由于 BERT 是一个多输入模型,这里额外添加了一个 input=input_info 参数,可以用来指定多输入模型中每一个 input 的 shape 以及数据类型。

input_shape = PartialShape([1, -1])
input_info = [("input_ids", input_shape, np.int64),("attention_mask", 
input_shape, np.int64),("token_type_ids", input_shape, np.int64)]
default_input = torch.ones(1, MAX_SEQ_LENGTH, dtype=torch.int64)
inputs = {
    "input_ids": default_input,
    "attention_mask": default_input,
    "token_type_ids": default_input,
}
model = convert_model(torch_model, example_input=inputs, input=input_info)

3. 准备校验数据集,并启动量化

上一步中获得的 model 为 openvino.runtime.Model 类型,可以直接被 NNCF 工具加载

calibration_dataset = nncf.Dataset(data_source, transform_fn)
# Quantize the model. By specifying model_type, we specify additional 
transformer patterns in the model.
quantized_model = nncf.quantize(model, calibration_dataset,
                                model_type=ModelType.TRANSFORMER)

4. 编译量化后的模型对象,并进行推理

compiled_quantized_model = core.compile_model(model=quantized_model, device_name="CPU")
output_layer = compiled_quantized_model.outputs[0]
result = compiled_quantized_model(inputs)[output_layer]
result = np.argmax(result)
print(f"Text 1: {sample['sentence1']}")
print(f"Text 2: {sample['sentence2']}")
print(f"The same meaning: {'yes' if result == 1 else 'no'}")

最终结果如下:

Text 1: Wal-Mart said it would check all of its million-plus domestic workers to ensure they were legally employed .
Text 2: It has also said it would review all of its domestic employees more than 1 million to ensure they have legal status .
The same meaning: yes

完整实例和性能精度比较,可以参考:

https://github.com/openvinotoolkit/openvino_notebooks/blob/main/notebooks/105-language-quantize-bert/105-language-quantize-bert.ipynb

三、总结

作为近期发布的最新版本,OpenVINO™ 2023.0 中的 mo 工具可以在不需要通过 ONNX 中间过渡的情况下,直接将 PyTorch 模型对象转化为 OpenVINO™ 对象,免去开发者离线转化和额外配置的过程,带来更友好的用户体验。鉴于该功能是预发布状态,可能存在部分算子不支持的情况,此时,开发者依旧可以使用之前的路径,依托 ONNX 前端进行 PyTorch 模型的转换。


--END--

你也许想了解(点击蓝字查看)⬇️➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型➡️ 开发者实战系列资源包来啦!➡️ 以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️ 还不知道如何用OpenVINO™作画?点击了解教程。➡️ 几行代码轻松实现对于PaddleOCR的实时推理,快来get!➡️ 使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理➡️ 图片提取文字很神奇?试试三步实现OCR!➡️【Notebook系列第六期】基于Pytorch预训练模型,实现语义分割任务➡️使用OpenVINO™ 预处理API进一步提升YOLOv5推理性能
扫描下方二维码立即体验 
OpenVINO™ 工具套件 2023.0

点击 阅读原文 立即体验OpenVINO 2023.0

d36208ef343f0e6e971b22849586dea3.png

文章这么精彩,你有没有“在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人脸检测——基于机器学习2】Haar特性

1.什么是Haar特征 Haar特征是一种反映人脸灰度差异的矩形特征,因其与Haar小波类似而得名。 2.什么是Haar小波 Haar小波: 定义 其波形图为 由图2.1可以看出,Haar小波可以看作二值 分类问题,如同Haar矩阵特征非黑即白,故Haar矩阵特征又称为类Haar特征。 3.Haar特征 H…

React项目引入Arco Design,以及Arco Design Pro 架构

创建项目 创建 react-arco 项目 pnpm create vite my-vue-app --template react安装 arco-design/web-react 安装 react 版的 arco-design 基础使用 添加一个按钮,App.tsx import "./App.css"; import { Button } from "arco-design/web-react…

基本类型与包装类型区别

知识点概括: 简介: Java有八种基本类型,byte, short, int, long, float, double, char, boolean。 对应八种包装类,Byte, Short&…

【Python架构】在 Python 中使用架构模式管理复杂性

你的源代码是不是感觉像一个大泥球?依赖项是否在您的代码库中交织在一起,以至于改变感觉很危险或不可能? 随着业务的增长和领域模型(您在应用程序中解决的业务问题)变得更加复杂,我们如何在不从头开始重新编…

Android初体验

文章目录 前言一、安卓架构1.1 安卓架构1.2 信息安全1.3 兼容性测试 二、使用WSL编译安卓低版本(10)总结 前言 Android 是一个适用于移动设备的开源操作系统,也是由 Google 主导的对应开源项目。 最初,Android只在移动设备中流行…

快码住! 帮你巧妙记忆C语言运算符的优先级顺序!

文章目录 C语言中的运算符C语言中运算符的优先级巧妙记忆运算符优先级的方法因不明确优先级而造成的常见问题 C语言中的运算符 C语言中的运算符说多也多,说不多也不多,包括以下运算符: C语言中运算符的优先级 C语言运算符优先级表&#xff…

Springboot--关于自定义stater的yml无法提示

1.前言 在以前在搭建架构的时候就碰到了类似的情况,在使用EnableConfigurationProperties注解的时候,不管怎样,在项目中引入了该starter的情况下依然不发自动的提示properties里面的属性。 Data ConfigurationProperties(prefix "pro…

python selenium2/webdriver自动化测试系列教程!?

以下是 Python Selenium2/WebDriver 自动化测试系列教程,希望能对您有所帮助: 1、安装 Selenium WebDriver 在安装 Python 的基础上,请使用 pip 命令安装 Selenium WebDriver: pip install selenium 2、配置浏览器驱动程序 S…

UDP编程

前置知识 #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags);sockfd&#xff1a;表示要发送数据的套接字描述符。它是由socket函数创建的套接字返回的文件描述符。 buf&#xff1a;是一个指向要…

高级SQL语句

高级SQL语句 建立实验环境高级语句1.---- SELECT ----显示表格中一个或数个字段的所有数据记录2.---- DISTINCT ----不显示重复的数据记录3.---- WHERE ----有条件查询4.---- AND OR ----且 或 &#xff08;一般配合where使用&#xff09;5.---- IN ----显示已知的值的数据记录…

【人工智能技术专题】「入门到精通系列教程」零基础带你掌握人工智能全流程技术体系和实战指南(人工智能理论知识概论)

零基础带你掌握人工智能全流程技术体系和实战指南 前言专栏介绍专栏说明学习大纲前提条件面向读者学习目标人工智能背景介绍概念说明定义 目标方向目标人工智能的主要目标人工智能的应用领域 人工智能学科领域人工智能分类基于应用的人工智能弱AI&#xff08;弱人工智能&#x…

【干货】Android系统定制基础篇:第二部分(Launcher3支持键盘切换焦点、开发者模式密码确认、禁止非预装应用安装、配置时间)

1、Android Launcher3支持键盘切换焦点 Android Launcher3 默认并不支持键盘操作&#xff0c;无法切换焦点&#xff0c;在一些需要支持键盘或遥控操作的设备中无法使用&#xff0c;因些对 Launcher3 做简单修改&#xff0c;使其支持键盘切换焦点。 diff --git a/packages/app…

在字节跳动做了5年软件测试,无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次…

JS-快速入门

目录 变量原生数据类型模板字符串字符串的内置属性、方法数组数组创建方式数组值操作获取值添加值删除值判断是否是数组获取值的索引 对象创建对象&#xff0c;为对象创建新属性对象值存到同名常(变)量中 对象数组和JSON创建对象数组对象数组取值对象数组转JSON数据 if条件语句…

ELK技术堆栈(yum安装部署)

ELK技术堆栈&#xff08;yum安装部署&#xff09; 目录 ELK技术堆栈可以应用于各种场景 ELK的工作原理如下&#xff1a; 它由三个核心组件组成&#xff1a; 部署步骤&#xff1a;&#xff08;单台部署&#xff09; 环境部署&#xff1a; 安装JAVA环境&#xff1a;&#…

数据库系统概述——第十章 数据库恢复技术(知识点复习+练习题)

&#x1f31f;博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f99a;专栏&am…

单页面应用是什么?优缺点?如何弥补缺点

文章目录 导文单页面应用是什么&#xff1f;优点&#xff1a;缺点&#xff1a;弥补缺点的方法&#xff1a; 导文 Web单页应用就是指只有一个Web页面作为入口的应用 在浏览器中运行期间不会重新加载页面。也就是说浏览器一开始会加载它必需的thml、css和js 之后所有的交互操作都…

Godot 4 源码分析 - 命令行参数

粗看Godot 4的源码&#xff0c;稍微调试一下&#xff0c;发现一大堆的命令行参数。在widechar_main中 Error err Main::setup(argv_utf8[0], argc - 1, &argv_utf8[1]); Main::setup中&#xff0c;各命令行参数加入到List<Stirng> args中&#xff0c;并通过OS::get…

技术引领 踏浪而行 2023 A+CLUB 北京峰会 | 活动回顾

6月10日&#xff0c;“技术引领 踏浪而行”2023 ACLUB 北京峰会活动圆满举办&#xff0c;近70家机构超百人参会&#xff0c;其中北京及周边地区优秀私募占比八成。私募、券商、专家学者、业内先进解决方案&#xff08;包括算力、存储、网络、软件&#xff09;供应商从不同角度分…

【2023unity游戏制作-mango的冒险】-7.玩法实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…