日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

TensorRT-优化-原理

發(fā)布時間:2023/11/28 生活经验 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorRT-优化-原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

TensorRT-優(yōu)化-原理

一.優(yōu)化方式

TentsorRT 優(yōu)化方式:

TensorRT優(yōu)化方法主要有以下幾種方式,最主要的是前面兩種。

層間融合或張量融合(Layer & Tensor Fusion)

如下圖左側(cè)是GoogLeNetInception模塊的計算圖。這個結(jié)構(gòu)中有很多層,在部署模型推理時,這每一層的運算操作都是由GPU完成的,但實際上是GPU通過啟動不同的CUDA(Compute unified device architecture)核心來完成計算的,CUDA核心計算張量的速度是很快的,但是往往大量的時間是浪費在CUDA核心的啟動和對每一層輸入/輸出張量的讀寫操作上面,這造成了內(nèi)存帶寬的瓶頸和GPU資源的浪費。TensorRT通過對層間的橫向或縱向合并(合并后的結(jié)構(gòu)稱為CBR,意指 convolution, bias, and ReLU layers are fused to form a single layer),使得層的數(shù)量大大減少。橫向合并可以把卷積、偏置和激活層合并成一個CBR結(jié)構(gòu),只占用一個CUDA核心。縱向合并可以把結(jié)構(gòu)相同,但是權(quán)值不同的層合并成一個更寬的層,也只占用一個CUDA核心。合并之后的計算圖(圖4右側(cè))的層次更少了,占用的CUDA核心數(shù)也少了,因此整個模型結(jié)構(gòu)會更小,更快,更高效。

數(shù)據(jù)精度校準(zhǔn)(Weight &Activation Precision Calibration)

大部分深度學(xué)習(xí)框架在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時網(wǎng)絡(luò)中的張量(Tensor)都是32位浮點數(shù)的精度(Full 32-bit precision,FP32),一旦網(wǎng)絡(luò)訓(xùn)練完成,在部署推理的過程中由于不需要反向傳播,完全可以適當(dāng)降低數(shù)據(jù)精度,比如降為FP16或INT8的精度。更低的數(shù)據(jù)精度將會使得內(nèi)存占用和延遲更低,模型體積更小。

如下表為不同精度的動態(tài)范圍:

INT8只有256個不同的數(shù)值,使用INT8來表示 FP32精度的數(shù)值,肯定會丟失信息,造成性能下降。不過TensorRT會提供完全自動化的校準(zhǔn)(Calibration )過程,會以最好的匹配性能將FP32精度的數(shù)據(jù)降低為INT8精度,最小化性能損失。關(guān)于校準(zhǔn)過程,后面會專門做一個探究。

Kernel Auto-Tuning

網(wǎng)絡(luò)模型在推理計算時,是調(diào)用GPU的CUDA核進行計算的。TensorRT可以針對不同的算法,不同的網(wǎng)絡(luò)模型,不同的GPU平臺,進行 CUDA核的調(diào)整(怎么調(diào)整的還不清楚),以保證當(dāng)前模型在特定平臺上以最優(yōu)性能計算。

TensorRT will pick the implementation from a library of kernels that delivers the best performance for the target GPU, input data size, filter size, tensor layout, batch size and other parameters.

Dynamic Tensor Memory

在每個tensor的使用期間,TensorRT會為其指定顯存,避免顯存重復(fù)申請,減少內(nèi)存占用和提高重復(fù)使用效率。

Multi-Stream Execution

Scalable design to process multiple input streams in parallel,這個應(yīng)該就是GPU底層的優(yōu)化了。

二.原理

TensorRT是一個高性能的深度學(xué)習(xí)推理(Inference)優(yōu)化器,可以為深度學(xué)習(xí)應(yīng)用提供低延遲、高吞吐率的部署推理。TensorRT可用于對超大規(guī)模數(shù)據(jù)中心、嵌入式平臺或自動駕駛平臺進行推理加速。TensorRT現(xiàn)已能支持TensorFlow、Caffe、Mxnet、Pytorch等幾乎所有的深度學(xué)習(xí)框架,將TensorRT和NVIDIA的GPU結(jié)合起來,能在幾乎所有的框架中進行快速和高效的部署推理。

TensorRT 是一個C++庫,從 TensorRT 3 開始提供C++ API和Python API,主要用來針對 NVIDIA GPU進行 高性能推理(Inference)加速。現(xiàn)在最新版TensorRT是4.0版本。

TensorRT 之前稱為GIE。

關(guān)于推理(Inference):


由以上兩張圖可以很清楚的看出,訓(xùn)練(training)和 推理(inference)的區(qū)別:

訓(xùn)練(training)包含了前向傳播和后向傳播兩個階段,針對的是訓(xùn)練集。訓(xùn)練時通過誤差反向傳播來不斷修改網(wǎng)絡(luò)權(quán)值(weights)。
推理(inference)只包含前向傳播一個階段,針對的是除了訓(xùn)練集之外的新數(shù)據(jù)。可以是測試集,但不完全是,更多的是整個數(shù)據(jù)集之外的數(shù)據(jù)。其實就是針對新數(shù)據(jù)進行預(yù)測,預(yù)測時,速度是一個很重要的因素。

