TensorRT4.0開發手冊(1)
第一章 綜述
NVIDIA的TensorRT是一個基於GPU高效能前向運算的C++庫。TensorRT匯入網路定義,通過合併tensors與layers,權值轉換,選擇高效中間資料型別,基於層引數與效能評估的選擇,來進行網路優化。
TensorRT提供模型匯入途徑來幫助你對訓練好的深度學習模型進行表示,同於TensorRT的優化與執行。這種優化工具自動進行圖優化,層融合,並利用多樣化的高度優化的計算核心尋找最快的模型實現方式。輸出可以前向運算時可以執行這個網路的執行庫。
TensorRT提供了一種基礎能力,使得使用者可以在Pascal與VoltaGPU上選擇性進行快速多精度應用。TensorRT用gcc4.8進行編譯。
1.1 TensorRTLayers
TensorRT直接支援以下型別的層:
Activation
啟用層通過逐畫素啟用函式實現。支援的啟用型別包括,RELU,tanh與sigmoid.
BatchGemm
批矩陣相乘層實現了批矩陣的乘法運算。在矩陣相乘前矩陣可以進行轉置。當維度不匹配的時候會進行適當的矩陣擴充套件。
Concatenation
連線層在通道維度上將寬高相同的tensors進行連線。
Constant
Constant層是一個提供本層引數的tensor,使得常量在計算時可以方便使用。
Convolution
Convolution層計算3D卷積(通道,高,寬),可選擇是否使用偏置。
Deconvolution
Deconvolution層實現了去卷積運算,可選擇是否使用偏置。
ElementWise
ElementWise層也叫做Eltwise層,實現了逐畫素操作。支援加法,乘法,最大,減法,除法,指數運算。
Flatten
Flatten層在保持batch_size的同時,將輸入轉成一個向量。假設第一個維度表示batch大小。Flatten只能在全連線層前使用。
FullConnected
全連線層實現了矩陣向量積運算,可選擇是否使用偏置。
Gather
Gather層實現了聚集操作,將一個數據tensor,一個索引tensor,一個數據tensor axis作為輸入,利用索引index將資料tensor重建索引。當前,只有TensorRT C++API支援。
LRN
LRN層實現跨通道區域性響應歸一化。
MartrixMultipy
矩陣乘法層實現了一系列的矩陣相乘運算。在乘法運算前可以選擇是否將矩陣轉置。當維度不匹配的時候會進行適當的矩陣擴充套件。
Padding
Padding層實現了tensors的空間0擴充套件。Padding可以是不同維度,不對稱的,也可以是正的(tensor擴充套件結果),或者負的(均值結果)。
Plugin
Plugin層允許使用者實現原生TensorRT不支援的層。
Pooling
Pooling層在通道維度實現池化操作。支援最大池化與均值池化。
Ragged SoftMax
Ragged SoftMax實現了包含不同長度序列tensor的跨通道的Softmax。序列的長度利用另外一個tensor輸入。
Reduce使用降維演算法實現了tensors降維操作。降維運算支援畫素相乘,最大,最小,平均。目前只有TensorRT的C++API支援這個層。
RNN
這個層在RNNV2層出現後已經棄用了,然而還是向下相容。
RNNv2
RNNv2實現了類似遞迴神經網路,GRU,LSTM這樣的遞迴層。當前支援RNN,GPU,LSTM。
Scale
Scale層實現了逐tensor,逐通道,逐權重的仿射變換,與或運算,以及常數冪運算。
Shuffle
Shuffle層用來實現tensors得重新排序,可以用來進行reshape或者資料轉換。
SoftMax
SoftMax實現了跨通道的softmax。
Squeeze
Squeeze層將tensor中維度為1的shape。
TopK
TopK層在一個維度中尋找TopK元素,返回降維的tensor,與一個位置索引的tensor。
Unary
Unary支援元素級的一元操作。支援exp,log,sqrt,recip,abs與neg操作。
注:
BatchNormalization可以利用TensorRT的Scale層實現。
卷積層進行的操作實際上是相關操作。這樣主要是考慮通過TensorRT API匯入權重,而不是通過NVCaffe解析庫。
1.2 關鍵概念
確保你對一下關鍵概念熟悉:
網路結果定義(Network definition)
網路定義有由一系列層與tensors集組成。
層(layer)
每個層根據一系列輸入tensors計算輸出的tensors。層具有一些引數,例如convolution size,stride,filter wights。
Tensor
Tensor既可以是網路的輸入,也可以是輸出。Tensors通過資料型別(data-type)來指定精確度,例如16-bit float或者32bit float。Tensors有三個維度,例如通道(channels),寬(weight),高(height)。輸入tensors的維度由應用決定,輸出的tensor維度由builder推理出來。支援的維度是N(P_1,P_2,P_3)CHW格式,其中P_1,P_2等是索引維。Tensors最多可以有Dims::MAX_DIMENSIONS維度,設為常量8。
Tensors在batch間可見。這樣的tensor的batchsize維度(公式中為N)為1,不管網路在執行的時候batchsize多大。所以,當這個tensor是輸入的時候,他會獨立於batchsize。適當的時候使用的是標準的廣播(broadcasting)規則。
輸入tensor是否在batch間廣播取決於網路定義,輸出tensor則取決於builder。在確保build過程batch中每個元素資料的前提下,builder會將廣播中間與輸出tensors。所以batch間廣播的操作往往會產生tensor在batch間廣播的效果。例如,運算將在廣播前進行,廣播將推到運算鏈裡。如果整個操作鏈都在沒有廣播的狀態下實現,輸出的tensor可能作為一個batch間廣播的掩模,意味著是否在batch間廣播取決於應用需求。
在讀寫batch間廣播的tensor對應記憶體的時候,需要有些特別注意的問題。不管在執行是網路的batchsize是多少,資料都是按照batchsize等於1排列的。因此,batch間共享的tensors比由N個相同資料副本對應N各batch元素的tensors會更加節省記憶體。
每個層與tensor都有一個名字,這些名字在解析或者讀取TensorRT生成日誌的時候有用。
當使用NvCaffeParser時,tensor與layer的名字是根據NVCaffe的prototxt檔案命名。
資料型別(DataType)
Tensors支援的有效資料型別是Kfloat,Khalf,Kint8與Kint32。對於網路輸入來說,需要在設定網路輸入時指定資料型別。其它的tensors型別可以通過tensor中的setType方式實現。輸入與輸出不能是kINT8型別。kINT32表示索引值,Kint8表示編碼成8bit的浮點值。詳見SampleINT8-Calibration 與8-bit Inference,取得更多有關8-bit整形的inference效能。
Broadcasting
Broadcasting當兩個tensor間維度不匹配時起作用。當兩個tensor同個索引的維度長度不等,並且其中一個tensors維度是1,這時broadcasting工作。假設兩個tensor,一個為(N,1,H,W)一個為(1,C,H,W),第二個tensor在batch維度broadcastN次,第一個tensor在channel維度broadcastC次,得到(N,C,H,W)。不是所有層都支援Broadcasting。取得更多NumPy中broadcasting的意義,見Braodcasting。
1.3 TensorRT API’s
TensorRT API允許開發者匯入,校驗,生成與部署優化網路。網路可以直接通過NVCaffe或者其他支援UFF與ONNX格式的框架。也可以通過程式設計的方式,匯入每層與相關引數與權重。
除了主要的C++介面外,TensorRT還帶有python介面。TensorRT的python介面當前支援所有功能。介面通過NumPy格式引入層權重,通過PyCUDA引入輸入輸出資料。還提供了一系列公共函式來解決開發過程中可能會遇到的類似解析NVCaffe模型檔案,從流中解析UFF模型,從UFF檔案中讀寫PLAN檔案這樣的公共問題。這些功能都在tensorrt.utils中實現。
在tensorrt/examples/custom_layers中有python進行使用者自實現層的例子。
注:
要使使用者可以在python介面中使用自己的C++實現,還需要一些額外的依賴項,例如swig>=3.0,libnvinfer-dev。
1.3.1 Python Samples
Python介面支援之前只有C++介面支援的所有功能,包括:
NvCaffeParser
NvUffParser(TensorFlow)
NvONNXParser(Open Neural Network Exchange)
用於圖定義的nvinfer API’s
用於建立高效前向引擎的builder
用於執行的前向運算引擎
用於註冊自實現層的介面
使用者可以在{PYTHON_PACKAGE_DIR}/tensorrt/examples中找到python示例。
TensorRT包自帶一對示例應用實現。如果是TensorRT安裝到系統中則可以找到。
Table1 應用例程位置
想了解更多用python將模型匯入到TensorRT中,請參考NVCaffe Python Workflow,TensorFlow Python Workflow, and Converting A Model From An UnsupportedFramework To TensorRT With The TensorRT Python API。
1.3.2 Python Workflows
Python是一種流行並且通常再資料科學非常高效的語言並且再許多深度學習框架中都有使用。這裡提供一下幾種情況的使用用例
有一個ONNX格式的模型,TensorRT包含了ONNX解析器,使得我們可以直接將模型載入到tensorRT中。
有一個TensorFlow模型,使用者希望使用TensorRT呼叫。
將TensorFlow模型轉為TensorRT格式
有一個NvCaffe模型,希望使用TensorRT呼叫。
將NVCaffe模型轉為TensorRT格式。
開發者希望將TensorRT引擎作為像網站後端這樣大規模的應用。
開發者希望TensorRT呼叫當前UFF不支援的訓練框架訓練的模型或者非NVCaffe訓練出來的模型。
如需瞭解以上用例的詳細步驟,請看NVCaffe Workflow,TensorFlow Workflow, andConverting A Model From An Unsupported Framework To TensorRT With The TensorRTPython API.