CV11_模型部署pytorch轉ONNX

如果自己的模型中的一些算子,ONNX內部沒有,那么需要自己去實現。

1.1 配置環境

安裝ONNX

pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple

安裝推理引擎ONNX Runtime

?pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

以及其他包,pytorch,matplotlib,numpy,pandas,pillow,opencv-python,tqdm 等

1.2 將模型導出為ONNX格式

# Author:SiZhen
# Create: 2024/7/15
# Description: 
import onnx
import onnxruntime as ort
import torch
from model import resnet34 #導入模型
#print(onnx.__version__)
#print(ort.__version__)device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')model = resnet34().to(device)
model = model.eval().to(device)x = torch.randn(16,3,224,224).to(device)
output = model(x)
print(output.shape)
with torch.no_grad():torch.onnx.export(model, #要轉換的模型x, #模型的任意一組輸入'resNet34.onnx', #導出的ONNX文件名opset_version=11, #ONNX算子集版本input_names=['input'], #輸入Tensor的名稱 (自己起名字)output_names=['output'] #輸出Tensor的名稱 (自己起名字))

或者用我們自己的模型:

# Author:SiZhen
# Create: 2024/7/15
# Description:
import onnx
import onnxruntime as ort
import torch
from model import resnet34 #導入模型
#print(onnx.__version__)
#print(ort.__version__)device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')#model = resnet34().to(device)
model = torch.load('./resNet34.pth')
model = model.eval().to(device)x = torch.randn(16,3,224,224).to(device)
output = model(x)
print(output.shape)#生成ONNX格式模型權重文件
with torch.no_grad():torch.onnx.export(model, #要轉換的模型x, #模型的任意一組輸入'resNet34.onnx', #導出的ONNX文件名opset_version=11, #ONNX算子集版本input_names=['input'], #輸入Tensor的名稱 (自己起名字)output_names=['output'] #輸出Tensor的名稱 (自己起名字))#驗證模型導出成功
import onnx#讀取 ONNX模型
onnx_model = onnx.load('resNet34.onnx')#檢查模型格式是否正確
onnx.checker.check_model(onnx_model)
print('無錯誤')#以可讀的形式打印計算圖
print(onnx.helper.printable_graph(onnx_model.graph))

?運行結果出現一個ONNX格式的權重文件:

1.3 驗證ONNX模型導出成功

#驗證模型導出成功
import onnx#讀取 ONNX模型
onnx_model = onnx.load('resNet34.onnx')#檢查模型格式是否正確
onnx.checker.check_model(onnx_model)
print('無錯誤')

以可讀的形式打印計算圖:

#以可讀的形式打印計算圖
print(onnx.helper.printable_graph(onnx_model.graph))

用netron可視化onnx模型:

1.4 torch.onnx.export()的原理:

三篇詳細講解的博客:

鏈接1:https://zhuanlan.zhihu.com/p/477743341

鏈接2:https://zhuanlan.zhihu.com/p/479290520

鏈接3:https://zhuanlan.zhihu.com/p/498425043

NPU是什么

NPU,全稱為Neural Processing Unit,即神經網絡處理單元,是一種專門為加速人工智能(AI)任務,特別是深度學習和機器學習算法而設計的專用計算芯片。隨著AI技術的迅速發展,傳統的中央處理器(CPU)和圖形處理器(GPU)在處理復雜的神經網絡模型時逐漸顯得力不從心,特別是在移動設備和邊緣計算場景中,對低功耗和高效能的需求日益增長,NPU因此應運而生。

NPU的特點與優勢:

  1. 高度優化的架構:NPU的硬件架構針對神經網絡中的大規模并行計算進行了特別優化,擁有大量簡單但高效的計算核心,可以同時處理大量數據和執行復雜的矩陣運算,這對于諸如卷積神經網絡(CNN)、循環神經網絡(RNN)等深度學習模型尤為重要。

  2. 低功耗:相比CPU和GPU,NPU在處理相同AI任務時通常具有更低的能耗。這是因為其設計目標之一就是在保持高性能的同時減少能量消耗,這對于電池驅動的設備如智能手機、可穿戴設備尤為重要。

  3. 高速處理能力:NPU能夠顯著加快深度學習算法的運行速度,提升實時性,這對于需要即時反饋的應用場景,如語音識別、圖像識別、自然語言處理等,至關重要。

  4. 集成與定制化:NPU往往被集成到系統級芯片(SoC)中,與CPU、GPU等其他組件緊密協作,為特定的AI應用場景提供定制化的解決方案。這種集成設計可以減少數據在不同組件間傳輸的時間,進一步提高效率。

  5. 機器學習推理與訓練:NPU不僅適用于推理任務(即使用訓練好的模型進行預測),在一些高端的NPU設計中,也支持或專門用于模型訓練,盡管通常規模較小的訓練任務或模型微調更為常見。

應用場景:

  • 智能手機:提升拍照質量,實現即時的圖像識別、場景識別、人臉解鎖等功能。
  • 自動駕駛:處理傳感器數據,實現環境感知、物體識別和決策制定。
  • 物聯網設備:在智能家居、智能安防等場景中,進行本地數據分析,減少云端依賴,保護隱私。
  • 醫療健康:輔助診斷,實時分析醫療影像資料。
  • 邊緣計算:在靠近數據源的位置處理數據,減少延遲,提高數據處理效率。

結論:

NPU代表了AI時代硬件發展的新方向,它的出現使得終端設備能夠更高效、低耗地執行復雜的AI任務,推動了AI技術在日常生活中的廣泛應用,同時也預示著未來計算設備將更加智能化和個性化。隨著技術的不斷進步,NPU的功能和應用范圍預計將持續擴大,成為連接物理世界和智能世界的橋梁。

ONNX格式是什么

ONNX(Open Neural Network Exchange)是一種開放的神經網絡交換格式,旨在促進不同深度學習框架之間的模型互操作性。它是由微軟、亞馬遜、Facebook、IBM等科技巨頭共同發起和支持的項目,目的是簡化和標準化機器學習模型的轉移流程,使其能夠在不同的平臺和工具之間無縫遷移。

ONNX的核心特點和優勢:

  1. 兼容性廣泛:ONNX提供了一個統一的標準,使得模型可以從一個框架訓練后,輕松轉換到另一個框架進行推理,支持的框架包括但不限于PyTorch、TensorFlow、MXNet、Caffe2、Scikit-learn等。

  2. 中間表示格式:ONNX定義了一種中間層表示,這是一種平臺無關的模型描述方式。這意味著模型可以在不損失精度的情況下,從原始訓練框架轉換為ONNX格式,進而部署到支持ONNX的推理引擎中。

  3. 模型組成

    • Graph:ONNX模型的核心是一個計算圖(Graph),它描述了模型的計算流程,包括輸入、輸出以及中間的計算節點。
    • Node:計算圖中的每個節點(Node)代表一個特定的操作,如卷積、ReLU激活函數、矩陣乘法等。
    • Tensor:模型中的數據通過張量(Tensor)的形式表示,這些張量是多維數組,用作節點的輸入和輸出。
  4. 算子豐富性與模擬:為了增強兼容性,ONNX不斷擴展其算子庫,以支持更多的模型類型和復雜操作。對于一些不直接支持的復雜算子,ONNX會嘗試通過一系列基本算子的組合來模擬這些操作,確保模型轉換的成功率。

  5. 性能優化:雖然ONNX本身不直接提供推理引擎,但它被設計為可以與多種高性能推理引擎集成,如TensorRT、OpenVINO等,這些引擎可以針對特定硬件(如GPU、NPU)進行優化,從而提升模型推理的速度和效率。

  6. 社區支持與工具:ONNX擁有活躍的開發者社區,提供了豐富的工具鏈,包括模型轉換工具(如PyTorch的torch.onnx.export)、驗證工具、可視化工具等,便于模型的轉換、檢查和調試。

應用場景:

  • 模型遷移:研究者和開發者可以在不同框架間快速切換,比較不同框架下的模型性能。
  • 部署靈活性:模型可以部署到云服務、邊緣設備或移動設備上,適應不同的硬件環境。
  • 模型服務化:企業和服務提供商可以利用ONNX格式將模型整合進其產品中,便于維護和更新。

綜上所述,ONNX通過提供一個統一的模型表述方式,降低了模型在不同框架和平臺間遷移的障礙,促進了AI技術的普及和應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45549.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45549.shtml

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

相關文章

基于Java的斗地主游戲案例開發(做牌、洗牌、發牌、看牌

package Game;import java.util.ArrayList; import java.util.Collections;public class PokerGame01 {//牌盒//?3 ?3static ArrayList<String> list new ArrayList<>();//靜態代碼塊//特點&#xff1a;隨著類的加載而在加載的&#xff0c;而且只執行一次。stat…

底軟驅動 | C++內存相關

文章目錄 C內存相關C內存分區C對象的成員函數存放在內存哪里 堆和棧的區別堆和棧的訪問效率“野指針”有了malloc/free為什么還要new/deletealloca內存崩潰C內存泄漏的幾種情況內存對齊柔性數組參考推薦閱讀 C內存相關 本篇介紹了 C 內存相關的知識。 C內存分區 在C中&#…

力扣第八題——字符串轉換整數

題目介紹 請你來實現一個 myAtoi(string s) 函數&#xff0c;使其能將字符串轉換成一個 32 位有符號整數。 函數 myAtoi(string s) 的算法如下&#xff1a; 空格&#xff1a;讀入字符串并丟棄無用的前導空格&#xff08;" "&#xff09;符號&#xff1a;檢查下一個字…

TCP重傳、滑動窗口、流量控制、擁塞控制機制

目錄 1、TCP重傳機制超時重傳快速重傳 2、滑動窗口3、流量控制4、擁塞控制1、慢啟動2、擁塞避免3、擁塞發生 1、TCP重傳機制 TCP 針對數據包丟失的情況&#xff0c;會用重傳機制解決。 超時重傳 就是在發送數據時&#xff0c;設定一個定時器&#xff0c;當超過指定的時間還沒…

Ctrl+C、Ctrl+V、Ctrl+X 和 Ctrl+Z 的起源

注&#xff1a;機翻&#xff0c;未校對。 The Origins of CtrlC, CtrlV, CtrlX, and CtrlZ Explained We use them dozens of times a day: The CtrlZ, CtrlX, CtrlC, and CtrlV shortcuts that trigger Undo, Cut, Copy, and Paste. But where did they come from, and why do…

文件上傳接口

文章目錄 開發前端接口 開發前端接口 首先這個前端的文件上傳組件使用了,前端組件 首先這個接口不是一般的接口,這個接口可以提取出來,之后那里使用了,就直接放到哪里 所以這是一個萬能文件上傳接口 寫完之后選擇 頭像組件 在圖庫中添加組件 寫前端組件之后,寫了前端的組件…

Bootstrap 5 加載效果

Bootstrap 5 加載效果 Bootstrap 5 是一個流行的前端框架,它提供了豐富的組件和工具,用于快速開發響應式和移動優先的網頁。在本文中,我們將探討 Bootstrap 5 中的加載效果,包括如何實現它們以及它們在網頁設計中的作用。 什么是加載效果? 加載效果是在網頁或應用程序中…

k8s集群創建devops項目一直等待狀態,沒有發現host

問題分析&#xff1a; kubesphere在幫我們自動化創建一些智能自動化的額時候難免會發生一些小錯誤&#xff0c;devops-jenkins是一個部署也會生成一個容器組即pod&#xff0c;容器組的容器服務端口是 targetPort&#xff0c;容器組對外暴露的端口是port&#xff0c;拿devops-c…

[深度學習]基于yolov10+streamlit目標檢測演示系統設計

YOLOv10結合Streamlit構建的目標檢測系統&#xff0c;不僅極大地增強了實時目標識別的能力&#xff0c;還通過其直觀的用戶界面實現了對圖片、視頻乃至攝像頭輸入的無縫支持。該系統利用YOLOv10的高效檢測算法&#xff0c;能夠快速準確地識別圖像中的多個對象&#xff0c;并標注…

Billu_b0x靶機

信息收集 使用arp-scan 生成網絡接口地址來查看ip 輸入命令&#xff1a; arp-scan -l 可以查看到我們的目標ip為192.168.187.153 nmap掃描端口開放 輸入命令&#xff1a; nmap -min-rate 10000 -p- 192.168.187.153 可以看到開放2個端口 nmap掃描端口信息 輸入命令&…

配置PYTHONPATH環境變量

配置PYTHONPATH環境變量 前言Win系統臨時配置永久配置 Linux系統臨時配置永久配置 前言 在運行py腳本時不僅需要import官方庫&#xff0c;經常會import自己編寫的腳本&#xff0c;但此時會出現模塊找不到的如下報錯。解決方法是配置PYTHONPATH&#xff0c;下文介紹Win系統和Li…

禹神:一小時快速上手Electron,前端Electron開發教程,筆記。一篇文章入門Electron

一、Electron是什么 簡單的一句話&#xff0c;就是用htmlcssjsnodejs&#xff08;Native Api&#xff09;做兼容多個系統&#xff08;Windows、Linux、Mac&#xff09;的軟件。 官網解釋如下(有點像繞口令)&#xff1a; Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面…

Resources.Load返回null

Resources.Load返回null 在unity中Resources.Load從Assets下的任意Resources目錄下讀取資源&#xff0c;比如從Assets\Resources下讀取Cube&#xff08;預制體&#xff09;&#xff0c;當然也可以讀取其他資源 代碼為 GameObject prefab Resources.Load<GameObject>(…

微軟Edge瀏覽器深度解析:性能、安全性與特色功能全面評測

一、引言 自Windows 10操作系統推出以來&#xff0c;微軟Edge瀏覽器作為默認的網頁瀏覽器&#xff0c;憑借其現代化的設計和出色的性能表現&#xff0c;逐漸獲得了用戶的認可。本文旨在對Edge瀏覽器進行深入分析&#xff0c;探討其在多個方面的表現。 二、界面與操作體驗 界面…

在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01;&#x1f4da;領書&#xff1a;PostgreSQL 入門到精通.pdf 文章目錄 在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡&#xff1f;一、數據存儲優化&#x…

HTML表格表單及框架標簽

一.表格標簽 1.<table></table> 創建表格 2.<caption></caption> 表格的標題 3.<tr></tr>Table Row&#xff08;表格行&#xff09; 4.<td></td>Table Data&#xff08;表格數據&#xff09;其中有屬性rowspan"2&quo…

Linux操作系統——數據庫

數據庫 sun solaris gnu 1、分類&#xff1a; 大型 中型 小型 ORACLE MYSQL/MSSQL SQLITE DBII powdb 關系型數據庫 2、名詞&#xff1a; DB 數據庫 select update database DBMS 數據…

Go中的defer看似很簡單,實則一點都不難

Golang 中的 Defer 在Go語言中&#xff0c;defer語句用于將一個函數調用推遲到外圍函數返回之后執行。它常用于確保某些操作在函數結束時一定會執行&#xff0c;例如資源釋放、文件關閉等。 基本語法 defer語句的基本使用方法如下&#xff1a; func main() {defer fmt.Prin…

距離變換 Distance Transformation

以下為該學習地址的學習筆記&#xff1a;Distance transformation in image - Python OpenCV - GeeksforGeeks 其他學習資料&#xff1a;Morphology - Distance Transform 簡介 距離變換是一種用于計算圖像中每個像素與最近的非零像素之間距離的技術。它通常用于圖像分割和物體…

51單片機5(GPIO簡介)

一、序言&#xff1a;不論學習什么單片機&#xff0c;最簡單的外設莫過于I口的高低電平的操作&#xff0c;接下來&#xff0c;我們將給大家介紹一下如何在創建好的工程模板上面&#xff0c;通過控制51單片機的GPIO來使我們的開發板上的LED來點亮。 二、51單片機GPIO介紹&#…