微吼云上線多路互動(dòng)直播服務(wù) 加速多場(chǎng)景互動(dòng)直播落地
1320
2025-03-31
一、簡(jiǎn)介
我們?cè)赥ensorflow、Caffe、Pytorch等訓(xùn)練框架上訓(xùn)練神經(jīng)網(wǎng)絡(luò)之后,需要對(duì)模型遷移到部署框架上進(jìn)行部署。TensorRT是Nvidia開發(fā)的一個(gè)神經(jīng)網(wǎng)絡(luò)前向推理加速的C++庫(kù),用戶無需像剪枝那樣在訓(xùn)練時(shí)對(duì)模型進(jìn)行定制化處理,只需把模型提供給TensorRT即可實(shí)現(xiàn)加速。TensorRT支持多種模型的解析,包括:Tensorflow pb->uff->TensorRT,?Pytorch pth-> onnx-> TensorRT等轉(zhuǎn)換流程。
二、基本原理
TensorRT對(duì)模型的優(yōu)化包括:
神經(jīng)網(wǎng)絡(luò)模型計(jì)算圖優(yōu)化。包括合并convolution, Bias和ReLU為計(jì)算單元CBR、GPU并發(fā)、消除concat等。
將FP32轉(zhuǎn)為INT8量化、FP16低精度運(yùn)算等。
自動(dòng)選取最優(yōu)CUDA kernel。矩陣乘法、卷積有多種CUDA實(shí)現(xiàn)方式,TensorRT根據(jù)數(shù)據(jù)大小和形狀自動(dòng)選取最優(yōu)實(shí)現(xiàn)。
三、安裝和使用
目前TensorRT提供了C++與Python的API接口,本文使用Python接口介紹TensorRT框架的一般使用流程。
(a)下載:登錄官網(wǎng)地址[1],根據(jù)操作系統(tǒng)、cuda版本選擇適合自己的版本。我這里使用tar包安裝,選擇Ubuntu16 cuda10,下載的文件是TensorRT-7.0.0.11.Ubuntu-16.04.x86_64-gnu.cuda-10.0.cudnn7.6.tar.gz
圖1[1]
(b)安裝:參考官方文檔[2]。主要包括TensorRT, uff, graphsurgeon三個(gè)whl的安裝以及pycuda的安裝。下面是詳細(xì)流程。
解壓:
tar xzvf TensorRT-7.0.0.11.Ubuntu-16.04.x86_64-gnu.cuda-10.0.cudnn7.6.tar.gz
安裝TensorRT:
pip install tensorrt-7.0.0.11-cp35-none-linux_x86_64.whl
安裝graphsurgeon
pip install graphsurgeon-0.4.1-py2.py3-none-any.whl
安裝UFF:
pip install uff-0.6.5-py2.py3-none-any.whl
檢驗(yàn)是否可以將pb模型轉(zhuǎn)換為uff格式(需要先安裝好tensorflow-gpu):進(jìn)入目錄data/mnist下,有l(wèi)enet5_mnist_frozen.pb模型文件:
cd TensorRT-7.0.0.11/data/mnist/
使用命令轉(zhuǎn)換得到lenet5_mnist_frozen.uff:
convert-to-uff lenet5_mnist_frozen.pb
如果出現(xiàn)“ImportError: libcublas.so.X.0: cannot open shared object file: No such file or directory”之類的報(bào)錯(cuò),可能是公共服務(wù)器上有多個(gè)cudnn和cuda版本,需要自己使用的時(shí)候export匹配版本的LD_LIBRARY_PATH,參見(c)。
安裝pycuda
pip install pycuda
(c)export相關(guān)路徑
將下列${path}的路徑換成自己的就好。
tensorRT的路徑:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${ tensorRT path}/lib
cuda和cudnn相關(guān):
export LD_LIBRARY_PATH= ${cuda path}/lib64:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=${ cudnn path}/lib64/:${ cudnn path}/include:${LD_LIBRARY_PATH}
export PATH= ${cuda path}/bin/:${PATH}
(d)測(cè)試
解壓縮后的tensorRT目錄下有samples文件夾,包含一些測(cè)試用例(c++和python的)。其中目錄samples/python/是python的測(cè)試用例。
這里介紹samples/python/ end_to_end_tensorflow_mnist的使用。
幾個(gè)注意點(diǎn):
推理代碼使用的模型是lenet.uff,在data/mnist/下。進(jìn)入data/mnist/下運(yùn)行“python download_pgms.py”可下載數(shù)據(jù)集,得到的文件格式為*.pgm。路徑設(shè)置示例如圖2所示。
圖2
官方代碼的模型輸入和輸出節(jié)點(diǎn)名稱是錯(cuò)誤的,使用netron打開模型查看即可發(fā)現(xiàn)。我這里把它們改成了in, out。
圖3
設(shè)置完這些,python sample.py即可。
四、主要代碼分析
(a)設(shè)置輸入尺寸、輸入節(jié)點(diǎn)和輸出節(jié)點(diǎn)名稱,如圖3所示。
(b)創(chuàng)建cuda engine:新建 parser注冊(cè)輸入輸出節(jié)點(diǎn)名稱和輸入尺寸,并解析uff文件到network中,最后用builder創(chuàng)建network對(duì)應(yīng)的engine。默認(rèn)使用FP32加速,即只是圖優(yōu)化等操作,不進(jìn)行量化或降精度。設(shè)置FP16十分簡(jiǎn)單,一行代碼即可:
builder.fp16_mode = True
FP32轉(zhuǎn)INT8對(duì)模型性能影響較大,需要校準(zhǔn)集校準(zhǔn)過程,這里不做介紹。
圖4
Cuda engine的建立比較花費(fèi)時(shí)間,第一次新建后可以序列化保存到本地,下次直接load即可(圖5)。
圖5
(c) 構(gòu)建輸入輸出緩沖區(qū):binding包括輸入和輸出節(jié)點(diǎn)
圖6
(d)預(yù)處理和拷貝輸入數(shù)據(jù):原模型讀取數(shù)據(jù)以及預(yù)處理的代碼,應(yīng)在np.copyto()方法前執(zhí)行。注意:此處raval()將輸入數(shù)據(jù)攤平,默認(rèn)攤平前圖像為NCHW格式,弄錯(cuò)四個(gè)維度的順序(如NHWC)會(huì)導(dǎo)致輸出結(jié)果錯(cuò)誤。
圖7
(e)推理和搬數(shù)據(jù)
圖8
整體的Main函數(shù)流程如下:
圖9
[1]https://developer.nvidia.com/nvidia-tensorrt-7x-download
[2]https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-700/tensorrt-install-guide/index.html#installing-tar
EI智能體 OCR
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。