当前位置: 首页 > news >正文

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

文章介绍

       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)

相关文章:

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

文章介绍 Qualcomm Neural Processing SDK &#xff08;以下简称SNPE&#xff09;支持Caffe、ONNX、PyTorch和TensorFlow等不同ML框架的算子。对于某些特定的不支持的算子&#xff0c;我们介绍一种算子等效替换的方法来完成模型转换。本案例来源于https://github.com/quic/qidk…...

js 数组排序的方式

var numberList [5, 100, 94, 71, 49, 36, 2, 4]; 冒泡排序&#xff1a; 相邻的数据进行两两比较&#xff0c;小数放在前面&#xff0c;大数放在后面&#xff0c;这样一趟下来&#xff0c;最小的数就被排在了第一位&#xff0c;第二趟也是如此&#xff0c;如此类推&#xff0…...

手机连接电脑后资源管理器无法识别(识别设备但无法访问文件)

问题描述 小米8刷了pixel experience系统,今天用电脑连接后无法访问手机文件,但是手机选择了usb传输模式为文件传输 解决办法 在设备和打印机页面中右键选择属性 点击改变设置 卸载驱动,注意勾选删除设备的驱动程序软件 卸载后重新连接手机,电脑弹出希望对设备进行什么操作时…...

安装unget包 sqlsugar时报错,完整的报错解决

前置 .net6的开发环境 问题 ? 打开unget官网&#xff0c;搜索报错的依赖Oracle.ManagedDataAccess.Core unget官网 通过unget搜索Oracle.ManagedDataAccess.Core查看该依赖的依赖 发现应该是需要的依赖Oracle.ManagedDataAccess.Core(>3.21.100)不支持.net6的环境 解…...

oracle数据库事务的四大特性与隔离级别与游标

数据库事务的四大特性: 这里提到了 ACID 四个特性&#xff0c;分别是&#xff1a; A&#xff08;Atomicity&#xff09;&#xff1a; 原子性&#xff0c;确保事务中的所有操作要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不存在部分执行的情况。 C&#xff08;…...

Day25--learning English

一、积累 1.crab 2.scrape 3.crude 4.infect 5.blinds 6.plunk 7.fart 8.expel 9.stamp 10.tongs 11.utensil 12.sticky 13.yolk 14.snap 15.fuzz 16.chuck 17.hamper 18.panel 19.prod 20.eyebrow 二、练习 1.牛津原译 scrape /skreɪp/ REMOVE 除去 1.to remove sth from…...

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…...

第六十六天 API安全-接口安全阿里云KEY%postmanDVWSXEE鉴权泄露

第66天 API安全-接口安全&阿里云KEY%postman&DVWS&XEE&鉴权&泄露 知识点 1.HTTP类接口-测评 2.RPC类接口-测评 3.Web Service类-测评 参考链接&#xff1a;https://www.jianshu.com/p/e48db27d7c70 内容点&#xff1a; SOAP(Simple Object Access Prot…...

在Vue3 + Vite项目中使用less

在Vue3 Vite项目中使用less&#xff0c;需要安装less和less-loader两个依赖。 首先&#xff0c;在项目根目录下执行以下命令安装less和less-loader&#xff1a; npm install less less-loader --save-dev安装完成后&#xff0c;在vite.config.js配置文件中添加以下代码&…...

this的指向问题总结

this一般会出现在函数里面&#xff0c;但是一般情况下只有在函数被调用执行时&#xff0c;才能确定this指向哪个对象。一般情况下this是指调用函数的对象。 1.在全局作用域下或者普通函数中this的指向一般都是window对象 window.fn&#xff08;&#xff09;&#xff0c;普通函…...

jQuery的应用(二)

对上一节内容的补充。 jQuery选择器 jQuery选择器类似于CSS选择器,用来选取网页中的元素 jQuery选择器功能强大,种类也很多,分类如下 通过CSS选择器选取元素: 基本选择器层次选择器属性选择器通过过滤选择器选择元素: 基本过滤选择器可见性过滤选择器表单对象过滤选择器…...

芋道源码(yudao)跳转新页面的几种方式

芋道源码&#xff08;yudao&#xff09;跳转新页面的几种方式 导入useRouter const { push, replace, resolve } useRouter() 当前页面跳转 const goToPage (url: string) > {url push(/hot163) }当前页面跳转 const goToPage (url: string) > {url resolve(/h…...

