环境准备与工具链:TensorRT版本选择(8.x vs 10.x)、CUDA/cuDNN版本兼容性、必备工具
说实话,做推理精度修复这件事,环境搭不对,后面全是白忙活。我见过太多同学花了两周调精度,最后发现是TensorRT版本和CUDA对不上号。嗯,咱们先把地基打牢。
一、TensorRT版本怎么选?8.x还是10.x
这个问题,几乎每期课程都有学员问我。我的建议很直接:生产环境用8.x,尝鲜用10.x。
为什么?我拆开来说。
TensorRT 8.x 系列(推荐生产)
- 生态成熟,社区踩坑多,你遇到的大部分问题都能搜到答案
- 对ONNX opset的支持非常稳定,特别是量化相关的INT8校准
- 我在项目中用8.5.3跑了半年,没出过兼容性问题
TensorRT 10.x 系列(适合探索)
- 引入了新的插件机制,性能确实有提升,大概5%-10%
- 但API变化较大,很多旧代码需要适配
- 我建议:如果你在开发新模型,可以上10.x;如果是维护老项目,老老实实8.x
说白了,选版本就是选稳定性和新特性之间的平衡。我个人习惯是:先看模型,再看环境。如果你的模型用了比较新的算子(比如FlashAttention),那8.x可能不支持,只能上10.x。
二、CUDA/cuDNN版本兼容性——这个坑我踩过
我曾经在一个项目里,TensorRT 8.6配了CUDA 12.0,结果跑量化的时候一直报错。查了两天才发现,官方兼容表里写得很清楚:8.6只支持到CUDA 11.x。
所以,别凭感觉配版本。我整理了一份常用组合,你直接照着来:
| TensorRT版本 | 推荐CUDA版本 | 推荐cuDNN版本 | 备注 |
|---|---|---|---|
| 8.4.x | 11.6 / 11.7 | 8.4 / 8.5 | 最稳的组合,新手首选 |
| 8.5.x | 11.7 / 11.8 | 8.5 / 8.6 | 我项目里用的就是这个 |
| 8.6.x | 11.8 | 8.7 / 8.8 | 注意别上CUDA 12 |
| 10.0.x | 12.0 / 12.1 | 8.9+ | 新特性多,但文档还不全 |
避坑指南:我曾经遇到过cuDNN版本不匹配导致卷积结果错误的情况。精度对不上,不是模型问题,是cuDNN版本问题。所以每次装完环境,先跑一遍官方示例验证一下。
三、必备工具——这三样你得装好
做精度修复,光有TensorRT不够。我平时调试,离不开这三个工具。
1. Polygraphy——精度对比神器
这个工具说白了就是帮你做「跑分」的。它能对比ONNX模型和TensorRT引擎的输出差异,精确到每个张量。
我最常用的命令就这一条:
polygraphy run model.onnx \
--trt \
--onnxrt \
--rtol 1e-03 \
--atol 1e-03 \
--verbose
跑完之后,它会告诉你哪些层的输出偏差超过了阈值。嗯,这就是你修复精度的起点。
小技巧:我习惯把rtol和atol设成1e-03开始,如果报错太多,再放宽到1e-02。先找到问题层,再逐步收紧。
2. trtexec——快速验证引擎
trtexec是TensorRT自带的命令行工具。你想想看,每次改完模型都要写Python脚本去跑,多麻烦。用trtexec一行命令就能搞定。
trtexec --onnx=model.onnx \
--fp16 \
--saveEngine=model.engine \
--verbose \
--dumpLayerInfo
这里有个参数我要特别提一下:--dumpLayerInfo。它能输出每一层的详细信息,包括精度、显存占用。我在排查精度问题时,经常用它来看哪些层被强制用了FP16。
3. ONNX-GraphSurgeon——手术刀级别的修改工具
这个工具厉害了。它能直接修改ONNX图结构,比如删除节点、替换算子、插入量化节点。
举个例子,有一次我发现某个Conv层的输出精度偏差特别大,用GraphSurgeon把它单独拎出来跑FP32:
import onnx_graphsurgeon as gs
import onnx
graph = gs.import_onnx(onnx.load("model.onnx"))
for node in graph.nodes:
if node.op == "Conv" and node.name == "conv_23":
node.attrs["precision"] = "float32"
onnx.save(gs.export_onnx(graph), "model_fixed.onnx")
你看,就这么几行代码,就能把特定层的精度锁定。我在项目中用这招修复过不下10个精度问题。
总结一下这三个工具的分工:
- Polygraphy:告诉你「哪里有问题」
- trtexec:帮你「快速验证」修改效果
- ONNX-GraphSurgeon:让你「动手修」
四、环境验证——装完别急着跑
我每次搭完环境,都会跑一个「冒烟测试」。就三步:
- 用trtexec跑一个简单的ResNet50,看能不能正常生成引擎
- 用Polygraphy对比ONNX和TensorRT的输出,确认精度在1e-03以内
- 跑一遍官方的sampleMNIST,确保所有依赖都正常
这三步走完,基本可以放心开始做精度修复了。别嫌麻烦,我吃过亏——有一次跳过验证,结果调了三天精度,最后发现是cuDNN装错了版本。
最后提醒一句:TensorRT的版本号里,小版本更新也可能引入行为变化。比如8.5.2和8.5.3,对某些算子的优化策略就不一样。所以,锁定小版本号,别随便升级。
好了,环境这块就聊到这儿。下一章咱们开始动手,用Polygraphy定位第一个精度问题。