如何用GPU加速AI 模型佈署:TensorRT介紹及實作 PART II-實作Caffe模型透過TensorRT轉換
上一篇我們介紹了推論的五大重點以及TensorRT架構 (好文回顧看這裡: https://forums.leadtek.com/tw/post/24)
今天就要帶大家來實作Caffe模型透過TensorRT轉換
在實作前須準備幾項資料,若是從NVIDIA DIGITS實作的模型,可透過NVIDIA DIGITS模型訓練頁面中的Download Model功能下載TensorRT所有需要的資料。
下載模型解壓縮後之檔案
模型檔案解壓縮後,其中包含數個檔案是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進行推論的影片範例。









