
1. 初识trtexec你的TensorRT性能优化瑞士军刀第一次接触trtexec时我正为一个图像识别项目焦头烂额。当时训练好的ONNX模型在测试服务器上跑得比蜗牛还慢直到同事扔给我一行命令试试这个黑魔法工具。这个命令行工具就像TensorRT生态里的多功能军刀不仅能完成模型格式转换还能进行细致的性能剖析和调优。trtexec是NVIDIA TensorRT工具包中的命令行工具专门用于将主流框架模型ONNX/Caffe/UFF转换为TensorRT引擎快速验证模型在目标硬件上的推理性能通过参数微调挖掘GPU的每一分算力与TensorRT的Python API相比trtexec最大的优势在于无需编写代码就能完成完整的工作流。比如你想测试ONNX模型在T4显卡上的INT8量化效果只需要trtexec --onnxmodel.onnx --int8 --best2. 模型转换实战从ONNX到TensorRT引擎2.1 静态batch转换基础操作最常见的场景是把训练好的ONNX模型转为TensorRT引擎。假设我们有个图像分类模型mnist.onnx基础转换命令如下trtexec --onnxmnist.onnx --saveEnginemnist.trt但这样生成的引擎可能不是最优解。我建议新手加上这三个黄金参数trtexec --onnxmnist.onnx \ --explicitBatch \ --workspace2048 \ --best \ --saveEnginemnist_optimized.trt--explicitBatch显式声明batch维度避免后续shape调整的坑--workspace设置临时内存空间单位MB复杂模型需要更大空间--best自动尝试所有精度组合FP32/FP16/INT8寻找最优解2.2 动态shape处理真实场景必备实际部署中输入尺寸往往不固定。比如视频分析场景可能同时处理480p和1080p的帧。这时就需要动态shape支持trtexec --onnxyolov5s.onnx \ --minShapesimages:1x3x320x320 \ --optShapesimages:8x3x640x640 \ --maxShapesimages:16x3x1280x1280 \ --saveEngineyolov5s_dynamic.trt这里有个容易踩的坑三个shape参数必须同时设置且格式要严格遵循维度名称:尺寸的格式。我曾经因为漏写optShapes导致引擎性能下降50%。3. 性能基准测试找出系统瓶颈3.1 基础性能指标获取转换完引擎后第一件事就是跑基准测试trtexec --loadEnginemodel.trt \ --iterations100 \ --duration10 \ --exportTimesperf.json这会输出几个关键指标Latency单次推理耗时msThroughput每秒处理的样本数samples/sGPU Utilization显存和计算单元占用率在我的RTX 3090上测试ResNet50时发现FP16模式比FP32快2.3倍而INT8又能比FP16快1.8倍——这就是--best参数的威力。3.2 多流并发优化当单流无法吃满GPU时可以尝试多流并发。比如处理视频流时# 生成不同batch的引擎 trtexec --onnxmodel.onnx --saveEnginebs1.trt --buildOnly --batch1 trtexec --onnxmodel.onnx --saveEnginebs4.trt --buildOnly --batch4 # 测试不同流组合 trtexec --loadEnginebs1.trt --streams4 trtexec --loadEnginebs4.trt --streams2有个经验公式最佳流数 ≈ GPU SM数量 × 2。比如A100有108个SM可以尝试216个流。但要注意流数过多反而会因为调度开销降低性能。4. 高级调优技巧榨干GPU性能4.1 精度与速度的平衡TensorRT支持混合精度计算通过--fp16和--int8控制。但INT8需要校准数据trtexec --onnxmodel.onnx \ --int8 \ --calib/path/to/calibration/data \ --saveEnginemodel_int8.trt实测发现不是所有模型都适合INT8。像BERT这类NLP模型INT8可能导致精度暴跌。我的调优策略是先用--best自动尝试所有精度对最优结果进行人工验证必要时使用--layerPrecisions逐层指定精度4.2 显存优化技巧大模型常遇到显存不足的问题这几个参数能救命trtexec --onnxlarge_model.onnx \ --workspace4096 \ --minTiming10 \ --avgTiming100 \ --saveEngineoptimized.trt--workspace增大临时内存单位MB--minTiming/avgTiming减少kernel搜索次数--noTF32禁用TF32加速某些显卡需要曾经处理过一个3D分割模型默认参数总是OOM。把workspace从1024调到8192后不仅转换成功推理速度还提升了20%。5. 实战问题排查指南5.1 常见错误与解决方案问题1转换时报错Unsupported ONNX opset version解决方案用--onnxOpSet11指定opset版本问题2动态shape模型推理时shape不匹配解决方案运行时必须用--shapes指定具体shapetrtexec --loadEnginedynamic.trt --shapesinput:1x3x256x256问题3INT8精度损失严重解决方案增加校准数据量或使用--calibCache复用校准缓存5.2 调试信息获取当遇到诡异问题时这些调试选项很有用trtexec --onnxproblem_model.onnx \ --verbose \ --exportProfileprofile.json \ --exportLayerInfolayers.json--verbose打印详细日志--exportProfile输出各层耗时--exportLayerInfo保存层结构信息有次遇到模型转换成功但推理结果全错的情况通过分析layer信息发现是某个自定义插件未正确加载。6. 生产环境部署建议6.1 引擎兼容性处理不同GPU架构生成的引擎不能混用。我习惯用这样的命名规则model_arch_precision.trt例如Ampere架构FP16引擎resnet50_a100_fp16.trtTuring架构INT8引擎yolov4_t4_int8.trt6.2 性能监控方案长期运行的推理服务需要监控trtexec --loadEngineservice.trt \ --iterations0 \ --duration0 \ --spin \ --exportTimesmonitor.csv--spin持续运行不退出--exportTimes定期保存性能数据配合PrometheusGrafana可以打造完整的性能监控看板。