tensorRT(一)| tensorRT如何進行推理加速?(建議收藏)


  本文來自公眾號“AI大道理”。

深度學習模型在訓練階段,為了保證前后向傳播,每次梯度的更新是很微小的,這時候需要相對較高的進度,一般來說需要float型,如FP32。

模型在推斷(Inference)的時候只有前向計算,無需回傳,因此可以使用低精度技術,如FP16、INT8、甚至是Bit(0和1),其推理結果沒有特別大的精度損失。使用低精度數據使得模型需要空間減少,計算速度加快。

優化推理引擎TensorRT只能用來做Inference(推理),不能用來進行train。

使用TensorRT,無需在部署硬件上安裝並運行深度學習框架。

 

TensorRT

Tensor表示數據流動以張量的形式。所謂張量可以理解為更加復雜的高維數組,一般一維數組叫做Vector(即向量),二維數組叫做Matrix,再高緯度的就叫Tensor,Matrix其實是二維的Tensor。在TensoRT中,所有的數據都被組成最高四維的數組,如果對應到CNN中其實就是{N, C, H, W},N表示batch size,即多少張圖片或者多少個推斷(Inference)的實例;C表示channel數目;H和W表示圖像或feature maps的高度和寬度。RT表示的是Runtime。

TensorRT 的核心是一個 C++ 庫,可促進對 NVIDIA 圖形處理單元 (GPU) 的高性能推理。它旨在與 TensorFlow、PyTorch、MXNet 等訓練框架以互補方式工作。

TensorRT 通過組合層和優化內核選擇來優化網絡,以改善延遲、吞吐量、電源效率和內存消耗。通過程序指定,它會優化網絡以較低的精度運行,從而進一步提高性能並減少內存需求。

TensorRT 上主要存在以下幾個對象:

  • builder:構建器。搜索cuda內核目錄以獲得最快的可用實現,必須使用和運行時的GPU相同的GPU來構建優化引擎。在構建引擎時,TensorRT會復制權重。創建 config、network、engine 等其它對象的核心類。

  • network:tensorrt 的模型類,其它框架的模型在解析之后將被用於填充(populate) network。

  • config:builder 的配置。

  • OnnxParser:onnx 文件解析類,將 ONNX 文件解析並用於填充 tensorrt network 結構。

  • engine:引擎。不能跨平台和TensorRT版本移植。若要存儲,需要將引擎轉化為一種格式,即序列化,若要推理,需要反序列化引擎。引擎用於保存網絡定義和模型參數。在特定 config 與硬件上編譯出來的計算引擎,且只能應用於特定的 config 與硬件上,支持持久化到本地以便進行發布或者節約下次使用的編譯時間。engine 集成了模型結構、模型參數與最優計算 kernel 配置。同時 engine 與硬件和 TensorRT 版本強綁定,所以要求 engine 的編譯與執行的硬件與 TensorRT 版本要保持一致。

  • context:上下文。創建一些空間來存儲中間值。一個engine可以創建多個context,分別執行多個推理任務。進行 inference 的實際對象,由 engine 創建,與 engine 是一對多的關系。

  • runtime:用於反序列化引擎。

     

TensorRT的使用場景

TensorRT的使用場景很多,服務端、嵌入式端、電腦端都是使用場景。

  • 服務端對應的顯卡型號為A100、T4、V100等。

  • 嵌入式端對應的顯卡為AGX Xavier、TX2、Nano等。

  • 家用電腦端對應的顯卡為3080、2080TI、1080TI等。

顯卡需滿足TensorRT的先決條件,即顯卡計算能力在5.0及以上。

 

TensorRT的優化

TensorRT為了能夠提升模型在英偉達GPU上運行的速度,做了很多對提速有增益的優化。

(1)算子融合(層與張量融合)(剪枝)

簡單來說就是通過融合一些計算op或者去掉一些多余op來減少數據流通次數以及顯存的頻繁使用來提速。

