【pytorch模型轉onnx模型】一些模型轉化和加速推理的知識
來源:投稿 作者:王浩
編輯:學姐
最近,學習了一些模型轉化和加速推理的知識,本文是對學習成果的總結。
對模型的轉化,本文實現了pytorch模型轉onnx模型和onnx轉TensorRT,在轉為TensorRT模型的過程中,實現了模型單精度的壓縮。
對于加速推理,本文實現GPU環(huán)境下的onnxruntime推理、? TensorRT動態(tài)推理和TensorRT靜態(tài)推理。
希望本文能幫助大家。
環(huán)境配置
CUDA版本:11.3.1
cuDNN版本:8.2.1
TensorRT版本:8.0.3.4
顯卡:1650
pytorch:1.10.2
模型的轉化和推理對版本有要求,如果版本對應不上很可能出現千奇百怪的問題,所以我把我的版本信息列出來給大家做參考。
ONNX
ONNX,全稱: Open Neural Network Exchange(ONNX,開放神經網絡交換),是一個用于表 示深度學習模型的標準,可使模型在不同框架之間進行轉移。
ONNX是一種針對機器學習所設計的開放式的文件格式,用于存儲訓練好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存儲模型數據并交互。ONNX的規(guī)范及代碼主要由微軟,亞馬遜 ,Facebook 和 IBM 等公司共同開發(fā),以開放源代碼的方式托管在Github上。目前官方支持加載ONNX模型并進行推理的深度學習框架有:Caffe2, PyTorch,MXNet,ML.NET,TensorRT和Microsoft CNTK,并且TensorFlow也非官方的支持ONNX。---維基百科
onnx模型可以看作是模型轉化之間的中間模型,同時也是支持做推理的。一般來說,onnx的推理 速度要比pytorch快上一倍。
模型轉化
? ?
onnx模型轉換和推理需要安裝Python包,如下:
? ??
新建模型轉換腳本pytorch2onnx.py。
導入需要的包。
打印pytorch版本。
定義input_name和output_name變量。
定義輸入格式。
加載pytorch模型。
導出onnx模型,這里注意一下參數opset_version在8.X版本中設置為13,在7.X版本中設置為12。
yolov5中這么寫的。
查看轉化后的模型,如下圖:

推理的寫法有兩種,一種直接寫,另一種將其封裝為通用的推理類。
第一種推理寫法
先看第一種寫法,新建test_onnx.py,插入下面的代碼:
? ?
導入包
定義get_test_transform函數,實現圖像的歸一化和resize。
讀取圖像
??
對圖像做resize和歸一化。
增加一維batchsize。
將圖片轉為數組。
定義onnx_model_path模型的路徑。
加載onnx模型。
定義輸入。
執(zhí)行推理。
獲取預測結果。
到這里第一種寫法就完成了,是不是很簡單,接下來看第二種寫法。
第二種推理寫法
新建onnx.py腳本,加入以下代碼:
調用onnx.py實現推理,新建test_onnx1.py插入代碼:
輸出結果如下:

TensorRT
????????????????????????????????????????????????
TensorRT是英偉達推出的一個高性能的深度學習推理(Inference)優(yōu)化器,可以為深度學習應用提供低延遲、高吞吐率的部署推理。
TensorRT可用于對超大規(guī)模數據中心、嵌入式平臺或自動駕駛平臺 進行推理加速。
TensorRT現已能支持TensorFlow、Caffe、Mxnet、Pytorch等幾乎所有的深度學習框架,將TensorRT和NVIDIA的GPU結合起來,能在幾乎所有的框架中進行快速和高效的部署推理。
TensorRT 是一個C++庫,從 TensorRT 3 開始提供C++ API和Python API,主要用來針對 NVIDIA GPU進行 高性能推理(Inference)加速。
TensorRT的安裝可以參考我以前的文章:
https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/120360288。
本次用的8.X版本的,安裝方式一樣。
本文實現Python版本的 TensorRT 推理加速,需要安裝tensorrt包文件。這個文件不能直接通過pip下載,我在下載的TensorRT安裝包里,不過我下載的8.0.3.4版本中并沒有,在8.2.1.8的版本中存在這個包文件。

所以我安裝了8.2.1.8中的whl文件。
安裝方式,進入模型所在的目錄,執(zhí)行:
模型推理用到了pycuda,執(zhí)行安裝命令:
模型轉化
將onnx模型轉為TensorRT 模型,新建onnx2trt.py,插入代碼:
build_engine函數共有三個參數:
onnx_file_path: onnx模型的路徑。
engine_file_path:TensorRT模型的路徑。
half:是否使用單精度。
單精度的模型速度更快,所以我選擇使用單精度。
通過上面的代碼就可以完成模型的轉化,下面開始實現推理部分,推理分為動態(tài)推理和靜態(tài)推理。
動態(tài)推理
新建test_trt,py文件,插入代碼:
導入需要的包。
定義load_engine函數和get_test_transform函數。
load_engine用于加載TensorRT模型。
get_test_transform實現圖像的resize和歸一化。
圖片的預處理,和onnx一樣,最后轉為數組。
輸出結果:

靜態(tài)推理
靜態(tài)推理和動態(tài)推理的代碼差不多,唯一不同的是不需要
運行結果:

