很多人刚接触深度学习模型部署的时候,都会习惯用 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 基本就是最佳答案。