环境准备与工具链: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:让你「动手修」

四、环境验证——装完别急着跑

我每次搭完环境,都会跑一个「冒烟测试」。就三步:

  1. 用trtexec跑一个简单的ResNet50,看能不能正常生成引擎
  2. 用Polygraphy对比ONNX和TensorRT的输出,确认精度在1e-03以内
  3. 跑一遍官方的sampleMNIST,确保所有依赖都正常

这三步走完,基本可以放心开始做精度修复了。别嫌麻烦,我吃过亏——有一次跳过验证,结果调了三天精度,最后发现是cuDNN装错了版本。

最后提醒一句:TensorRT的版本号里,小版本更新也可能引入行为变化。比如8.5.2和8.5.3,对某些算子的优化策略就不一样。所以,锁定小版本号,别随便升级。

好了,环境这块就聊到这儿。下一章咱们开始动手,用Polygraphy定位第一个精度问题。