
DETR聊完了这篇讲目标检测的部署。模型训练得再好部署不上去就是白搭。TensorRT是NVIDIA的高性能推理引擎在Jetson和GPU上部署目标检测模型TensorRT几乎是标配。很多工程师会训练模型但不会部署。面试的时候能把训练→导出→转换→优化→部署的全流程讲清楚特别是部署阶段遇到的坑和解法非常加分。这说明你不只是个算法工程师还是个能把东西落地的人。一、TensorRT是什么TensorRT是NVIDIA推出的深度学习推理优化器。它做的事情是把你训练好的模型PyTorch/TensorFlow转换成TensorRT引擎在NVIDIA硬件上高效推理。TensorRT的优化包括算子融合把多个小算子合成一个大算子减少内存读写、精度校准FP32→FP16/INT8量化、内存优化复用buffer、kernel自动调优针对具体硬件选最优实现。这些优化加起来推理速度通常能提升2-5倍。# TensorRT部署流程概要 # 1. PyTorch模型 → ONNX # 2. ONNX → TensorRT engine # 3. TensorRT engine → 推理TensorRT支持的目标检测模型YOLO系列v5/v7/v8/v10、SSD、Faster R-CNN、DETR等。几乎所有主流检测模型都能部署到TensorRT上高效推理。二、模型导出与转换部署的第一步是把PyTorch模型导出为ONNX格式。ONNX是通用的模型交换格式TensorRT支持从ONNX导入。# PyTorch导出ONNX import torch model load_yolov5() dummy_input torch.randn(1, 3, 640, 640).cuda() torch.onnx.export(model, dummy_input, yolov5.onnx, opset_version12, # opset版本影响算子支持 input_names[images], output_names[output])导出ONNX时常见的坑自定义算子不被ONNX支持需要注册自定义算子或者用等价的标准算子替代、动态shape不支持TensorRT对动态shape支持有限推荐用固定shape、某些PyTorch操作在ONNX里语义不同比如NMS的实现。ONNX转TensorRT引擎# ONNX转TensorRT引擎 import tensorrt as trt logger trt.Logger(trt.Logger.INFO) builder trt.Builder(logger) network builder.create_network( 1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser trt.OnnxParser(network, logger) parser.parse_from_file(yolov5.onnx) config builder.create_builder_config() config.set_flag(trt.BuilderFlag.FP16) # 开启FP16 engine builder.build_engine(network, config)转换过程中可能遇到算子不支持的问题。TensorRT不支持的算子需要用Plugin来实现。NVIDIA官方提供了一些常用Plugin如BatchedNMSPlugin社区也有不少第三方Plugin。实在不行就修改模型结构用TensorRT支持的算子替代。三、精度校准TensorRT支持三种精度FP32默认、FP16、INT8。FP16几乎不掉精度推理速度翻倍。大多数场景直接开FP16就行。Jetson平台尤其推荐——Jetson的GPU对FP16有硬件加速。INT8速度提升4倍但需要校准。校准需要准备一批有代表性的数据通常100-500张TensorRT用这些数据确定每层激活值的范围然后做量化。校准数据的质量直接影响量化后的精度。# INT8校准器 class Calibrator(trt.IInt8EntropyCalibrator2): def __init__(self, calibration_data): self.data calibration_data self.index 0 def get_batch(self, *args): if self.index len(self.data): batch self.data[self.index] self.index 1 return [batch.ptr] return NoneINT8量化的难点在于某些层对量化敏感比如第一层和最后一层需要保持FP16。TensorRT的per-layer quantization可以解决这个问题但需要反复实验找到最优的混合精度配置。四、推理流程TensorRT引擎构建好后推理流程很直接分配内存→拷贝数据→执行→读取结果。# TensorRT推理 context engine.create_execution_context() # 分配输入输出buffer d_input cuda.mem_alloc(input_size) d_output cuda.mem_alloc(output_size) # 拷贝输入数据 cuda.memcpy_htod(d_input, host_input) # 执行推理 context.execute(1, [d_input, d_output]) # 读取结果 cuda.memcpy_dtoh(host_output, d_output)关键优化点内存预分配——不要在每次推理时重新分配内存启动时分配好并复用。异步执行——用CUDA stream实现数据拷贝和推理的流水线并行。batch推理——一次推理多张图片提高GPU利用率。Python推理适合原型验证生产环境推荐用C。C推理比Python快30%-50%省去了Python的解释器开销和数据序列化开销。TensorRT的C API和Python API功能完全一致。五、面试高频追问QTensorRT为什么比PyTorch快A三个原因。算子融合——多个小算子合成一个减少kernel launch和内存读写开销。精度优化——FP16/INT8减少计算量和内存带宽。kernel自动调优——针对具体GPU型号选择最优的卷积实现。PyTorch是通用框架TensorRT是针对NVIDIA硬件的深度优化。Q部署YOLOv5到TensorRT有哪些坑A最大的坑是NMS。YOLOv5的NMS在PyTorch里是动态的输出数量不固定TensorRT需要静态shape。解决方案是用TensorRT的BatchedNMSPlugin或者把NMS改成固定输出数量不足的部分填-1。另一个坑是Silu激活函数老版本TensorRT不支持需要自己写Plugin或者换成ReLU。Q怎么验证TensorRT部署后的精度A用同一批测试数据分别在PyTorch和TensorRT上推理对比输出结果。FP16的精度差异通常在0.1%以内INT8的差异可能在1-2%。如果差异太大检查ONNX导出是否正确、量化校准数据是否有代表性。TensorRT是目标检测部署的核心工具。模型导出转换、精度校准策略、推理流程优化这三个方面掌握了你就能把检测模型真正跑在NVIDIA硬件上。部署能力是区分算法工程师和落地工程师的重要标志。下一篇我们聊语义分割FCN和DeepLab。目标检测TensorRT部署是模型落地的关键环节。TensorRT原理与流程、模型导出与转换、精度校准策略、推理优化实战这四个维度覆盖了部署的核心内容。上一篇第290篇 DETR下一篇聊语义分割FCN/DeepLab。如果这篇文章对你有帮助欢迎点赞支持一下你的鼓励是我持续更新的动力