[ 教學 ]  如何用GPU加速AI 模型佈署:TensorRT介紹及實作 PART II-實作Caffe模型透過TensorRT轉換
  回覆文章總數:

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

  By : Leadtek AI Expert     474

上一篇我們介紹了推論的五大重點以及TensorRT架構 (好文回顧看這裡: https://forums.leadtek.com/tw/post/24)

今天就要帶大家來實作Caffe模型透過TensorRT轉換


在實作前須準備幾項資料,若是從NVIDIA DIGITS實作的模型,可透過NVIDIA DIGITS模型訓練頁面中的Download Model功能下載TensorRT所有需要的資料。

 NVIDIA DIGITS畫面示意

 

下載模型解壓縮後之檔案



模型檔案解壓縮後,其中包含數個檔案是TensorRT所需要的輸入檔,包含:

  • 網路架構檔:固定檔名為deploy.prototxt
  • 網路權重檔:名稱不固定,但固定副檔名為caffemodel
  • 影像平均檔:固定檔名為mean.binaryproto,若模型訓練時有進行減去平均計算,則需要附上此檔案,以確保輸出結果正確
  • 輸出節點名稱:分類問題通常為softmax
  • 影像解析度:訓練模型時,一開始輸入之影像的解析度


準備完成後,接著開啟TensorRT的環境,建議至NVIDIA NGC網站下載最新的TensorRT (https://ngc.nvidia.com/)。當然,此動作需要使用Docker engine作為開發平台。


接著至主程式加入上述檔名及設定。OUTPUT_NAME為模型輸出的形式,因為是分類問題,所以會設定為機率型態的prob。INPUT_SHAPE則表示輸入影像的解析度(通道數, x, y),而DTYPE部分設定為原始模型使用的運算精度。

 


下一步為建置TensorRT引擎,包含設置workspace部分的builder.max_workspace_size = GiB(1);設定轉換精度builder.fp16_mode = True;輸入及轉換模型語法model_tensors = parser.parse(deploy=deploy_file, model=model_file, network=network, dtype=ModelData.DTYPE);以及給定模型輸出名稱network.mark_output(model_tensors.find(ModelData.OUTPUT_NAME))



接著透過TensorRT內部引擎使用pycuda進行記憶體管理及平行化運算流程的優化,裡面同時使用了CUDA中Page-Locked方法及CUDA Stream方法,目的都是在加速運算流程和減少資料輸入/輸出到GPU時的延遲情況。



最後在下圖區塊設定輸入影像的處理方式,將影像轉成從三維陣列轉成一維的向量(normalize_image),並將一維向量的陣列複製到pagelocked_buffer (h_input),轉換前還會先將影像資料減去影像平均檔進行正規化。



程序在下圖區塊會將資料傳到GPU。並且將預測結果回從GPU回傳到CPU端。



最後將TensorRT模型儲存後,設定即大功告成。



而要讀取時則要使用下圖語法讀入 



實測Caffe使用tensorRT可比單純使用GPU進行推論快約3倍。


以下提供利用OpenCV讀入WebCam擷取影像後,再透過TensorRT進行推論的影片範例。



以下是回覆文