tensor RT/onnx runtime 進行cpu/gpu 推理加速/模型部署
TensorRT,由NVIDIA精心打造,是一款專為深度學習推理任務設計的高效優化工具。它能夠顯著降低應用的延遲同時提升處理速度,是大規模數據中心、嵌入式設備以及自動駕駛技術等領域推理加速的理想選擇。TensorRT的兼容性廣泛,支持包括TensorFlow、Caffe、Mxnet和Pytorch在內的主流深度學習框架,與NVIDIA GPU的結合使用。
TensorRT本質上是一個推理加速器,它允許用戶在模型訓練完成后,直接將模型文件導入TensorRT進行優化,無需再依賴原始的深度學習框架。
模型訓練:需要fp32,避免梯度下溢和舍入誤差
梯度下溢:當梯度值非常小(小于 ~6e-8)時,在FP16中會變成0(即下溢)。一旦梯度變為0,對應的參數就無法更新,學習過程會停滯。
舍入誤差:在FP16中,由于精度有限,很多微小的更新(比如用一個很小的學習率乘以一個很小的梯度)可能會因為舍入誤差而直接變為0。在數百萬次的迭代中,這些微小的誤差累積起來可能會導致模型無法收斂,或者收斂到一個很差的局部最優點。
模型推理:不涉及到反向傳播(梯度計算),只需fp16
在FP32下訓練好的模型,其權重和激活值的分布通常在一個合理的范圍內。將其轉換為FP16進行推理,對于絕大多數任務(如圖像分類、目標檢測、語音識別等)的最終輸出精度影響微乎其微,通常只有小數點后幾位的損失,但換來的卻是巨大的速度提升和資源節省。
TensorRT 采用多種優化技術來提升深度學習模型的推理性能:
1、層間融合技術:
TensorRT 通過層間融合,將卷積層、偏置層和ReLU激活層合并為單一的CBR結構,實現橫向和縱向的層融合。橫向融合將這些層合并為單一操作,僅消耗一個CUDA核心,而縱向融合則將具有相同結構但不同權重的層合并成更寬的層,同樣只占用一個CUDA核心。這種融合減少了計算圖中的層數,降低了CUDA核心的使用量,從而使得模型結構更加緊湊、運行速度更快、效率更高。
2、數據精度優化:
在深度學習模型訓練過程中,通常使用32位浮點數(FP32)來保證精度。然而,在推理階段,由于不需要進行反向傳播,可以安全地降低數據精度至FP16或INT8,這不僅減少了內存占用和延遲,還使得模型體積更小,提高了推理速度。
3、Kernel自動調優:
TensorRT 能夠自動調整CUDA核心的計算方式,以適應不同的算法、模型結構和GPU平臺。這種自動調優確保了模型在特定硬件上以最佳性能運行。
TensorRT 部署流程主要有以下五步:
1.訓練模型
2.導出模型為 ONNX 格式
3.選擇精度
4.轉化成 TensorRT 模型
5.部署模型
Pytorch → ONNX → TensorRT
| 特性/維度 | PyTorch (直接推理) | ONNX Runtime (ONNX Runtime) | TensorRT |
|---|---|---|---|
| 核心定位 | 研究與訓練框架,兼顧推理 | 跨平臺高性能推理引擎 | NVIDIA平臺極致性能推理SDK |
| 工作流程 | torch.jit.trace 或 torch.jit.script 導出模型 -> 用PyTorch C++/Python加載推理 |
PyTorch/TF等 -> 導出ONNX模型 -> ONNX Runtime加載并推理 | PyTorch/TF/ONNX -> 轉換和優化 -> 生成TensorRT引擎 -> 執行引擎 |
| 性能 | 較好。利用了PyTorch的優化,但包含一些為訓練準備的冗余操作。 | 優秀。專為推理優化,支持圖優化、算子融合等,性能通常優于原生PyTorch。 | 極致。在NVIDIA GPU上通常是性能天花板。通過內核融合、量化、自動內核調優等技術達到最優。 |
| 硬件支持 | 主要支持CPU和NVIDIA GPU(通過CUDA)。對其它硬件(如AMD GPU, NPU)支持有限或需要額外適配。 | 非常廣泛。通過Execution Providers機制,支持CPU、NVIDIA CUDA/TensorRT、AMD ROCm、Intel OpenVINO、ARM NN、Android NNAPI等。“一次轉換,多處運行”。 | 僅限NVIDIA GPU。包括GeForce, Tesla, Jetson等系列。 |
| 易用性與靈活性 | 最高。直接在訓練框架內完成,調試方便,動態圖模型(如帶有控制流的)處理起來更自然。 | 高。ONNX是一個開放的標準,生態龐大。轉換過程可能遇到不支持的算子,需要一些調試。 | 較低。優化和構建引擎需要時間,過程像是一個“黑盒”,調試難度較大。量化等操作可能會引入精度損失。 |
| 關鍵技術 | TorchScript, torch.jit |
ONNX格式、圖優化、多種Execution Providers | 層與內核融合、精度校準(INT8量化)、內核自動調優、動態Tensor優化 |
| 典型應用場景 | 1. 研究原型快速驗證 2. 對延遲不敏感的服務器端應用 3. 需要利用PyTorch動態圖特性的場景 |
1. 需要跨平臺部署(如同時部署在服務器CPU和邊緣設備) 2. 希望獲得比原生框架更好的性能,同時又不想被單一硬件廠商鎖定 3. 云原生和微服務環境 |
1. 對延遲和吞吐量要求極致的場景(如自動駕駛、視頻直播、高并發推薦系統) 2. 邊緣設備(NVIDIA Jetson) 3. 需要INT8量化來大幅提升性能并降低功耗的場景 |
PyTorch 部署推理
-
本質:使用訓練框架本身進行推理。
-
優點:
-
無縫銜接:無需模型轉換,直接從訓練環境到推理環境,減少了轉換出錯的風險。
-
調試方便:可以使用熟悉的PyTorch工具和API進行調試。
-
-
缺點:
-
性能非最優:PyTorch為了支持訓練,保留了很多在推理時不需要的操作和內存布局,這帶來了額外的開銷。
-
依賴較重:需要安裝完整的PyTorch庫,可能不適用于非常輕量級的部署。
-
硬件支持局限:主要圍繞NVIDIA GPU和CPU。
-
ONNX Runtime 部署推理
-
核心:ONNX (Open Neural Network Exchange)
ONNX是一個開放的模型表示標準。它定義了一個通用的計算圖格式,使得不同框架訓練的模型可以被各種推理引擎所使用。 -
優點:
-
硬件無關性與生態:其最大的價值在于解耦了模型和硬件。你可以將一個ONNX模型部署到幾乎任何主流的硬件平臺上,只需切換ONNX Runtime的Execution Provider即可。
-
性能良好:作為一個專業的推理引擎,它進行了大量圖級別的優化(如常量折疊、冗余節點消除等),去除了訓練帶來的開銷。
-
-
挑戰:
-
轉換支持:并非所有PyTorch/TensorFlow的算子都能完美地轉換為ONNX格式,有時會遇到不支持的算子或需要自定義。
-
性能非極致:雖然性能很好,但由于要兼顧通用性,它無法像TensorRT那樣為特定型號的GPU進行極其深入的底層優化。
-
TensorRT 部署推理
-
核心:針對NVIDIA GPU的編譯器
TensorRT不是一個簡單的推理器,而是一個深度學習優化器和運行時引擎。它的工作流程是:將你的模型(如ONNX)作為輸入,然后進行一系列極其激進的優化,最終生成一個高度優化的、序列化后的計劃文件(Plan File),這個文件就是TensorRT引擎。 -
優化技術包括:
-
層融合:將多個層(如Conv、BN、ReLU)合并成一個單一的、更高效的內核。這大大減少了內核啟動次數和內存讀寫操作。
-
精度校準:在保證精度損失可接受的前提下,將FP32模型轉換為FP16甚至INT8,從而顯著提升速度并降低顯存占用。
-
內核自動調優:針對你當前使用的特定GPU型號,自動選擇最優的內核實現。
-
-
優點:
-
極致性能:在NVIDIA GPU上,其性能通常是所有方案中最好的。
-
低延遲/高吞吐:特別適合實時應用和高并發場景。
-
-
缺點:
-
供應商鎖定:僅限NVIDIA硬件。
-
構建耗時:引擎構建(特別是開啟所有優化選項時)可能需要較長時間。
-
復雜度與調試:優化過程是個黑盒,量化可能帶來精度問題,調試比較困難。
-
部署方案:
使用 ONNX Runtime 作為頂層的推理接口。
在安裝了NVIDIA GPU的機器上,為ONNX Runtime配置 TensorRT Execution Provider。
這樣,你的代碼只需調用ONNX Runtime的API,當它在有NVIDIA GPU的環境中運行時,會自動調用底層極速的TensorRT引擎,而在其他環境(如只有CPU)時,則回退到CPU或其他EP。這實現了 “一套代碼,多種部署” 的理想狀態。
ONNX Runtime 的 TensorRT EP 作為一個抽象層,自動處理了所有底層的 TensorRT 操作:
| 操作 | 傳統 TensorRT | ONNX Runtime + TensorRT EP |
|---|---|---|
| 引擎構建 | 需要手動調用 builder.build_engine() |
自動處理 |
| 序列化 | 需要手動保存/加載 .engine 文件 |
自動處理(通過緩存) |
| 優化配置 | 需要手動設置 builder_config |
通過 Provider 選項配置 |
| 上下文管理 | 需要手動創建 execution_context |
自動管理 |
import onnxruntime as ort # 這一切都是自動的! trt_options = { 'trt_fp16_enable': True, 'trt_engine_cache_enable': True, 'trt_engine_cache_path': './trt_cache' } session = ort.InferenceSession( "model.onnx", providers=['TensorrtExecutionProvider'], provider_options=[trt_options] ) # 背后自動發生: # 1. 解析 ONNX 模型 # 2. 調用 TensorRT builder # 3. 構建優化引擎 # 4. 序列化并緩存(如果啟用)

浙公網安備 33010602011771號