Open AI — Sora 如何发挥其魔力 — 近距离观察该技术

OpenAI 的大模型 Sora 可以制作一整分钟的高质量视频。他们的工作成果表明,使视频生成模型更大是为现实世界创建多功能模拟器的好方法。Sora 是一种灵活的可视化数据模型。它可以创建不同长度、形状和大小的视频和图片,甚至可以创建长达一分钟的高清视频。我阅读了 OpenAI 的…...

密码解密 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一段 “密文”字符串 s &#xff0c;其中字符都是经过 “密码本” 映射的&#xff0c;现需要将“密文”解密并且输出。 映射的规则&#xff1a; ( a−i ) 分…...

【深度学习】Pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~四维张量;conv3d~五维张量)

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…...

Autosar-Mcal配置详解-GPT

3.3.1添加GPT模块 方法与添加Dio相似&#xff0c;可参加Dio模块添加方法。 3.3.2 创建、配置GPT通道 1)根据需求创建GPT通道&#xff08;即创建几个定时器&#xff09; 本例中创建了3个定时器通道&#xff1a;1ms&#xff0c;100us&#xff0c;OsTimer。 2)配置GPT通道 配置T…...

前端面试问题(jwt/布局/vue数组下标/扁平化/菜单树形/url api/新版本)

前端面试问题(jwt/布局/vue数组下标/扁平化/菜单树形/url api/新版本) 1. jwt鉴权逻辑 前端 JWT 鉴权逻辑通常涉及在发起请求时携带 JWT&#xff0c;并在接收到响应后处理可能的授权问题。 1. 用户登录&#xff1a; 用户提供凭证&#xff1a; 用户在登录界面输入用户名和密码…...

Learn HTML in 1 hour

website address https://www.youtube.com/watch?vHD13eq_Pmp8 excerpt All right, what’s going on? everybody. It’s your Bro, hope you’re doing well, and in this video I’m going to help you started with html; so sit back, relax and enjoy the show. If y…...

HashMap的put方法执行过程

根据Key通过哈希算法与与运算得出数组下标如果数组下标位置元素为空&#xff0c;则将key和value封装为Entry对象&#xff08;JDK1.7中是Entry对象&#xff0c;JDK1.8中 是Node对象&#xff09;并放⼊该位置如果数组下标位置元素不为空&#xff0c;则要分情况讨论 a. 如果是JDK1…...

一、直方图相关学习

目录 1、灰度直方图1.1 基本概念和作用1.2 代码示例 2、BGR直方图2.1 基本概念和作用2.2 代码示例 3、灰度直方图均衡1. 基本概念和作用2. 代码示例 4、直方图变换&#xff08;查找&#xff09;4.1 基本概念和作用4.2 代码示例 5、直方图匹配5.1 基本概念和作用5.2 代码示例 6、…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...

iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)

崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题&#xff0c;不一定会立刻崩&#xff0c;但一旦积累&#xff0c;就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能&#xff0c;而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...

codeforces C. Cool Partition

目录 题目简述&#xff1a; 思路&#xff1a; 总代码&#xff1a; https://codeforces.com/contest/2117/problem/C 题目简述&#xff1a; 给定一个整数数组&#xff0c;现要求你对数组进行分割&#xff0c;但需满足条件&#xff1a;前一个子数组中的值必须在后一个子数组中…...

Go 并发编程基础:select 多路复用

select 是 Go 并发编程中非常强大的语法结构&#xff0c;它允许程序同时等待多个通道操作的完成&#xff0c;从而实现多路复用机制&#xff0c;是协程调度、超时控制、通道竞争等场景的核心工具。 一、什么是 select select 类似于 switch 语句&#xff0c;但它用于监听多个通…...

【芯片仿真中的X值:隐藏的陷阱与应对之道】

在芯片设计的世界里&#xff0c;X值&#xff08;不定态&#xff09;就像一个潜伏的幽灵。它可能让仿真测试顺利通过&#xff0c;却在芯片流片后引发灾难性后果。本文将揭开X值的本质&#xff0c;探讨其危害&#xff0c;并分享高效调试与预防的实战经验。    一、X值的本质与致…...