如果自己的模型中的一些算子,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的特點與優勢:
-
高度優化的架構:NPU的硬件架構針對神經網絡中的大規模并行計算進行了特別優化,擁有大量簡單但高效的計算核心,可以同時處理大量數據和執行復雜的矩陣運算,這對于諸如卷積神經網絡(CNN)、循環神經網絡(RNN)等深度學習模型尤為重要。
-
低功耗:相比CPU和GPU,NPU在處理相同AI任務時通常具有更低的能耗。這是因為其設計目標之一就是在保持高性能的同時減少能量消耗,這對于電池驅動的設備如智能手機、可穿戴設備尤為重要。
-
高速處理能力:NPU能夠顯著加快深度學習算法的運行速度,提升實時性,這對于需要即時反饋的應用場景,如語音識別、圖像識別、自然語言處理等,至關重要。
-
集成與定制化:NPU往往被集成到系統級芯片(SoC)中,與CPU、GPU等其他組件緊密協作,為特定的AI應用場景提供定制化的解決方案。這種集成設計可以減少數據在不同組件間傳輸的時間,進一步提高效率。
-
機器學習推理與訓練:NPU不僅適用于推理任務(即使用訓練好的模型進行預測),在一些高端的NPU設計中,也支持或專門用于模型訓練,盡管通常規模較小的訓練任務或模型微調更為常見。
應用場景:
- 智能手機:提升拍照質量,實現即時的圖像識別、場景識別、人臉解鎖等功能。
- 自動駕駛:處理傳感器數據,實現環境感知、物體識別和決策制定。
- 物聯網設備:在智能家居、智能安防等場景中,進行本地數據分析,減少云端依賴,保護隱私。
- 醫療健康:輔助診斷,實時分析醫療影像資料。
- 邊緣計算:在靠近數據源的位置處理數據,減少延遲,提高數據處理效率。
結論:
NPU代表了AI時代硬件發展的新方向,它的出現使得終端設備能夠更高效、低耗地執行復雜的AI任務,推動了AI技術在日常生活中的廣泛應用,同時也預示著未來計算設備將更加智能化和個性化。隨著技術的不斷進步,NPU的功能和應用范圍預計將持續擴大,成為連接物理世界和智能世界的橋梁。
ONNX格式是什么
ONNX(Open Neural Network Exchange)是一種開放的神經網絡交換格式,旨在促進不同深度學習框架之間的模型互操作性。它是由微軟、亞馬遜、Facebook、IBM等科技巨頭共同發起和支持的項目,目的是簡化和標準化機器學習模型的轉移流程,使其能夠在不同的平臺和工具之間無縫遷移。
ONNX的核心特點和優勢:
-
兼容性廣泛:ONNX提供了一個統一的標準,使得模型可以從一個框架訓練后,輕松轉換到另一個框架進行推理,支持的框架包括但不限于PyTorch、TensorFlow、MXNet、Caffe2、Scikit-learn等。
-
中間表示格式:ONNX定義了一種中間層表示,這是一種平臺無關的模型描述方式。這意味著模型可以在不損失精度的情況下,從原始訓練框架轉換為ONNX格式,進而部署到支持ONNX的推理引擎中。
-
模型組成:
- Graph:ONNX模型的核心是一個計算圖(Graph),它描述了模型的計算流程,包括輸入、輸出以及中間的計算節點。
- Node:計算圖中的每個節點(Node)代表一個特定的操作,如卷積、ReLU激活函數、矩陣乘法等。
- Tensor:模型中的數據通過張量(Tensor)的形式表示,這些張量是多維數組,用作節點的輸入和輸出。
-
算子豐富性與模擬:為了增強兼容性,ONNX不斷擴展其算子庫,以支持更多的模型類型和復雜操作。對于一些不直接支持的復雜算子,ONNX會嘗試通過一系列基本算子的組合來模擬這些操作,確保模型轉換的成功率。
-
性能優化:雖然ONNX本身不直接提供推理引擎,但它被設計為可以與多種高性能推理引擎集成,如TensorRT、OpenVINO等,這些引擎可以針對特定硬件(如GPU、NPU)進行優化,從而提升模型推理的速度和效率。
-
社區支持與工具:ONNX擁有活躍的開發者社區,提供了豐富的工具鏈,包括模型轉換工具(如PyTorch的
torch.onnx.export
)、驗證工具、可視化工具等,便于模型的轉換、檢查和調試。
應用場景:
- 模型遷移:研究者和開發者可以在不同框架間快速切換,比較不同框架下的模型性能。
- 部署靈活性:模型可以部署到云服務、邊緣設備或移動設備上,適應不同的硬件環境。
- 模型服務化:企業和服務提供商可以利用ONNX格式將模型整合進其產品中,便于維護和更新。
綜上所述,ONNX通過提供一個統一的模型表述方式,降低了模型在不同框架和平臺間遷移的障礙,促進了AI技術的普及和應用。