0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenCV学堂 来源:OpenCV学堂 2023-06-27 16:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

背景

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

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

bdd45d18-14c1-11ee-962d-dac502259ad0.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 前端有以下特点:

bded37a2-14c1-11ee-962d-dac502259ad0.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

· listortuplewith tensors (openvino.runtime.Tensor/torch.Tensor/np.ndarray)

· dictionarywhere 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"Thesamemeaning:{'yes'ifresult==1else'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 . Thesamemeaning: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 模型的转换。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    3649

    浏览量

    51713
  • 深度学习
    +关注

    关注

    73

    文章

    5590

    浏览量

    123907
  • pytorch
    +关注

    关注

    2

    文章

    813

    浏览量

    14699

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

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么Caffe模型可以直接OpenVINO™工具套件推断引擎API一起使用,而无法转换为中间表示 (IR)?

    推断 Caffe 模型直接基于 英特尔® 神经电脑棒 2 (英特尔® NCS2)。 无法确定为什么 Caffe 模型可以直接OpenVINO
    发表于 03-05 06:31

    使用OpenVINO™ 2021.4将经过训练的自定义PyTorch模型加载为IR格式时遇到错误怎么解决?

    使用 OpenVINO™ 2021.4 将经过训练的自定义 PyTorch 模型加载为 IR 格式时遇到错误: RuntimeError: [ GENERAL_ERROR ] Failed
    发表于 03-05 08:40

    如何使用OpenVINO™运行对象检测模型

    无法确定如何使用OpenVINO™运行对象检测模型
    发表于 03-06 07:20

    原厂直供TF卡、SD卡、U盘

    `本司自主品牌:偲鸽; 看图说话,只做正品,价格优美! 避免中间商差价,现原厂直供,需要的朋友滴滴曹生***,拿样测试!`
    发表于 03-19 11:03

    怎样使用PyTorch Hub去加载YOLOv5模型

    使用 PyTorch Hub 加载自定义 20 类VOC训练的YOLOv5s 模型'best.pt'。TensorRT、ONNX 和 OpenVINO 模型
    发表于 07-22 16:02

    Pytorch模型转换为DeepViewRT模型时出错怎么解决?

    的 ONNX 模型。 但是,转换过程终止时出现一条无用的错误消息:“ \'NoneType\' 类型的对象没有 len() ”。 进行转换时,我使用了 eIQ 门户中的模型工具。
    发表于 06-09 06:42

    如何将PyTorch模型OpenVINO trade结合使用?

    无法确定如何转换 PyTorch 掩码 R-CNN 模型以配合OpenVINO™使用。
    发表于 08-15 07:04

    没有中间商差价 笔记本机械革命S1官网神劵低价巨给力

    资本驱动的消费市场,是通过一级一级利益剥削维持运作的。用咱们老百姓的话讲,10块钱的东西从厂子里出来,让中间商倒卖几手就成了20块,批发的货永远比零售的便宜,也是这个道理。一般的日用消耗品都是
    发表于 06-29 10:27 1161次阅读

    AMD官方开始直卖显卡及处理器

    “开张了,开张了,AMD官方直卖网上线,没有中间商差价”……
    发表于 07-12 15:36 2095次阅读

    英伟达和AMD等厂商直接销售新产品并砍掉中间商

    PS5、XSX和新30系显卡的热销以及疫情影响下的供货不足,导致了大量黄牛的出现,将新硬件的价格炒高。近日,id Software的联合创始人John Carmack认为,鉴于全球硬件短缺,为了透明起见,索尼、微软、英伟达和AMD这些大厂应该直接销售新产品,并砍掉中间商
    的头像 发表于 02-22 09:16 1726次阅读

    大牛建议厂商可砍掉中间商直接销售显卡等

    PS5、XSX和新30系显卡的热销以及疫情影响下的供货不足,导致了大量黄牛的出现,将新硬件的价格炒高。近日,id Software的联合创始人John Carmack认为,鉴于全球硬件短缺,为了透明起见,索尼、微软、英伟达和AMD这些大厂应该直接销售新产品,并砍掉中间商
    的头像 发表于 02-22 10:58 1684次阅读

    解析OpenVINO™ + SSD 实时对象检测

    。 SSD对象检测模型 对象检测是计算机视觉核心任务之一,也是最常见与应用最广泛的视觉场景。OpenVINO 已经提供了以下通用场景下的对象
    的头像 发表于 05-18 09:35 2492次阅读
    解析<b class='flag-5'>OpenVINO</b>™ + SSD 实时<b class='flag-5'>对象</b>检测

    自训练Pytorch模型使用OpenVINO™优化并部署在AI爱克斯开发板

    本文章将依次介绍如何将 Pytorch 自训练模型经过一系列变换变成 OpenVINO IR 模型形式,而后使用 OpenVINO Pyth
    的头像 发表于 05-26 10:23 1538次阅读
    自训练<b class='flag-5'>Pytorch</b><b class='flag-5'>模型</b>使用<b class='flag-5'>OpenVINO</b>™优化并部署在AI爱克斯开发板

    如何将Pytorch自训练模型变成OpenVINO IR模型形式

    本文章将依次介绍如何将Pytorch自训练模型经过一系列变换变成OpenVINO IR模型形式,而后使用OpenVINO Python AP
    的头像 发表于 06-07 09:31 3050次阅读
    如何将<b class='flag-5'>Pytorch</b>自训练<b class='flag-5'>模型</b>变成<b class='flag-5'>OpenVINO</b> IR<b class='flag-5'>模型</b>形式

    ETHERCAT和PROFINET的中间商,不差价,只传数据

    ETHERCAT和PROFINET的中间商,不差价,只传数据 在现代医院的数字化手术室中,手术床、无影灯、C型臂等设备的精准、稳定与协同运行,是保障手术成功、提升医疗效率的关键。这些设备往往
    的头像 发表于 10-30 14:23 122次阅读
    ETHERCAT和PROFINET的<b class='flag-5'>中间商</b>,不<b class='flag-5'>赚</b><b class='flag-5'>差价</b>,只传数据