模型轉換案例學習:等效替換不支持算子

文章介紹

?????? 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.pswp.cn/news/696400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696400.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

并發編程(2)基礎篇-管程

4 共享模型之管程 本章內容 共享問題synchronized線程安全分析Monitorwait/notify線程狀態轉換活躍性Lock 4.1 共享帶來的問題 4.1.1 小故事 老王&#xff08;操作系統&#xff09;有一個功能強大的算盤&#xff08;CPU&#xff09;&#xff0c;現在想把它租出去&#xff…

基礎小白快速入門Python->Python中的類

什么是類&#xff1f; 在編程語言中&#xff0c;類&#xff08;Class&#xff09;是一個用于創建對象的藍圖或模板。它定義了對象的屬性&#xff08;也稱為成員變量&#xff09;和方法&#xff08;也稱為成員函數&#xff09;。類是面向對象編程&#xff08;OOP&#xff09;的…

2024 全國水科技大會暨第二屆智慧水環境管理與技術創新論壇

論壇二&#xff1a;第二屆智慧水環境管理與技術創新論壇 召集人&#xff1a;劉炳義 武漢大學智慧水業研究所所長、教授 為貫徹落實中共中央國務院印發《數字中國建設整體布局規劃》和國務院關于印發《“十四五”數字經濟發展規劃》的通知&#xff0c;推動生態環境智慧治理&…

L2 清點代碼庫----PTA(疑問)

上圖轉自新浪微博&#xff1a;“阿里代碼庫有幾億行代碼&#xff0c;但其中有很多功能重復的代碼&#xff0c;比如單單快排就被重寫了幾百遍。請設計一個程序&#xff0c;能夠將代碼庫中所有功能重復的代碼找出。各位大佬有啥想法&#xff0c;我當時就懵了&#xff0c;然后就掛…

docker pullpush 生成鏡像文件并push 到阿里云

pull docker docker pull ultralytics/ultralytics # 拉取yolov8的鏡像倉庫 docker run -it ultralytics/ultralytics # 運行鏡像 conda create -n gsafety python3.8 # 創建環境 source activate gsafety # 激活環境 pip install -i https://pypi.tuna.tsinghua.edu.cn/simp…

糖尿病性視網膜病變(DR)的自動化檢測和分期

糖尿病性視網膜病變&#xff08;DR&#xff09;的自動化檢測和分期 提出背景DR的階段及其特征 歷年解法計算機視覺方法多分類方法 新的解法深度學習方法遷移學習大模型多模型集成全流程分析 總結特征1&#xff1a;圖像分割特征2&#xff1a;疾病分級特征3&#xff1a;治療建議生…

開源模型應用落地-工具使用篇-獲取文本向量(五)

一、前言 在之前學習的"開源模型應用落地-工具使用篇"系列文章中&#xff0c;我們已經學會了如何使用向量數據庫。然而&#xff0c;還有一個問題一直未解決&#xff0c;那就是如何處理文本向量。在本文中&#xff0c;我們將繼續深入學習關于向量的知識&#xff0c;特…

Redis的哨兵系統

Redis 哨兵&#xff08;Sentinel&#xff09;系統是一種用于管理多個 Redis 服務器的系統&#xff0c;其主要目標是提供監控、通知、自動故障轉移和服務發現功能。哨兵系統能夠在 Redis 實例出現問題時自動進行故障轉移&#xff0c;確保系統的高可用性。其工作原理如下&#xf…

常見消息中間件

ActiveMQ 我們先看ActiveMQ。其實一般早些的項目需要引入消息中間件&#xff0c;都是使用的這個MQ&#xff0c;但是現在用的確實不多了&#xff0c;說白了就是有些過時了。我們去它的官網看一看&#xff0c;你會發現官網已經不活躍了&#xff0c;好久才會更新一次。 它的單機吞…

2024年學習的最高薪酬編程語言

2024年學習的最高薪酬編程語言 10. Scala Scala是一種在Java虛擬機&#xff08;JVM&#xff09;上運行的函數式編程語言。它通常用于大數據處理、機器學習和后端Web開發。 關于Scala編程語言及其常見用途的要點如下&#xff1a; Scala是一種通用編程語言&#xff0c;運行在J…

