很多人剛接觸深度學習模型部署的時候,都會習慣用 Python,因為訓練的時候就是 PyTorch、TensorFlow 啊,寫起來方便。但一到 實際工程,特別是工業設備、醫療影像、上位機系統這種場景,你會發現大多數人都轉向了 C++ 部署。
1. 為什么是 C++,不是 Python?
主要兩個原因:
第一,穩定性。
上位機的應用,通常整套系統就是 C++ + Qt 寫的,人機界面、相機采集、圖像處理、數據庫都在里面。如果你用 Python,得額外掛一套解釋器和一堆依賴,版本問題、環境沖突、長期維護都會很頭疼。而 C++ 是“直接集成”,一個可執行程序就能跑,風險小得多。
第二,時延。
Python 本身調用底層庫沒什么問題,但整個預處理、后處理、數據搬運環節,Python 這層會有額外開銷。而 C++ 寫法更貼近底層,可以用零拷貝、Pinned memory、CUDA stream 這種手段,推理管線更快、更穩。所以在追求實時性的場景,比如視頻流識別、醫療影像實時分析,C++ 的優勢很明顯。
2. 那么,C++ 里常用的推理框架有哪些?
現在主流的 C++ 部署框架主要分兩類:
通用型的:ONNX Runtime(微軟)、OpenVINO(Intel)、TVM 等。這些框架跨平臺,能在 CPU、GPU、NPU 都跑,兼容性特別好。
硬件專用型的:TensorRT(NVIDIA)、NCNN(騰訊,移動端)、MNN(阿里,移動端)、TNN(騰訊優圖,移動端)。這些就是針對特定硬件做了深度優化。
如果是 PC 上位機,配有 NVIDIA GPU,那幾乎就是 TensorRT 的天下。
3. 為什么 TensorRT 往往比 ONNX Runtime 更快?
這就涉及優化深度的區別了:
算子融合:TensorRT 會把 Conv+BN+ReLU 這種常見組合合成一個 kernel,一次內存讀寫就搞定,而 ORT 沒有這么激進。
精度優化:TensorRT 支持 FP16/INT8 量化,能充分利用 GPU 的 Tensor Core,速度能快一大截。
內存規劃:TensorRT 在構建 engine 的時候,就把整個推理過程的內存生命周期都規劃好了,避免頻繁 malloc/free。ORT 更通用,所以內存管理寬松一些。
內核調度:TensorRT 在構建 engine 時會跑 profiling,根據具體 GPU 和輸入尺寸挑最快的實現。
CUDA Graph:TensorRT 可以錄制推理過程,避免 kernel launch 的開銷。
所以同樣一張卡、同樣一個模型,TensorRT 的延遲和吞吐量通常比 ONNX Runtime 好 30%~70%,有時候甚至幾倍。
4. 那是不是所有上位機都必須用 TensorRT?
大多數情況是這樣,尤其是工業/醫療/科研上位機,有 NVIDIA GPU,追求低延遲和穩定性,TensorRT 是首選。
但也有例外:
如果項目要支持 CPU-only 的設備,TensorRT 就沒法用,只能用 ONNX Runtime 或 OpenVINO。
如果模型里有很多 不兼容的算子,TensorRT 轉換就很麻煩,可能還得寫 plugin。
如果是 研發階段,模型更新頻繁,ONNX Runtime 反而更靈活,調試更快。
如果是 合規性要求,有些行業不想被鎖死在 NVIDIA 生態,也會選更通用的 ORT。
5. 總結
一句話總結:
C++ 部署 是為了穩定、低延遲、好集成。
TensorRT 是在有 NVIDIA GPU 的上位機里幾乎必然的選擇,因為它能把 GPU 的性能榨干。
ONNX Runtime 更適合兼容性強、跨硬件、多平臺的場景。
所以如果你的項目是 上位機 + NVIDIA GPU + 實時要求高,TensorRT 基本就是最佳答案。