[ 教學 ]  如何用GPU加速AI 模型佈署:TensorRT介紹及實作 PART I
  回覆文章總數:

如何用GPU加速AI 模型佈署:TensorRT介紹及實作 PART I

  By : Leadtek AI Expert     592

先前的文章都是針對模型建置相關介紹及說明,但模型完成時實際要應用也是一門學問。


這次我們將會分成兩篇文章為大家介紹TensorRT架構與實作


當影像資料輸入進模型時,需經過層層已經過優化的權重隱藏層,最後得到一個輸出結果,此過程我們稱為推論(inference)。推論過程依照模型參數量而有不同,耗費的時間可能也在數秒鐘左右。若您的應用有計算時間的限制,也就是影像輸入到輸出的花費的時間需要更短,是否也能透過GPU達到效能要求呢?答案是肯定的。我們可以使用GPU將耗費時間且繁複的模型訓練時間縮短,也同樣可透過GPU縮短推論時間。

圖片來源(NVIDIA官方網站)

模型開發人員可透過cuDNN函式庫及相關的GPU函式庫如cuBLAS、cuSPARSE或cuFFT等,在不同深度學習的框架(framework)都可以利用GPU進行模型訓練的優化。

至於推論呢?本篇要介紹一個同樣由NVIDIA開發的SDK TensorRT。TensorRT 的方法主要是透過轉換精度(單精度浮點數、半精度浮點數或8-bit整數),並改進延遲 (latency)、吞吐量 (throughput) 和效率 (efficiency)。現今TensorRT已經有支援多個框架,可透過 python /C++ 的API進行轉檔產生 TensorRT 模型,如 Caffe、TensorFlow、PyTorch、Chainer 和 MxNet,而 Tensorflow 更已經將 TensorRT 整合在框架中。除了 Caffe 可以直接使用 TensorRT Parser (模型解析器) 進行轉換,其餘的框架需先轉成 ONNX 通用格式再用 TensorRT Parser 進行轉檔。


推論須注意的五大事項

  • 提高吞吐量:在某個時刻能輸出多少量,在這裡是指 inference/second 或是 samples/second,這對每台機器是否能高效的運作至關重要。
  • 提高運算效率:每台司服器的硬體規個都是固定的情況下,為提高吞吐量,增加軟體運行的效率。
  • 降低延遲:執行推論的時間通常以毫秒為單位,低延遲不但可以降機整體預測的時間,也增加軟體的流暢度。
  • 維持正確率:一個訓練過後的神經網路用於推論時,即便經過降低精度或剪枝(channel pruning)的情況下,依然能正確預測的能力。
  • 降低GPU記憶體使用率:系統在部屬神經網路模型時,如模型太大會導致占用到太多記憶體,有效降低模型占用的記憶體資源也非常重要。


推論工作進行時,若五大事項內缺少一項,都可能會因硬體能力不足或系統滿載造成運算效率不佳或推論正確率不好。所以能有有效的推論工具,對於應用是否能落地是非常重要的。TensorRT同時具備了上述五項優點,除了前三項外,TensorRT可在維持幾乎相同的正確率(僅降低約0.2%)情況下進行推論,並且透過RTX Quadro支援半精度浮點數或8-bit整數,可大幅降低記憶體使用率。以下將透過GoogLeNet的Inception層,說明TensorRT是如何進行模型優化的。

 

原始GoogLeNet中Inception架構


相信熟悉模型架構的人都很清楚,GoogLeNet的概念是為了解決傳統深度網路在網路加深時容易遇到的兩大問題:過度擬合(over fitting)及計算量增加。在透過網中網(network in network)的概念增加了網路的深度,但卻減少了參數量。網路中採用了1x1、3x3和5x5的卷積核(convolution kernel)和3x3的最大池化(max pooling)。當然,本篇不會對GoogLeNet架構詳加說明,而是說明TensorRT轉換GoogLeNet的過程。

 

TensorRT將Inception進行合併


卷積核部分會有三層: ReLU、bias、conv. 這邊將三層合併 (如上圖CBR) 使用單個核(kernel)執行, 這邊可以比喻成我們買三個東西原本是分開結帳,而TensorRT 改成三個東西一起結帳。

 

TensorRT將1x1 CBR進行合併


而 TensorRT也可以認得共享相同input 數據以及filer 大小,但是不同權重的隱藏層,如1x1 conv. 將其合併成1x1 CBR,將它們水平融合為單一個較寬的核所執行。

 

TensorRT優化網路架構取消concat層


接著TensorRT完全可以直接接到需要的地方,不用專門做concat的操作,所以這一層也可以取消掉。此過程可以看到兩個框框彼此之間是不相關的,因此我們可以單獨啟用兩個計算流(stream),分別運算。而上圖也是TensorRT針對Inception層網路優化的結果,此過程稱為網路隱藏層融合(fusion layers of network)。網路在經過此過程後,都可有效降低隱藏層的數量,也表示減少計算量。


Network

Layers

Layers after fusion

VGG194327
Inception V3
309113
ResNet 152
670159

Data Source


而經過TensorRT優化後模型的效能,由下圖可知。實際來看NVIDIA在GitHub所提供的實際數據,表示TensorRT大約快1.5-4倍。此為透過TensorRT轉換TensorFlow上的常用於NLP(Natural Language Processing)領域的BERT(Bidirectional Encoder Representations from Transformers)語言模型。


甚麼~這樣就結束了嗎? 

別急別急, 下篇文章會分享Caffe模型透過TensorRT轉換實作哦


12/25新文章預告:

如何用GPU加速AI 模型佈署:TensorRT介紹及實作 PART II-實作Caffe模型透過TensorRT轉換

別忘了12/25回來觀看下集

以下是回覆文