TensorRT Analysis Report分析报告
TensorRT Analysis Report
一.介紹
TensorRT是一個高性能的深度學習推理(Inference)優化器,可以為深度學習應用提供低延遲、高吞吐率的部署推理。TensorRT可用于對超大規模數據中心、嵌入式平臺或自動駕駛平臺進行推理加速。TensorRT現已能支持Tensorflow、Caffe、Mxnet、Pytorch等幾乎所有的深度學習框架,將TensorRT和NVIDIA的GPU結合起來,能在幾乎所有的框架中進行快速和高效的部署推理。
TensorRT 是一個C++庫,從 TensorRT 3 開始提供C++ API和Python API,主要用來針對 NVIDIA GPU進行高性能推理(Inference)加速。現在最新版TensorRT是4.0版本。
TensorRT 之前稱為GIE。
關于推理(Inference):
在推理過程中,基于 TensorRT 的應用程序的執行速度可比 CPU 平臺的速度快 40 倍。借助 TensorRT,可以優化在所有主要框架中訓練的神經網絡模型,精確校正低精度,并最終將模型部署到超大規模數據中心、嵌入式或汽車產品平臺中。
TensorRT以 NVIDIA 的并行編程模型CUDA 為基礎構建而成,可幫助利用 CUDA-X 中的庫、開發工具和技術,針對人工智能、自主機器、高性能計算和圖形優化所有深度學習框架中的推理。
TensorRT 針對多種深度學習推理應用的生產部署提供INT8和 FP16 優化,例如視頻流式傳輸、語音識別、推薦和自然語言處理。推理精度降低后可顯著減少應用延遲,這恰巧滿足了許多實時服務、自動和嵌入式應用的要求。
TensorRT項目立項的時候名字叫做GPU Inference Engine(簡稱GIE),Tensor表示數據流動以張量的形式。
張量可以理解為更加復雜的高維數組。
緯度的就叫Tensor,Matrix其實是二維的Tensor。
在TensoRT中,所有的數據都被組成最高四維的數組,如果對應到CNN中其實就是{N, C, H, W},N表示batch size,即多少張圖片或者多少個推斷(Inference)的實例;C表示channel數目;H和W表示圖像或feature maps的高度和寬度。TR表示的是Runtime。
下圖是NVDIA針對深度學習平臺的一系列完整的解決方案。分為訓練和部署兩部分,訓練部分首先也是最重要的是構建網絡結構,準備數據集,使用各種框架進行訓練,訓練要包含validation和test的過程,最后對于訓練好的模型要在實際業務中進行使用。
訓練(Training)這個階段如果模型比較慢,可以用更大的集群、更多的機器,做更大的數據并行甚至是模型并行來訓練它,重要的是成本的投入。
部署端不只是成本的問題,如果方法不得當,即使使用目前最先進的GPU,也無法滿足推斷(Inference)的實時性要求。因為模型如果做得不好,沒有做優化,可能需要二三百毫秒才能做完一次推斷(Inference),再加上來回的網絡傳輸,用戶可能一秒后才能得到結果。
二. 為什么TensorRT能讓模型加速?
TensorRT優化訓練好的神經網絡模型以產生可部署的運行時推理引擎
從圖上可以看到,TensorRT主要做了下面幾件事,來提升模型的運行速度。
或張量融合(Layer & Tensor Fusion)
如下圖左側是GoogLeNetInception模塊的計算圖。這個結構中有很多層,在部署模型推理時,這每一層的運算操作都是由GPU完成的,但實際上是GPU通過啟動不同的CUDA(Compute unified device architecture)核心來完成計算的,CUDA核心計算張量的速度是很快的,但是往往大量的時間是浪費在CUDA核心的啟動和對每一層輸入/輸出張量的讀寫操作上面,這造成了內存帶寬的瓶頸和GPU資源的浪費。TensorRT通過對層間的橫向或縱向合并(合并后的結構稱為CBR,意指 convolution, bias, and ReLU layers are fused to form a single layer),使得層的數量大大減少。橫向合并可以把卷積、偏置和激活層合并成一個CBR結構,只占用一個CUDA核心。縱向合并可以把結構相同,但是權值不同的層合并成一個更寬的層,也只占用一個CUDA核心。合并之后的計算圖(圖4右側)的層次更少了,占用的CUDA核心數也少了,因此整個模型結構會更小,更快,更高效。
- 數據精度校準(Weight &Activation Precision Calibration)
大部分深度學習框架在訓練神經網絡時網絡中的張量(Tensor)都是32位浮點數的精度(Full
32-bit precision,FP32),一旦網絡訓練完成,在部署推理的過程中由于不需要反向傳播,完全可以適當降低數據精度,比如降為FP16或INT8的精度。更低的數據精度將會使得內存占用和延遲更低,模型體積更小。
TensorRT支持FP16和INT8的計算。我們知道深度學習在訓練的時候一般是應用32位或者16位數據,TensorRT在推理的時候可以降低模型參數的位寬來進行低精度推理,以達到加速推斷的目的。
如下表為不同精度的動態范圍:
INT8只有256個不同的數值,使用INT8來表示 FP32精度的數值,肯定會丟失信息,造成性能下降。不過TensorRT會提供完全自動化的校準(Calibration )過程,會以最好的匹配性能將FP32精度的數據降低為INT8精度,最小化性能損失。關于校準過程,后面會專門做一個探究。
- Kernel Auto-Tuning
網絡模型在推理計算時,調用GPU的CUDA核進行計算。TensorRT可以針對不同的算法,不同的網絡模型,不同的GPU平臺,進行 CUDA核的調整,以保證當前模型在特定平臺上以最優性能計算。
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會為其指定顯存,避免顯存重復申請,減少內存占用和提高重復使用效率。
- Multi-Stream Execution
Scalable
design to process multiple input streams in parallel,這個應該就是GPU底層的優化了。然后Concat層是可以去掉的,因為TensorRT完全可以實現直接接到需要的地方。
TensorRT對于網絡結構進行重構,把一些能夠合并的運算合并在了一起,針對GPU的
特性做了優化。在GPU上跑的函數叫Kernel,TensorRT是存在Kernel的調用的。在絕大部分框架中,比如一個卷積層、一個偏置層和一個reload層,這三層是需要調用三次cuDNN對應的API,但實際上這三層的實現完全是可以合并到一起的,TensorRT會對一些可以合并網絡進行合并;目前的網絡一方面越來越深,另一方面越來越寬,可能并行做若干個相同大小的卷積,這些卷積計算其實也是可以合并到一起來做的。
- 不同的硬件,如P4卡還是V100卡,甚至是嵌入式設備的卡,TensorRT都會做優化,得到優化后的engine。
可以從每個深度學習框架中將已訓練模型導入到
TensorRT。應用優化后,TensorRT 選擇平臺特定的內核,在數據中心、Jetson 嵌入式平臺以及 NVIDIA DRIVE 自動駕駛平臺上更大限度提升 Tesla GPU 的性能。
借助 TensorRT,開發者可專注于創建新穎的 AI 支持應用,無需費力調節性能來部署推理工作。
作為Inference(推理)端的SDK的工具,TensorRT是可編程的處理加速器,主要是用來部署神經網絡到Inference端之前,對于網絡進行優化加速,來提高程序的吞吐量以及降低延遲。TensorRT理論上可以支持所有主流的深度學習框架,目前最新的版本是3.0版,可以支持Caffe 模型的直接導入,還有就是Tensorflow模型轉換為UFF格式后的導入。對于其他的framework,需要用戶手動的去調用一些API進行模型和參數的導入,而且在TensorRT 3.0里面還加入了對Python接口的支持,原來我們是只支持C++的,目前加入了Python,這樣使得導入網絡模型可以變得更加容易一些。
TensorRT的部署流程可以分成兩部分。
首先是向TensorRT 導入訓練好的網絡模型、參數,輸入一組測試集數據,這個數據集不用太大。在TensorRT 啟動之后,會根據我們剛才所說的幾大優化方式依次對網絡模型進行優化,對于規模不大的網絡,這個過程可能需要耗費幾分鐘的時間。在執行完成之后,它會輸出一個優化策略,如上圖所示的Plan。這時我們可以選擇將這個優化策略以序列化的方式導出到磁盤文件進行存儲,這樣,這個策略文件就可以被復制以及移植到不同的設備端來使用。
接下來就可以拿著這個優化策略文件連通TensorRT
的引擎,一起部署到線上服務端。
ONNX(Open Neural Network Exchange )是微軟和Facebook攜手開發的開放式神經網絡交換工具,也就是說不管用什么框架訓練,只要轉換為ONNX模型,就可以放在其他框架上面去inference。這是一種統一的神經網絡模型定義和保存方式,上面提到的除了Tensorflow之外的其他框架官方應該都對ONNX做了支持,而ONNX自己開發了對Tensorflow的支持。從深度學習框架方面來說,這是各大廠商對抗谷歌Tensorflow壟斷地位的一種有效方式;從研究人員和開發者方面來說,這可以使開發者輕易地在不同機器學習工具之間進行轉換,并為項目選擇最好的組合方式,加快從研究到生產的速度。
TensorRT 和 Tensorflow 已緊密集成,因此可以同時盡享 Tensorflow的靈活性和 TensorRT 的超強優化性能。
MATLAB 已通過 GPU 編碼器實現與 TensorRT 的集成,這能協助工程師和科學家在使用 MATLAB 時為 Jetson、DRIVE
和 Tesla 平臺自動生成高性能推理引擎。
TensorRT提供了一個 ONNX 解析器,因此可以輕松地從框架(例如 Caffe 2、Chainer、Microsoft Cognitive Toolkit、MxNet 和PyTorch)中將 ONNX 模型導入到 TensorRT。
TensorRT 還與 ONNX Runtime 集成,助以 ONNX 格式輕松實現機器學習模型的高性能推理。
Figure 1. TensorRT is a high-performance neural network
inference optimizer and runtime engine for production deployment.
Figure 2. TensorRT
is a programmable inference accelerator.
由以上兩張圖可以很清楚的看出,訓練(training)和
推理(inference)的區別:
· 訓練(training)包含了前向傳播和后向傳播兩個階段,針對的是訓練集。訓練時通過誤差反向傳播來不斷修改網絡權值(weights)。
· 推理(inference)只包含前向傳播一個階段,針對的是除了訓練集之外的新數據。可以是測試集,但不完全是,更多的是整個數據集之外的數據。其實就是針對新數據進行預測,預測時,速度是一個很重要的因素。
訓練時為了加快速度,會使用多GPU分布式訓練。
部署推理時,為了降低成本,往往使用單個GPU機器甚至嵌入式平臺(比如 NVIDIA Jetson)進行部署,部署端也要有與訓練時相同的深度學習環境,如caffe,Tensorflow等。
由于訓練的網絡模型可能會很大(比如,inception,resnet等),參數很多,而且部署端的機器性能存在差異,就會導致推理速度慢,延遲高。這對于那些高實時性的應用場合是致命的,比如自動駕駛要求實時目標檢測,目標追蹤等。
為了提高部署推理的速度,出現了很多輕量級神經網絡,比如squeezenet,mobilenet,shufflenet等。基本做法都是基于現有的經典模型提出一種新的模型結構,然后用這些改造過的模型重新訓練,再重新部署。
而TensorRT 則是對訓練好的模型進行優化。
TensorRT就只是 推理優化器。當你的網絡訓練完之后,可以將訓練模型文件直接丟進TensorRT中,而不再需要依賴深度學習框架(Caffe,Tensorflow等),如下:
TensorRT是一個只有前向傳播的深度學習框架,這個框架可以將 Caffe,Tensorflow的網絡模型解析,然后與TensorRT中對應的層進行一一映射,把其它框架的模型統一全部轉換到TensorRT中,然后在TensorRT中可以針對NVIDIA自家GPU實施優化策略,并進行部署加速。
Functions Name
Contents
Caffe/Tensorflow
TensorRT可以直接解析他們的網絡模型
Tensorflow/MATLAB
Tensorflow和MATLAB已經將TensorRT集成到框架中
caffe2,pytorch,mxnet,chainer,CNTK
首先要將模型轉為ONNX 的通用深度學習模型,然后對ONNX模型做解析。
ONNX(Open Neural Network Exchange )
微軟和Facebook攜手開發的開放式神經網絡交換工具,也就是說不管用什么框架訓練,只要轉換為ONNX模型,就可以放在其他框架上面去inference。
Tenseflow
ONNX單獨開發了對Tensorflow的支持。
Netwok Definition API
給那些使用自定義的深度學習框架訓練模型的人提供的TensorRT接口。
比如 YOLO 作者使用的darknet要轉TensorRT估計得使用這個API,不過一般網上有很多使用其他框架訓練的YOLO,這就可以使用對應的caffe/Tensorflow/onnx API了。
ONNX網絡中有自定義的Layer,如何處理?
TensorRT中有一個 Plugin 層,這個層提供了 API 可以由用戶自己定義TensorRT不支持的層。 如下圖所示:
基本上比較經典的層,如,卷積,反卷積,全連接,RNN,softmax等,在TensorRT中都是有對應的實現方式的,TensorRT是可以直接解析的。
由于現在深度學習技術發展日新月異,各種不同結構的自定義層(比如:STN)層出不窮,所以TensorRT是不可能全部支持當前存在的所有層的。那對于這些自定義的層該怎么辦?
目前TensorRT4.0幾乎可以支持所有常用的深度學習框架,對于caffe和Tensorflow來說,TensorRT可以直接解析他們的網絡模型;對于caffe2,pytorch,mxnet,chainer,CNTK等框架則是首先要將模型轉為 ONNX 的通用深度學習模型,然后對ONNX模型做解析。而Tensorflow和MATLAB已經將TensorRT集成到框架中去了。
ONNX(Open Neural Network Exchange )是微軟和Facebook攜手開發的開放式神經網絡交換工具,也就是說不管用什么框架訓練,只要轉換為ONNX模型,就可以放在其他框架上面去inference。這是一種統一的神經網絡模型定義和保存方式,上面提到的除了Tensorflow之外的其他框架官方應該都對ONNX做了支持,而ONNX自己開發了對Tensorflow的支持。從深度學習框架方面來說,這是各大廠商對抗谷歌Tensorflow壟斷地位的一種有效方式;從研究人員和開發者方面來說,這可以使開發者輕易地在不同機器學習工具之間進行轉換,并為項目選擇最好的組合方式,加快從研究到生產的速度。
ONNX / Tensorflow/ Custom deep-learning frame模型的工作方式:
Netwok Definition API 是自定義的深度學習框架訓練模型的人提供的TensorRT接口。
比如 YOLO 使用的darknet要轉TensorRT使用這個API,不過一般網上有很多使用其他框架訓練的YOLO,這就可以使用對應的caffe/Tensorflow/onnx API了。
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.
總結
以上是生活随笔為你收集整理的TensorRT Analysis Report分析报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于TensorRT优化的Machine
- 下一篇: NVIDIA Nsight System