mac真的安裝不了vmware嗎 mac如何安裝crossover crossover序列號從哪里買 購買正版渠道

有些用戶可能想在mac上運行一些只能在windows上運行的軟件&#xff0c;比如游戲、專業軟件等。這時候&#xff0c;就需要用到虛擬機技術&#xff0c;也就是在mac上安裝一個可以模擬其他操作系統的軟件&#xff0c;比如vmware或者crossover。那么&#xff0c;mac真的安裝不了vmw…

2024年華為OD機試真題-貪心歌手-Python-OD統一考試(C卷)

題目描述: 一個歌手準備從A城去B城參加演出。 1) 按照合同,他必須在T天內趕到。 3) 歌手不能往回走。 4) 每兩座城市之間需要的天數都可以提前獲知。 5) 歌手在每座城市都可以在路邊賣唱賺錢。經過調…

【前端素材】推薦優質后臺管理系統Xoric平臺模板(附源碼)

一、需求分析 當我們從多個層次來詳細分析后臺管理系統時&#xff0c;可以將其功能和定義進一步細分&#xff0c;以便更好地理解其在不同方面的作用和實際運作。 1. 功能層次 a. 用戶管理功能&#xff1a; 用戶注冊和登錄&#xff1a;管理用戶賬戶的注冊和登錄過程。權限管…

K8S故障處理指南:網絡問題排查思路

1. 前言 對于私有化環境&#xff0c;客戶的網絡架構&#xff0c;使用的云平臺存在著各種差異&#xff0c;K8S網絡可能會出現各種問題&#xff0c;此文著重講解遇到此種問題的排查方法和思路&#xff0c;不會涉及相關網絡底層技術描述. 環境說明 由于我們的k8s網絡組件默認使…

5.網絡游戲逆向分析與漏洞攻防-游戲網絡架構逆向分析-測試需求與需求拆解

內容參考于&#xff1a;易道云信息技術研究院VIP課 上一個內容&#xff1a;模擬游戲登陸器啟動游戲并且完成注入 首先正常分析軟件程序有沒有漏洞&#xff0c;需要通過它的操作侵入&#xff0c;比如買東西&#xff0c;就通過買東西的按鈕它背后有源代碼就看源代碼&#xff0c…

TypeScript學習筆記-基礎

一、type 和 interface type和 interface的區別&#xff1a;TypeScript 中文網: 文檔 - 日常類型 type類型別名和interface接口非常相似&#xff0c;在很多情況下可以在它們之間自由選擇。interface 的幾乎所有功能都在 type 中可用&#xff0c;主要區別在于無法重新打開類型…

【PythonGIS】基于Python融合矢量數據(多面合一)

之前發過使用批量合并矢量數據的文章&#xff1a;【Python&GIS】基于Python批量合并矢量數據&#xff0c;正好前段時間有需求把矢量數據進行融合&#xff0c;然后就編了一段融合矢量數據的代碼。今天就和大家分享一下如何使用Python對矢量數據實現融合的操作。 1.定義 首先…

基于Embedding召回和DSSM雙塔模型

文章目錄 基于Embedding召回介紹基于Embedding召回算法分類I2I召回U2I召回 DSSM模型DSSM雙塔模型層次 基于Embedding召回介紹 基于embedding的召回是從內容文本信息和用戶查詢的角度出發&#xff0c;利用預訓練的詞向量模型或深度學習模型&#xff0c;將文本信息轉換成向量進行…

三、創建腳手架和腳手架分析

三、創建腳手架 一、環境準備 1、安裝node.js **下載地址&#xff1a;**https://nodejs.org/zh-cn/界面展示 2、檢查node.js版本 查看版本的兩種方式 node -vnode -version 出現版本號則說明安裝成功&#xff08;最新的以官網為準&#xff09; 3、為了提高我們的效率&…

深度學習從入門到不想放棄-7

上一章的內容 深度學習從入門到不想放棄-6 (qq.com) 今天講的也算基礎(這個系列后來我一尋思,全是基礎 ),但是可能要著重說下,今天講前向計算和反向傳播,在哪兒它都永遠是核心,不管面對什么模型 前向計算: 有的叫也叫正向傳播,正向計算的,有的直接把前向的方法梯度下…