模型转换案例学习:等效替换不支持算子

文章介绍

       Qualcomm Neural Processing SDK (以下简称SNPE)支持Caffe、ONNX、PyTorch和TensorFlow等不同ML框架的算子。对于某些特定的不支持的算子,我们介绍一种算子等效替换的方法来完成模型转换。本案例来源于https://github.com/quic/qidk/tree/master/Model-Enablement/Model-Conversion-Layer-Replacement

以PyTorch  MobilenetV3模型转换SNPE DLC的过程为例子,介绍如何使用等效算子替换的方法达成不支持算子的转换

前置条件

  • SNPE-2.7.x-PC上下载并设置好SNPE

相关步骤参考Snapdragon Neural Processing Engine SDK: SNPE Setup

  • python version 3.6.x and 3.8.x
  • Torch version 1.10
  • 安装pip install jupyter
  • 一台Linux机器
  • 高通Snapdragon 安卓手机,推荐Snapdragon® 8 Gen 2系列手机

特别注意:Qualcomm Neural Processing SDK需要python 3.6版本,型号repo需要python 3.8版本。因此,建议使用两个不同的虚拟环境。

操作步骤:

一、获取模型

1. 运行以下命令获取模型:

cd generatedModels

 wget https://download.pytorch.org/models/mobilenet_v3_large-8738ca79.pth

2. 现在,我们将使用MobileNetV3的Pytorch模型来获得ONNX模型。我们通常建议使用这种方法从pytorch模型生成dlc,方法是先转换为onnx,然后再转换为dlc。

运行getModel.py生成ONNX文件:
python getModel.py

cd ..

3. 这将生成ONNX模型可以在generatedModels/ONNX/文件夹中找到。

4. 现在,我们可以将ONNX模型转换为DLC

 

二、模型转换错误信息

1. 注意:在继续操作之前,请确保generatedModels/ONNX/mobilenet_v3.ONNX文件存在。

2. 使用Qualcomm Neural Processing SDK检查模型到dlc的转换

snpe-onnx-to-dlc -i generatedModels/ONNX/mobilenet_v3.onnx -o generatedModels/ONNX/mobilenet_v3.dlc

3. 以上,我们可以看到“onnx_hardsigmoid”转换没有注册,这里将用我们自己的自定义harsigmoid实现来更改。

三、替换架构-Harsigmoid

1. 找到模型源文件。

<python3.8-packages>/torchvision/models/mobilenetv3.py。

2. 搜索Hardsigmoid的调用/实现。

3. 对该行进行注释,并使用新的CustomHardsigmoid调用添加新的代码行。

4. 正如我们所看到的,Hardsigmoid是从nn模块调用为nn.Hardsigmoid。因此,我们找到<python3.8_path>/site packages/torch/nn/dir来编写我们自己的CustomHardsigmoid实现。

5. Hardsigmoid是一个激活函数。因此,它位于nn/modules/activation.py文件中。

6. 在__all__变量中添加``CustomHardsigmoid```,即要定义的自定义函数的名称。

7. 在nn/modules/activation.py中实现您自己的CustomHardsigmoid。注意:SDK没有nn.Hardsigmoid的转换。因此,我们将以与SDK兼容的方式定义Hardsigmoid。

Hardsigmoid可以表示为- torch.clamp((input*0.167+0.5),0,1)

8. 参考如下CustomHardsigmoid的实现代码

https://github.com/quic/qidk/blob/master/Model-Enablement/Model-Conversion-Layer-Replacement/class/CustomHardsigmoid.py

class CustomHardsigmoid(Module):

    __constants__ = ['inplace']

    inplace: bool

    def __init__(self, inplace : bool = False)->None:   

        super().__init__()

        self.inplace = inplace

    def forward(self, input: Tensor, inplace: bool = False) -> Tensor:

        return torch.clamp((input*0.167+0.5), 0, 1)

9. 我们已经定义了自己的实现,现在我们将查找nn.Hardsigmoid的所有依赖项

10. 在同一torc/nn/modules/目录中,在__init__.py文件中添加CustomHarsigmoid调用。然后保存后继续操作

11. 到MobileNetV3目录,并使用新实现的Customhardsigmoid层转储模型。

python generatedModels/getModel.py

 

四、再次转换,分析错误

1. 将具有新实现的CustomHardsigmoid层的ONNX模型转换为dlc

  snpe-onnx-to-dlc -i generatedModels/ONNX/mobilenet_v3.onnx -o generatedModels/ONNX/mobilenet_v3.dlc

Error :

2. 我们得到了一个新的框架错误,说“onnx_hadswish”转换没有注册,我们现在将来更改hardswish的实现。

五、替换架构-Hardswish

1. 找到模型源文件。

<python3.8-packages>/torchvision/models/mobilenetv3.py

2. 搜索Hardswish的调用/实现

Occurrence-1

Occurrence-2

Occurrence-3

Occurrence-4

3. 注释所有这些行,并使用新的CustomHardswish调用添加新的代码行。

4. 正如我们所看到的,Hardswish是从nn模块调用为nn.Hardswish的,因此,我们将到<python3.8_path>/site packages/torch/nn/目录来编写我们自己的CustomHardswish实现。

5. Hardswish是一个激活函数。因此,它位于nn/modules/activation.py文件中。

6. 在__all__变量中添加``CustomHardswish```,即要定义的自定义函数的名称。

