提升10倍推理速度:利用TensorRT 在Jetson NX上的模型部署
隨著算力的不斷提升和數(shù)據(jù)的不斷增長,深度學(xué)習(xí)算法有了巨大的發(fā)展。深度學(xué)習(xí)算法也越來越多的應(yīng)用在各個領(lǐng)域中,比如圖像識別算法應(yīng)用于自動駕駛領(lǐng)域和安防等場景,再比如語音處理和自然語言處理應(yīng)用于人機(jī)交互,以及近期火熱對于許多領(lǐng)域都有重大影響的AIGC。針對不同的平臺,如何使深度學(xué)習(xí)算法的推理速度更快,無疑可以影響用戶的體驗,甚至可以影響一個算法的有效性,這是深度學(xué)習(xí)模型部署所要研究的問題。目前模型部署框架則有NVIDIA推出的TensorRT,谷歌的Tensorflow和用于ARM平臺的tflite,開源的caffe,百度的飛漿。
在AIOT、移動設(shè)備以及自動駕駛等領(lǐng)域,出于成本和性能方面的考慮,可能無法使用高性能的GPU服務(wù)器,因此NVIDIA推出了Jetson NX,可以廣泛地應(yīng)用于嵌入式設(shè)備和邊緣計算等場景。同時,Nvidia所開發(fā)的TensorRT可以對深度學(xué)習(xí)模型的推理過程進(jìn)行加速,使得Jetson NX也可以使用一些深度學(xué)習(xí)算法從而擁有更廣泛的應(yīng)用價值。Triton是NVIDIA于2018年開源的服務(wù)框架,可以對TensorRT生成的推理引擎進(jìn)行更好的調(diào)度以及處理推理請求。
本文主要介紹了基于Jetson NX使用TensorRT和Triton對深度學(xué)習(xí)算法模型進(jìn)行部署的流程,并以yolov5和ResNet兩種視覺領(lǐng)域常用的算法為例進(jìn)行了評測。
模型部署流程
Jetson上的模型部署因為是基于arm的,與傳統(tǒng)基于x86的主機(jī)或服務(wù)器的部署略有差別,但基本類似,主要分為三步:
模型轉(zhuǎn)換為onnx
生成基于TensorRT的推理引擎
使用Triton完成部署?
1.模型轉(zhuǎn)換為onnx
首先可以將pytorch或其他框架訓(xùn)練好的模型轉(zhuǎn)換為onnx格式用于后續(xù)的部署。pytorch中提供了將模型文件導(dǎo)出為onnx格式的函數(shù)。以yolov5為例:

可以將原模型導(dǎo)出為onnx格式,其中model是我們要進(jìn)行導(dǎo)出的模型文件,f為導(dǎo)出的onnx模型文件。
2.生成基于TensorRT的推理引擎
TensorRT主要用于優(yōu)化模型推理速度,是硬件相關(guān)的。主要有兩種將torch生成的模型轉(zhuǎn)化為TensorRT的engine的方式:
將模型的.pth權(quán)重文件轉(zhuǎn)化為.wts文件。之后編寫c++程序?qū)?wts進(jìn)行編譯,生成推理引擎,通過調(diào)用推理引擎來進(jìn)行TensorRT的推理。
將網(wǎng)絡(luò)結(jié)構(gòu)保存為onnx格式,然后利用ONNX-TensorRT工具將onnx模型文件轉(zhuǎn)換為TensorRT推理引擎即可即可。
注:兩種方法生成的推理引擎無法直接互換使用,需要進(jìn)行一定的轉(zhuǎn)換。
在本文中,我們使用第二種方法生成推理引擎。即使用上一步中轉(zhuǎn)化好的onnx模型文件,使用ONNX-TensorRT工具trtexec將onnx模型文件轉(zhuǎn)化為推理引擎。在Jetson上安裝arm版的TensorRT后可以使用trtexec將onnx模型文件生成推理引擎,使用方法如下:

--onnx代表輸入的模型文件, --fp16代表使用半精度浮點(diǎn)類型數(shù)據(jù),--saveEngine代表保存的推理引擎名稱。
使用trtexec -h可以查看更多參數(shù)說明。
執(zhí)行結(jié)束后可以得到類似如下的性能結(jié)果報告:

如果最后顯示為PASSED則代表推理引擎生成成功,2-9為用偽數(shù)據(jù)進(jìn)行的性能測試結(jié)果。
3.使用Triton完成部署?
在上一步中使用TensorRT得到推理引擎后,可以使用Triton進(jìn)行進(jìn)一步的部署。
Jetson版的Triton Server安裝可以參考?[Triton Inference Server Support for Jetson and JetPack][1]。
安裝完成后,配置模型即可完成部署,更多信息可參考[ Triton Model Configuration Documentation][2]。
在本文以如下配置過程為例:

配置文件的目錄格式如下:

即構(gòu)建好模型文件的目錄和配置文件,并將上一步中得到的推理引擎復(fù)制到相應(yīng)目錄下作為model.plan,一個簡單的配置文件config.pbtxt可以設(shè)置如下:

完成以上配置后,即可使用tritonserver進(jìn)行部署:


部署成功后結(jié)果如上圖所示,可以使用pytritonclient將需要預(yù)測的數(shù)據(jù)進(jìn)行預(yù)處理后訪問8001端口進(jìn)行推理調(diào)用。
性能評測
本文分別對視覺領(lǐng)域常用的兩種算法Yolov5和ResNet進(jìn)行了評測,對TensorRT的加速進(jìn)行了量化的評估。
ResNet?

本文對ResNet常見的兩種網(wǎng)絡(luò)結(jié)構(gòu)ResNet18和ResNet50分別進(jìn)行了測試,實驗結(jié)果如圖1所示,加速版本與未加速版本所使用的設(shè)置均一致,測量的指標(biāo)為query per second(qps),batchsize均為1,加速比約為6.02。

Yolo是視覺領(lǐng)域常用的目標(biāo)檢測算法,本文對Yolov5的加速性能進(jìn)行了測試,分別對半精度浮點(diǎn)類型和全精度浮點(diǎn)類型的加速性能進(jìn)行了實驗。實驗結(jié)果如圖2所示,加速版本與未加速版本所使用的實驗設(shè)置均一致,圖像輸入尺寸為320×320,測量的性能指標(biāo)為qps??梢钥闯觯繕?biāo)識別算法只有在加速后可以實現(xiàn)實時的目標(biāo)檢測,加速比約為10.96。
總結(jié)
本文主要介紹了基于Jetson NX使用TensorRT和Triton對深度學(xué)習(xí)算法模型進(jìn)行部署方法和整體流程,并以yolov5和ResNet兩種視覺領(lǐng)域常用的算法為例進(jìn)行了評測。在基本不損失精度的情況下,TensorRT可以對常見的深度學(xué)習(xí)算法模型進(jìn)行很好的加速并部署在Jetson上。利用這項技術(shù),使Jetson不再依賴服務(wù)器,可以在本地實時常見的深度學(xué)習(xí)任務(wù)。在邊緣計算、移動端設(shè)備計算等場景中有非常廣闊的應(yīng)用價值。
參考資料
[1]https://github.com/triton-inference-server/server/blob/r22.10/docs/user_guide/jetson.md
[2]https://github.com/triton-inference-server/server/blob/main/docs/model_configuration.md#model-configuration
[封面]https://developer.nvidia.com/tensorrt

本文共2714字,申請文章授權(quán)請聯(lián)系后臺運(yùn)營人員