算子融合把一些網絡層進行了合並。在GPU上跑的函數叫Kernel,TensorRT是存在Kernel的調用的。在絕大部分框架中,比如一個卷積層、一個偏置層和一個激活層,這三層是需要調用三次cuDNN對應的API,但實際上這三層的實現完全是可以合並到一起的,TensorRT會對一些可以合並網絡進行合並。目前的網絡一方面越來越深,另一方面越來越寬,可能並行做若干個相同大小的卷積,這些卷積計算其實也是可以合並到一起來做的。

在concat這一層,比如說這邊計算出來一個1×3×24×24,另一邊計算出來1×5×24×24,concat到一起,變成一個1×8×24×24的矩陣,這個叫concat。這層這其實是完全沒有必要的,因為TensorRT完全可以實現直接接到需要的地方,不用專門做concat的操作,所以這一層也可以取消掉。

(2)量化(權重與激活函數校准)

量化即IN8量化或者FP16以及TF32等不同於常規FP32精度的使用,這些精度可以顯著提升模型執行速度,且只下降了一點點精度。

在模型業務部署過程中,采用量化方案來進行模型部署優化有以下三個方面優勢:存儲優勢、計算優勢、通信優勢。

(3)內核自動調整

根據不同的顯卡構架、SM數量、內核頻率等(例如1080TI和2080TI),選擇不同的優化策略以及計算方式,尋找最合適當前構架的計算方式。

Kernel可以根據不同的batch size 大小和問題的復雜程度,去選擇最合適的算法,TensorRT預先寫了很多GPU實現,有一個自動選擇的過程。

(4)動態張量顯存

我們都知道,顯存的開辟和釋放是比較耗時的,通過調整一些策略可以減少模型中這些操作的次數,從而可以減少模型運行的時間。

(5)多流執行

使用CUDA中的stream技術,最大化實現並行操作。

 

TensorRT的流程

TensorRT整個過程可以分三個步驟,即模型的解析(Parser),Engine優化和執行(Execution)。

首先輸入是一個預先訓練好的FP32的模型和網絡,將模型通過parser等方式輸入到TensorRT中,TensorRT可以生成一個Serialization,也就是說將輸入串流到內存或文件中,形成一個優化好的engine,得到優化好的engine可以序列化到內存(buffer)或文件(file),讀的時候需要反序列化,將其變成engine以供使用。然后在執行的時候創建context,主要是分配預先的資源,engine加context就可以做推斷(Inference)。

 

TensorRT的技術路線

TensorRT是由C++、CUDA、python三種語言編寫成的一個庫,其中核心代碼為C++和CUDA,Python端作為前端與用戶交互。當然,TensorRT也是支持C++前端的,如果追求高性能,C++前端調用TensorRT是必不可少的。

當前 TensorRT 支持 ONNX、Caffe 和 UFF 三種類型 Parser。

本文推薦第二條技術路線,基於ONNX路線。該路線提供C++、python接口,深度定制ONNXParser,低耦合封裝,實現YOLOX、YOLO V5等常用模型。

目前TensorRT對ONNX的支持最好,TensorRT-8最新版ONNX轉換器又支持了更多的op操作。而深度學習框架中,TensorRT對Pytorch的支持更為友好。

該路線算子由官方維護,模型可直接到處,方便模型部署與AI算法落地。

整體流程:

  • 使用pytorch訓練模型,生成.pth文件

  • 將.pth文件轉化成onnx模型

  • 在tensorRT中加載onnx模型,並轉化成trt的object

  • 在trt中使用object進行推理

 

總結

 

TensorRT是一個高性能的深度學習推斷(Inference)的優化器和運行的引擎。

TensorRT支持Plugin,對於不支持的層,用戶可以通過Plugin來支持自定義創建。

 TensorRT使用低精度的技術獲得相對於FP32二到三倍的加速,用戶只需要通過相應的代碼來實現。

 

 

 

 

 ——————

淺談則止,細致入微AI大道理

掃描下方“AI大道理”,選擇“關注”公眾號

—————————————————————

  

—————————————————————

投稿吧   | 留言吧

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM