以下內容根據個人理解整理而成,如有錯誤,歡迎指出,不勝感激。
0. 寫在前面
由於近期的工作需要用到TensorRT和TensorRT Inference Server,自己也是第一次接觸,因此在這里記錄下相關的學習和使用筆記,內容主要來自於官方相關文檔,如TensorRT Developer Guide等。
本文主要記錄TensorRT相關的基礎知識,主要包括以下幾個方面:
- 什么是TensorRT
- TensorRT的工作原理
- TensorRT學習資源總結
1. 什么是TensorRT
可以把TensorRT看做一個“深度學習框架”,不同於常用的TensorFlow、PyTorch和Caffe等深度學習框架,TensorRT的目的不是如何訓練我們的深度學習模型,而是考慮如何將那些使用其他框架訓練好的模型進行高效快速的Inference。
官方的這張圖可以很明確的說明TensorRT的作用:用於模型訓練完之后的部署階段,以進行高效低延時的Inference:
要注意,TensorRT是NVIDIA配套其相關GPU提供的,並不支持在CPU和其他GPU上使用。
2. TensorRT的工作原理
這里會有疑問:直接使用TensorFlow和PyTorch等模型進行部署不可以嗎?
這當然是可以的,只是TensorRT是一個專用的Inference工具,使用它進行部署會使模型運行更高效。
TensorRT對一個模型主要進行了以下幾點優化(翻譯自官方教程):
- 去除輸出沒有被使用的層
- 去除那些相當於沒用的操作
- 將卷積、偏置和ReLU操作融合在一起
- 聚合那些相似的操作
- 融合殘差層
(以上這些操作中有些並不清楚具體實現原理,后面在使用到時再具體學習)
除了上述對模型整體的優化外,在TensorRT中還可以直接設置權值的精度,如可以進行INT8
或FP16
精度的運算,默認是FP32
精度。當然,低精度帶來速度提升的同時,必然會帶來准確度的損失,在模型部署時可根據需要來權衡。
了解了上述概念,需要考慮下一個問題:通過其他框架訓練好的模型,如何導入到TensorRT中使用?
TensorRT支持TensorFlow、PyTorch,MXNet和Caffe等主流框架模型的導入,支持方式是通過一些通用的模型交換格式作為中間媒介。
TensorRT中有三個Parser用於模型的導入:
- Caffe Parser: 支持Caffe框架模型的導入
- UFF Parser:通用框架格式(UFF)是描述DNN的執行圖的數據格式
- ONNX Parser:通用模型交換格式(ONNX)是一種開放式的文件格式,用於存儲訓練好的模型
需要清楚的是,各種框架間模型的轉換,需要的僅僅是模型的定義及權值。
通過將模型保存為以上三個Parser可以解析的格式,則基本上就可以將模型導入到TensorRT中。
接下來的問題是:模型如何在TensorRT執行Inference?
事實上,一個模型從導入到執行,會經過下面三個階段:
- Network Definition: 這一階段在TensorRT中定義網絡模型,可以使用TensorRT提供的Parser導入已有模型進行定義,也可以使用TensorRT中提供的網絡層來編程定義(這一步應該也需要准備好相關的權值)
- Builder:前面提到過,TensorRT會對模型進行優化,這一步就是配置各項優化參數,並能生成可執行Inference的Engine
- Engine:Engine可理解為一個Builder的實例,是我們導入的模型經過Builder的配置所生成的一個優化過的Inference執行器,所有的Inference可直接調用Engine來執行
通過上面的分析可以有這樣的理解:一個導入的模型可根據不同的Builder配置來生成不同的Engine來執行Inference(同一個Builder可生成多個Engine?)
一個模型從導入到生成Engine是需要花費一些時間的,因此TensorRT提供了Engine的序列化和反序列化操作,一旦我們確定了一個Engine,可以對其進行序列化操作,下次執行Inference時直接反序列化該Engine即可。
3. 其他零碎的東西:
- TensorRT提供了C++接口和Python接口,官方建議使用C++接口
- 一個Engine的建立是根據特定GPU和CUDA版本來的,所以在一個機器上序列化的Engine到另一個機器上不一定能使用,因此在使用Builder生成Engine前,要注意自己的環境配置
- TensorRT可結合DALI(加速數據讀取)和DLA(加速某些層的運算)一起使用
- 對於TensorRT中不支持的層,需要自己編寫相應的文件,TensorRT提供了相關支持
4. TensorRT的獲取及相關學習資源
個人認為使用TensorRT最好的方式就是使用其docker鏡像,需要以下三個步驟:
- 安裝基礎Docker環境
- 安裝nvidia-docker以使docker容器能夠使用GPU
- 獲取TensorRT的docker鏡像
至此便可以使用TensorRT了。
關於TensorRT的學習資源,個人認為官方的一些文檔寫的很詳細,值得學習,個人的這些Blog也大多數來自官方文檔,主要如下:
- TensorRT安裝指南,如果是使用docker的話,這里就不需要看
- TensorRT開發者指南,介紹了TensorRT中的一些原理和概念
- TensorRT實例教程,一些TensorRT中的具體例子,很詳細,覆蓋的也很廣
- TensorRT官方主頁,包括上述鏈接的入口
- TensorRT支持op,介紹了TensorRT對不同模型所支持的相關操作op