一般的深度學(xué)習(xí)項目,訓(xùn)練時為了加快速度,會使用多GPU分布式訓(xùn)練。但在部署推理時,為了降低成本,往往使用單個GPU機器甚至嵌入式平臺(比如 NVIDIA Jetson)進行部署,部署端也要有與訓(xùn)練時相同的深度學(xué)習(xí)環(huán)境,如caffe,TensorFlow等。

由于訓(xùn)練的網(wǎng)絡(luò)模型可能會很大(比如,inception,resnet等),參數(shù)很多,而且部署端的機器性能存在差異,就會導(dǎo)致推理速度慢,延遲高。這對于那些高實時性的應(yīng)用場合是致命的,比如自動駕駛要求實時目標(biāo)檢測,目標(biāo)追蹤等。

所以為了提高部署推理的速度,出現(xiàn)了很多輕量級神經(jīng)網(wǎng)絡(luò),比如squeezenet,mobilenet,shufflenet等。基本做法都是基于現(xiàn)有的經(jīng)典模型提出一種新的模型結(jié)構(gòu),然后用這些改造過的模型重新訓(xùn)練,再重新部署。

而tensorRT 則是對訓(xùn)練好的模型進行優(yōu)化。 tensorRT就只是 推理優(yōu)化器。當(dāng)你的網(wǎng)絡(luò)訓(xùn)練完之后,可以將訓(xùn)練模型文件直接丟進tensorRT中,而不再需要依賴深度學(xué)習(xí)框架(Caffe,TensorFlow等),如下:

可以認(rèn)為tensorRT是一個只有前向傳播的深度學(xué)習(xí)框架,這個框架可以將 Caffe,TensorFlow的網(wǎng)絡(luò)模型解析,然后與tensorRT中對應(yīng)的層進行一一映射,把其他框架的模型統(tǒng)一全部轉(zhuǎn)換到tensorRT中,然后在tensorRT中可以針對NVIDIA自家GPU實施優(yōu)化策略,并進行部署加速。

目前TensorRT4.0 幾乎可以支持所有常用的深度學(xué)習(xí)框架,對于caffe和TensorFlow來說,tensorRT可以直接解析他們的網(wǎng)絡(luò)模型;對于caffe2,pytorch,mxnet,chainer,CNTK等框架則是首先要將模型轉(zhuǎn)為 ONNX 的通用深度學(xué)習(xí)模型,然后對ONNX模型做解析。而tensorflow和MATLAB已經(jīng)將TensorRT集成到框架中去了。

ONNX(Open Neural Network Exchange )是微軟和Facebook攜手開發(fā)的開放式神經(jīng)網(wǎng)絡(luò)交換工具,也就是說不管用什么框架訓(xùn)練,只要轉(zhuǎn)換為ONNX模型,就可以放在其他框架上面去inference。這是一種統(tǒng)一的神經(jīng)網(wǎng)絡(luò)模型定義和保存方式,上面提到的除了tensorflow之外的其他框架官方應(yīng)該都對onnx做了支持,而ONNX自己開發(fā)了對tensorflow的支持。從深度學(xué)習(xí)框架方面來說,這是各大廠商對抗谷歌tensorflow壟斷地位的一種有效方式;從研究人員和開發(fā)者方面來說,這可以使開發(fā)者輕易地在不同機器學(xué)習(xí)工具之間進行轉(zhuǎn)換,并為項目選擇最好的組合方式,加快從研究到生產(chǎn)的速度。

上面圖中還有一個 Netwok Definition API 這個是為了給那些使用自定義的深度學(xué)習(xí)框架訓(xùn)練模型的人提供的TensorRT接口。舉個栗子:比如 YOLO 作者使用的darknet要轉(zhuǎn)tensorrt估計得使用這個API,不過一般網(wǎng)上有很多使用其他框架訓(xùn)練的YOLO,這就可以使用對應(yīng)的caffe/tensorflow/onnx API了。

ONNX / TensorFlow / Custom deep-learning frame模型的工作方式:

現(xiàn)在tensorRT支持的層有:

Activation: ReLU, tanh and sigmoid Concatenation : Link together multiple tensors across the channel dimension.
Convolution: 3D,2D
Deconvolution Fully-connected: with or without bias
ElementWise: sum, product or max of two tensors
Pooling: max and average
Padding Flatten
LRN: cross-channel only
SoftMax: cross-channel only
RNN: RNN, GRU, and LSTM
Scale: Affine transformation and/or exponentiation by constant values
Shuffle: Reshuffling of tensors , reshape or transpose data
Squeeze: Removes dimensions of size 1 from the shape of a tensor Unary: Supported operations are exp, log, sqrt, recip, abs and neg Plugin: integrate custom layer implementations that TensorRT does not natively support.

基本上比較經(jīng)典的層比如,卷積,反卷積,全連接,RNN,softmax等,在tensorRT中都是有對應(yīng)的實現(xiàn)方式的,tensorRT是可以直接解析的。

但是由于現(xiàn)在深度學(xué)習(xí)技術(shù)發(fā)展日新月異,各種不同結(jié)構(gòu)的自定義層(比如:STN)層出不窮,所以tensorRT是不可能全部支持當(dāng)前存在的所有層的。那對于這些自定義的層該怎么辦?

tensorRT中有一個 Plugin 層,這個層提供了 API 可以由用戶自己定義tensorRT不支持的層。 如下圖:

這就解決了適應(yīng)不同用戶的自定義層的需求。

總結(jié)

以上是生活随笔為你收集整理的TensorRT-优化-原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。