如何在OpenVINO中实现自己的自定义算子 – 第一篇:搞定模型转换

前言

与主流的深度学习框架类似,OpenVINO也提供一套扩展机制,方便开发者可以实现自己的自定义算子。自定义算子有如下三种使用场景:

  • 模型中含有MO不支持的算子,但该算子可以通过已支持算子的组合实现,这时自定义算子实际上完成的是将“不支持的算子”替换为“支持算子”的实现。
  • 模型中含有的子图可以被替换为性能更佳的其它等价运算,这种操作被OpenVINO称为”Fuse”(融合)。举例来讲,比如Swish操作,就会被等价替换为计算式:x/(1.0+e^{^{-(beta*x)}})
  • 模型中含有原生框架的自定义算子,比如本文中就会利用tf实现一个叫ZeroOut的自定义算子,这个算子在tf里作了自定义实现。同时,在MO里就需要定义一个同样的ZeroOut自定义算子,从而让MO可以认识ZeroOut算子。

对普通开发者而言,第3种情况是最常遇见的 – 因为原生框架不支持而不得不自己实现 – 实际上不管哪种情况实现原理都是一样的,下面就讲讲我自己是怎么实现的。

准备工作

我使用的环境为:Ubuntu18.04, OpenVINO2021.2, tf1.15.2

在开始之前,首先需要准备好一个含有ZeroOut算子的网络模型,这里我实现了一个空的网络并进行了冻结,pb文件可以从这里下载:https://github.com/cosmos1982/OpenVINO_Demos/blob/master/custom-layer/create_tf_model/tf_model/frozen_inference_graph.pb

ZeroOut的数学公式和实现,参考tf官网:https://www.tensorflow.org/guide/create_op?hl=zh-cn

在什么也不修改的情况下,我使用MO进行模型转换,转换命令:

mo.py -m frozen_graph.pb -o ir/FP32/

会得到如下错误:

Model Optimizer version:        2021.2.0-1877-176bdf51370-releases/2021/2
[ ERROR ]  Cannot infer shapes or values for node "ModZeroOut/Zeroout/zero_ou
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
OpenVINO可以将动态batchsize的ONNX模型转换为其支持的静态batchsize的模型。下面是一种实现方式: 首先,安装OpenVINO工具包,并将模型优化器(Model Optimizer)集成到环境。该工具用于将ONNX模型转换OpenVINO可以加载和推理的IR模型。 在转换ONNX模型之前,我们需要了解该模型的动态输入形状。通常,动态batchsize的模型在网络的输入节点上会标记为-1或None。我们可以使用ONNX Runtime库来动态推理模型并获取输入形状。 下一步是使用Model Optimizer将ONNX模型转换为IR模型。为了支持静态batchsize,我们需要在转换过程指定batch参数。命令行示例如下: ``` python mo.py --input_model model.onnx --output_dir output --input_shape [B,C,H,W] --mean_values [mean_values] --scale_values [scale_values] --batch B ``` 在命令行,我们需要提供转换的ONNX模型,输出目录,输入形状,均值和缩放值。重要的是,在输入形状指定batch维度并将其设置为所需的静态batchsize。 完成转换后,我们可以使用OpenVINO进行推理,输入静态batchsize的数据进行推理。 需要注意的是,在转换和推理过程,我们需要确保模型和数据的形状匹配,以避免错误发生。如果需要批量推理,可以使用循环迭代每个批量进行推理。 这就是使用OpenVINO将动态batchsize的ONNX模型转换为静态batchsize模型的简要步骤。通过这种方式,我们可以使用OpenVINO对不同大小的批量进行高效推理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值