7. 在nn/modules/activation.py中实现您自己的CustomHardswish。注意:SDK没有nn.Hardswish的转换。因此,我们将以与SDK兼容的方式定义Hardsigmoid。

Hardswish可以定义为一个简化的表达式- input*torch.clamp(input+3, min=0, max=6)/6

8. 参考CustomHardswish的实现代码

https://github.com/quic/qidk/blob/master/Model-Enablement/Model-Conversion-Layer-Replacement/class/CustomHardswish.py

class CustomHardswish(Module):

    __constants__ = ['inplace']

    inplace: bool

    def __init__(self, inplace : bool = False) -> None:

        super().__init__()

        self.inplace = inplace

    def forward(self, input: Tensor) -> Tensor:

        return input*torch.clamp(input+3, min=0,max=6)/6

9. 我们已经定义了自己的实现,现在我们将查找nn.Hardswish的所有依赖项。

10. 在同一torch/nn/modules/目录中,在__init.py文件中添加CustomHarswish调用,保存修改,继续下一步操作

11. 到MobileNetV3目录,并使用新实现的Customhardswish层转储模型。

   python generatedModels/getModel.py

 六、再次转换DLC

1. 将具有新实现的CustomHardswish以及CustomHardsigmoid层的ONNX模型转换为dlc

snpe-onnx-to-dlc -i generatedModels/ONNX/mobilenet_v3.onnx -o generatedModels/ONNX/mobilenet_v3.dlc

2. 现在,我们可以使用snpe-onx-to-dlc将ONNX模型转换为dlc。

最后我们完成了DLC模型的转换

作者:高通工程师,戴忠忠(Zhongzhong Dai)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leo赠书活动-17期 《基础软件之路:企业级实践及开源之路》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

​LeetCode解法汇总106. 从中序与后序遍历序列构造二叉树

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给定两个…

【python】python入门之条件判断及某些报错的含义

目录 示例 细节报错​编辑 判断符号 嵌套判断 示例 mood int(input()) if mood > 60:print("happy!!") else:print("just so so") 通过示例看出&#xff0c;python的写法和c的区别不是很大&#xff0c;if和else都作为条件判断的函数来使用&…

华为OD机试真题C卷-篇4

200分值题 可以处理的最大任务员工派遣快递员的烦恼符号运算伐木工反射计数分披萨推荐多样性贪心的歌手螺旋数组矩阵(100) 可以处理的最大任务 有一个tasks任务列表&#xff0c;需要处理其中的任务&#xff1b;tasks[i] [si, ei]&#xff0c;该任务可以在si<day<ei之间…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现原理…

mp4转换成mp3,三种方法教你提取视频中的音乐

在日常生活中&#xff0c;我们经常会遇到想要从某个MP4视频中提取出背景音乐或对话的情况。将视频转换为MP3格式&#xff0c;不仅方便我们在各种设备上播放&#xff0c;还能节省存储空间。然而&#xff0c;对于不熟悉视频处理的人来说&#xff0c;这可能是一个挑战。 幸运的是…

深入解析SDRAM:从工作原理到实际应用

深入解析SDRAM&#xff1a;从工作原理到实际应用 在众多内存技术中&#xff0c;同步动态随机访问存储器&#xff08;SDRAM&#xff09;因其出色的性能和广泛的应用而备受关注。本文将从SDRAM的工作原理入手&#xff0c;探讨其性能优化策略和在现代电子设备中的应用。 SDRAM工作…

【码银送书第十二期】世界顶级名校计算机专业,都在用哪些书当教材?

清华、北大、MIT、CMU、斯坦福的学霸们在新学期里要学什么&#xff1f;今天我们来盘点一下那些世界名校计算机专业采用的教材。 01《深入理解计算机系统》 &#xff08;原书第3版&#xff09; 作者&#xff1a;兰德尔 E.布莱恩特 大卫 R. 奥哈拉伦 推荐理由&#xff1a;卡内基…

小果金融数据库程序---支持第三方库,提供程序

我这几天把程序打包了程序完全支持第三方库调用服务器数据&#xff0c;我简单的写了一些例子api&#xff0c;可以完全利用代码调用数据 点击数据界面的结果 随便点击一个数据 或到的数据 可以在文件夹下面的数据看到&#xff0c;自动下载 比如点击可转债热度 数据表自动下载 强…

阿里巴巴中国站获得淘口令真实url API(1688.item_password)

阿里巴巴&#xff08;1688.com&#xff09;是一个B2B电商平台&#xff0c;而淘口令&#xff08;或称为淘宝口令&#xff09;是一种在阿里巴巴集团旗下的淘宝和天猫平台中分享商品或活动链接的特殊形式。淘口令通常包含一串字符&#xff0c;用户可以复制这串字符并在淘宝或天猫的…

2.21 Qt day2 菜单栏/工具栏/状态栏/浮动窗口、UI界面、信号与槽

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;…

怎么做微信拼团_重塑社交购物新体验

微信拼团&#xff0c;重塑社交购物新体验 在当今社会&#xff0c;随着互联网的深入发展&#xff0c;人们的购物方式也在发生翻天覆地的变化。从最初的实体店购物&#xff0c;到后来的电商平台购物&#xff0c;再到现在的社交电商&#xff0c;每一次变革都为我们带来了前所未有…