AI视频行为分析系统项目复盘——技术篇3:tensorRT技术梳理
0 背景
見(jiàn)《AI視頻行為分析系統(tǒng)項(xiàng)目復(fù)盤(pán)——技術(shù)篇1》
1 tensorRT 介紹
NVIDIA?TensorRT?是一個(gè)深度學(xué)習(xí)平臺(tái),用于模型推理加速(僅支持NVIDIA自家GPU,CPU加速一般使用OpenVINO)。
1.1 tensorRT 誕生意義
深度學(xué)習(xí)計(jì)算量相對(duì)普通程序還是挺大的,目前CV落地還不是很普及其中一個(gè)點(diǎn)就是對(duì)硬件要求較高。其次,算法的計(jì)算速度直接影響產(chǎn)品的成本和體驗(yàn),誰(shuí)能在硬件成本限制下支撐起算法精度,誰(shuí)就有產(chǎn)品競(jìng)爭(zhēng)力。
工程上,GPU上的模型推理,業(yè)界主流使用TensorRT去加速,一方面極大提高推理速度(主要目的),另一方面減少顯存等等。
1.2 tensorRT 原理
TensorRT主要做了兩件事:
- TensorRT支持INT8和FP16的計(jì)算。模型訓(xùn)練通常使用float32或16,TRT推理時(shí)可以選擇不用這么高精度。
- TensorRT對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行了重構(gòu),把一些能夠合并的運(yùn)算合并在了一起,針對(duì)GPU的特性做了優(yōu)化。
總的來(lái)說(shuō)優(yōu)化方向就是:
- 數(shù)據(jù)計(jì)算角度。(降低權(quán)重參數(shù)的表示精度、整理某些網(wǎng)絡(luò)結(jié)構(gòu))
- 數(shù)據(jù)傳輸角度。(整理零碎數(shù)據(jù)一起傳輸,減少傳輸次數(shù))
- 數(shù)據(jù)訪問(wèn)內(nèi)存角度。(減少數(shù)據(jù)訪存次數(shù)、減少內(nèi)存占用、提高重復(fù)使用效率)
問(wèn)題1:為什么DL模型訓(xùn)練時(shí)不直接用INT8去訓(xùn)練呢?
回答:梯度對(duì)精度敏感,模型收斂要求權(quán)重的修正量很小很小。
問(wèn)題2:為什么從FP32轉(zhuǎn)int8,推理精度損失不大呢?
回答:訓(xùn)練好的模型一般具有較強(qiáng)魯棒性,對(duì)噪聲(輸入噪聲、權(quán)重噪聲等)有一定的容忍度。
2 tensorRT 真實(shí)情況下的效果
關(guān)于tensorRT到底能加速多少,除了與加速原理相關(guān)(如某些網(wǎng)絡(luò)模塊加速幅度更快),這個(gè)一般好像還得看運(yùn)氣,實(shí)際上挺多因素有影響。
參考1:速度提升1倍——『深度應(yīng)用』YoloV5 RTX2080Ti TensorRT與PyTorch速度對(duì)比
參考2:SSD單幀推理,4倍速度提升。批量推理,9倍速度提升。https://bella722.github.io/post/f524ef1f.html
參考3:
3 tensorRT實(shí)現(xiàn)的幾種方案
3.1 方案1:基于TensorFlow內(nèi)置的TensorRT
自TensorFlow 1.7后,TensorFlow已經(jīng)集成TensorRT了(Google和NVIDIA的合作)。
- GitHub官網(wǎng):tensorflow/tensorrt
- 官方文檔:https://docs.nvidia.com/deeplearning/frameworks/tf-trt-user-guide/index.html
TF-TRT的優(yōu)缺點(diǎn):
? 優(yōu)點(diǎn):
1. API易于使用;
2. 無(wú)需擔(dān)心插件。
? 缺點(diǎn):
1. 需要將整個(gè)TensorFlow庫(kù)存儲(chǔ)在平臺(tái)中(這對(duì)部署環(huán)境不利)
2. 需要在運(yùn)行時(shí)將TensorFlow加載到內(nèi)存中
3. 通常比純TensorRT引擎運(yùn)行慢
流程DEMO
(此部分引用自:https://github.com/SimonWang00/TRT-Tensorflow2)
- 簡(jiǎn)介:在tensorflow2.0上使用tensorrt6加速
- 工作流程:
運(yùn)行環(huán)境準(zhǔn)備
- OS:Ubuntu18.0.4 LST
- python:3.6.5
- tensorflow:2.1.0
- tensorrt:6.0.1
- GPU:只支持GPU
執(zhí)行步驟
- 安裝Nvidia深度學(xué)習(xí)驅(qū)動(dòng),Cudnn和Cuda驅(qū)動(dòng):此部分從略。
- 下載安裝TensorRT 6.0
保存模型
- save_models形式
轉(zhuǎn)換成tensorrt圖
from tensorflow.python.compiler.tensorrt import trt_convert as trt
params=trt.DEFAULT_TRT_CONVERSION_PARAMS
params._replace(precision_mode=trt.TrtPrecisionMode.FP32)
converter = trt.TrtGraphConverterV2(input_saved_model_dir='tf_savedmodel',conversion_params=params)
converter.convert()#完成轉(zhuǎn)換,但是此時(shí)沒(méi)有進(jìn)行優(yōu)化,優(yōu)化在執(zhí)行推理時(shí)完成
converter.save('trt_savedmodel')
優(yōu)化并推理
import tensorflow as tf
from tensorflow.python.compiler.tensorrt import trt_convert as trt
from tensorflow.keras.datasets import mnist
import time(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_test = x_test.astype('float32')
x_test = x_test.reshape(10000, 784)
x_test /= 255saved_model_loaded = tf.saved_model.load("trt_savedmodel", tags=[trt.tag_constants.SERVING])#讀取模型
graph_func = saved_model_loaded.signatures[trt.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY]#獲取推理函數(shù),也可以使用saved_model_loaded.signatures['serving_default']
frozen_func = trt.convert_to_constants.convert_variables_to_constants_v2(graph_func)#將模型中的變量變成常量,這一步可以省略,直接調(diào)用graph_func也行t=time.time()
output = frozen_func(tf.constant(x_test))[0].numpy()
print(time.time()-t)
print((output.argmax(-1)==y_test).mean())
3.2 方案2:基于TensorRT自身語(yǔ)法
一般將其他框架模型轉(zhuǎn)成ONNX格式,然后使用TensorRT自身語(yǔ)法去加載并推理ONNX模型。
此方案一個(gè)比較好的參考資料:wang-xinyu/tensorrtx?(幾十個(gè)主流算法的tensorRT實(shí)現(xiàn))
C++環(huán)境下的tensorRT(yoloV5)全過(guò)程DEMO?
備注1:以下流程主要參考自wang-xinyu/tensorrtx?,相關(guān)細(xì)節(jié)為自己實(shí)踐中修改或補(bǔ)全。
備注2:不要下載太新版本的CUDA和tensorRT,很有可能遇到問(wèn)題無(wú)法解決。(網(wǎng)站上的issues中有很多人遇到環(huán)境不適配問(wèn)題且沒(méi)有解決方案)
備注3:Ubuntu中切換系統(tǒng)默認(rèn)CUDA的方法見(jiàn):《AI視頻行為分析系統(tǒng)項(xiàng)目復(fù)盤(pán)——技術(shù)篇1》CUDA安裝部分。
1. Install CUDA(10.0版)
改用axel下載CUDA包(wget需要翻墻,一般連不上官網(wǎng)),
(axel下載CUDA包,例如:axel -n 50?https://developer.download.nvidia.cn/compute/cuda/11.1.0/local_installers/cuda-repo-ubuntu1804-11-1-local_11.1.0-455.23.05-1_amd64.deb)
命令依次如下:
- 去官網(wǎng)下載cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb(10.0版本沒(méi)有顯示具體下載網(wǎng)址,所以無(wú)法使用axel下載)
- sudo dpkg -i?cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
- sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
- sudo apt-get update
- (可選:apt-cache show cuda? ?#查詢本機(jī)有哪幾個(gè)CUDA版本包,并顯示他們的詳細(xì)信息)
- sudo apt-get install cuda=10.0.130-1?
備注:如果電腦之前已經(jīng)安裝了高版本CUDA,那么安裝cuda時(shí),就需要指定本次CUDA的具體版本號(hào),wang-xinyu/tensorrtx上并沒(méi)有說(shuō)明這點(diǎn)。
2. Install TensorRT(7.0.0版)
Go to?nvidia-tensorrt-7x-download. You might need login,下載后執(zhí)行如下命令:
- sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.0-trt7.0.0.11-ga-20191216_1-1_amd64.deb
- sudo apt update
- sudo apt install tensorrt
3. Install OpenCV
這一步好像Ubuntu默認(rèn)裝了3.2版,不需要安裝。
4. Check your installation
如果以下3個(gè)命令,終端中都有信息回復(fù),則表示安裝成功。
- dpkg -l | grep cuda
- dpkg -l | grep nvinfer
- dpkg -l | grep opencv
5.yolo5s項(xiàng)目準(zhǔn)備
下載yolo5官網(wǎng)V5版工程,下載yolo5s.pt預(yù)訓(xùn)練模型,將yolov5s.pt模型轉(zhuǎn)為yolov5.wts格式。命令如下:
- git clone -b v5.0 https://github.com/ultralytics/yolov5.git
- git clone https://github.com/wang-xinyu/tensorrtx.git
- // download https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt
- cp {tensorrtx}/yolov5/gen_wts.py {ultralytics}/yolov5
- cd {ultralytics}/yolov5
- python gen_wts.py yolov5s.pt
6.build tensorrtx/yolov5 and run
cd {tensorrtx}/yolov5/
// update CLASS_NUM in yololayer.h if your model is trained on custom dataset
mkdir build
cd build
cp {ultralytics}/yolov5/yolov5s.wts {tensorrtx}/yolov5/build
cmake ..
make
sudo ./yolov5 -s [.wts] [.engine] [s/m/l/x/s6/m6/l6/x6 or c/c6 gd gw] // serialize model to plan file
sudo ./yolov5 -d [.engine] [image folder] // deserialize and run inference, the images in [image folder] will be processed.
// For example yolov5s
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s
sudo ./yolov5 -d yolov5s.engine ../samples
// For example Custom model with depth_multiple=0.17, width_multiple=0.25 in yolov5.yaml
sudo ./yolov5 -s yolov5_custom.wts yolov5.engine c 0.17 0.25
sudo ./yolov5 -d yolov5.engine ../samples
7.check the images generated, as follows. _zidane.jpg and _bus.jpg
4 tensorRT技術(shù)未來(lái)趨勢(shì)預(yù)估
待續(xù)
總結(jié)
以上是生活随笔為你收集整理的AI视频行为分析系统项目复盘——技术篇3:tensorRT技术梳理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 优达学城《DeepLearning》项目
- 下一篇: AI视频行为分析系统项目复盘——技术篇4