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

这篇具有很好参考价值的文章主要介绍了没有“中间商赚差价”, OpenVINO™ 直接支持 PyTorch 模型对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

点击蓝字

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

作者 | 杨亦诚

排版 | 李擎

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

直接支持 PyTorch 模型对象

背景

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

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

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

随着 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 前端有以下特点:

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

目前支持的 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

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

文章这么精彩,你有没有“在看文章来源地址https://www.toymoban.com/news/detail-499110.html

到了这里,关于没有“中间商赚差价”, OpenVINO™ 直接支持 PyTorch 模型对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu离线安装Openssh,完美解决没有网络无法直接apt-get

           缺省情况下,我们在部署好ubuntu后,ubuntu是不允许我们直接SSH的,需要我们去下载,但是在机房这样的内网环境下,就显得格外困难,因为无法直接apt-get。所有我们可以通关上传openssh软件包进行安装,来解决这个问题!   openssh-client  SSH客户端 openssh-server  SSH远程

    2024年02月09日
    浏览(47)
  • Java中支持分库分表的框架/组件/中间件简介

    列举一些比较常见的,简单介绍一下: sharding-jdbc(当当) TSharding(蘑菇街) Atlas(奇虎360) Cobar(阿里巴巴) MyCAT(基于Cobar) TDDL(淘宝) Vitess(谷歌) 首先,第一个,可能也是最常见最常用的,Sharding-JDBC,这个是最早的名字,现在已经发展成为ShardingSphere,生态,详细

    2024年02月10日
    浏览(40)
  • ChatGPT新增超强插件:文本直接生成视频、海报,支持自定义修改!

    全球著名在线设计平台Canva,在ChatGPT Plus(GPT-4)上推出了插件功能,用户通过文本提示,几秒钟就能生成演示文稿、PPT插图、电子书封面、宴会邀请函等各种精美设计海报,同时支持生成视频。 该插件最强大的功能在于,用户如果对自动生成的海报、视频不满意,可以点击

    2024年02月09日
    浏览(41)
  • uniapp自定义tabbar(支持中间凸起,角标,动态隐藏tab,全端适用)

    在使用uniapp进行开发时,tabbar是我们使用的很频繁的一个组件,但是在特定的平台会有一些使用上的限制,无法通过一套代码来做通用平台的适配。比如说中间按钮凸起,动态隐藏某个tab(不同角色展示不同功能),使用字体图标,数字角标等,这些功能不是所有平台都支持

    2024年02月02日
    浏览(42)
  • 【Sklearn】基于支持向量机算法的数据分类预测(Excel可直接替换数据)

    支持向量机(Support Vector Machine,SVM)是一种用于分类和回归的监督学习算法,其基本思想是在特征空间中找到一个能够最大化分类间隔(Margin)的超平面,从而将不同类别的样本正确分类。以下是SVM的数学模型和模型原理的解释: 假设我们有一个训练数据集,包含

    2024年02月13日
    浏览(45)
  • 【Pytroch】基于支持向量机算法的数据分类预测(Excel可直接替换数据)

    支持向量机(Support Vector Machine,SVM)是一种强大的监督学习算法,用于二分类和多分类问题。它的主要思想是找到一个最优的超平面,可以在特征空间中将不同类别的数据点分隔开。 下面是使用PyTorch实现支持向量机算法的基本步骤和原理: 数据准备: 首先,你需要准备你

    2024年02月13日
    浏览(57)
  • UEditorPlus v3.8.0 文档导入支持直接粘贴 Markdown 格式,已知问题修复

    UEditor 是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符合现代浏览器的审美。 在开发过程中解决了

    2024年02月19日
    浏览(55)
  • Java 压缩多个文件为zip包(中间不生成临时文件,直接压缩为zip二进制流),以及解压zip包二进制流为文件

    这篇博客将提供俩种方法, 提前生成要压缩的多个文件,然后读取文件夹多层或一层去遍历压缩zip包 直接用原始文件名称及二进制流,压缩返回zip包二进制流,中间不生成冗余文件; 很明显方法2更优一些; 解压zip文件或者zip文件流验证; 压缩俩个文件到zip包,并分别解析

    2024年02月06日
    浏览(54)
  • docker swarm没有淘汰并且已经支持CSI接口

    傻傻分不清楚的docker swarm经典版、swarmkit、 swram mode 项目地址 :https://github.com/docker/swarm 重定向到claasicswarm https://github.com/docker-archive/classicswarm 项目2014年开始开发,2021年1月归档停止开发 创建集群命令 可以看到,经典版用于早期的docker,并且不是内置命令 项目地址 https://g

    2024年02月06日
    浏览(49)
  • idea 没有 add framework support(添加框架支持)选项

    在我的idea中项目右键,发现没有添加项目支持这个选项 解决方案 参考贴吧老哥的分享,成功解决。 原贴地址 1.打开idea文件 2.点击设置 3.点击外观与行为 4.点击菜单与工具栏 5.点击项目视图弹出窗口菜单 6.点击新建(没有点击新建就点击右上角小加号添加不了) 7.点击右上角小

    2024年03月17日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包