2. 开发环境搭建:CUDA与cuDNN版本选择、TensorRT安装与验证

好,咱们直接进入正题。环境搭建这事儿,说难不难,说简单吧,我见过太多同学卡在这一步。说白了,TensorRT 是个很挑剔的家伙——版本不对,编译报错;驱动太老,跑不起来。今天我就把这几年的踩坑经验一次性倒给你。

2.1 CUDA 与 cuDNN 版本选择——别盲目追新

先聊 CUDA。很多人一上来就装最新版,觉得越新越好。其实不然。TensorRT 每个版本都有自己支持的 CUDA 范围,你装个 12.5 的 CUDA,但 TensorRT 8.x 最高只支持到 11.x,那就白搭了。

我的建议是:先确定你要用的 TensorRT 版本,再反推 CUDA 版本。比如 TensorRT 8.6 官方支持 CUDA 11.8 和 12.0,那你就选 11.8,因为生态更成熟。

版本搭配速查表(我常用的组合):

TensorRT 版本 推荐 CUDA 版本 推荐 cuDNN 版本
8.4.x 11.6 / 11.7 8.4.x
8.5.x 11.8 8.6.x
8.6.x 11.8 / 12.0 8.9.x
10.0.x 12.2 / 12.4 9.1.x

cuDNN 的选择更简单——跟着 CUDA 走就行。NVIDIA 官网每个 cuDNN 版本都标注了支持的 CUDA 版本,一一对应就好。我个人习惯用 cuDNN 8.9.x 系列,稳定,没出过幺蛾子。

小技巧:装 CUDA 时选「自定义安装」,只勾选「CUDA Runtime」和「Development」组件。Driver 别装——你机器上大概率已经有更新的驱动了,覆盖了反而麻烦。

2.2 TensorRT 安装——tar 包 vs deb 包

TensorRT 官方给了两种安装方式:tar 包和 deb 包。我两种都用过,说说区别。

2.2.1 deb 包安装(适合 Ubuntu 新手)

deb 包最省心。下载对应系统的 .deb 文件,一行命令搞定:

# 安装 TensorRT
sudo dpkg -i nv-tensorrt-local-repo-ubuntu2204-8.6.1-cuda-11.8_1.0-1_amd64.deb
sudo apt-get update
sudo apt-get install tensorrt

# 验证
dpkg -l | grep TensorRT

好处是自动处理依赖,坏处是——嗯,我遇到过几次 repo 密钥过期的问题。那时候 apt update 一直报错,排查了半天才发现是签名问题。

注意:deb 包安装后,头文件和库文件散落在系统目录里。你写 CMakeLists.txt 时 find_package 可能找不到,需要手动设置路径。我曾经因为这个折腾了一下午。

2.2.2 tar 包安装(我推荐的方式)

tar 包更灵活。解压到任意目录,设置环境变量就行。我习惯放在 /opt/tensorrt 下:

# 解压
tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
sudo mv TensorRT-8.6.1.6 /opt/tensorrt

# 设置环境变量(加到 ~/.bashrc 里)
export TRT_ROOT=/opt/tensorrt
export LD_LIBRARY_PATH=$TRT_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$TRT_ROOT/bin:$PATH

# 安装 Python 包(如果你用 Python)
cd $TRT_ROOT/python
pip install tensorrt-8.6.1-cp310-cp310-linux_x86_64.whl

为什么推荐 tar 包?因为你可以同时保留多个版本。比如我机器上同时有 TRT 8.4 和 8.6,切换时改一下环境变量就行。这在做插件兼容性测试时特别有用。

2.3 验证安装是否成功——三步走

装完了别急着写代码。先跑三个验证,确保环境真的通了。

第一步:检查 trtexec 工具

trtexec --version

如果能输出版本号,说明核心库没问题。我记得第一次装完,敲这个命令报「找不到命令」,结果发现是 PATH 没设对。

第二步:检查 Python 绑定

python3 -c "import tensorrt; print(tensorrt.__version__)"

这里容易出问题——Python 版本不匹配。TensorRT 的 whl 包是绑定特定 Python 版本的,比如 cp310 对应 Python 3.10。你如果用的是 3.11,那就装不上。解决办法是:要么换 Python 版本,要么自己从源码编译 whl 包(不推荐,太慢)。

第三步:跑一个简单的推理测试

# 用 trtexec 转换一个 ONNX 模型试试
trtexec --onnx=model.onnx --saveEngine=model.engine --fp16

如果这一步能成功生成 .engine 文件,恭喜你,环境基本稳了。我遇到过最诡异的情况是——转换成功,但推理时结果全错。后来发现是 cuDNN 版本和 TensorRT 不匹配,换了版本就好了。

2.4 常见环境问题排查——我踩过的坑

环境问题千奇百怪,但大部分集中在几个点上。我按频率排个序:

  1. libcudart.so 找不到——LD_LIBRARY_PATH 没设对,或者 CUDA 没装好。检查 /usr/local/cuda/lib64 下有没有这个文件。
  2. GLIBCXX 版本错误——系统 gcc 太老。我建议用 conda 环境,或者升级 gcc 到 9.x 以上。
  3. Python 导入 tensorrt 报错——大概率是 whl 包和 Python 版本不匹配。用 pip list | grep tensorrt 检查一下。
  4. trtexec 运行时报错 cudaErrorInsufficientDriver——NVIDIA 驱动太老。升级驱动到 525 以上版本。
  5. 编译自定义插件时找不到 NvInfer.h——CMakeLists.txt 里没加 include 路径。记得加上 include_directories(${TRT_ROOT}/include)

终极排查大法:如果实在搞不定,用 nvidia-smi 看看驱动版本,用 nvcc --version 看看 CUDA 版本,用 dpkg -l | grep cudnn 看看 cuDNN 版本。三个版本对不上,十有八九是环境问题。我曾经帮一个同学远程排查,发现他装了 CUDA 11.8 但驱动是 470 的——驱动太老,根本跑不了 CUDA 11.x 的程序。

嗯,环境搭建就聊到这儿。下一章咱们开始写第一个 TensorRT 插件,到时候你会觉得——嗯,环境搭好了,后面的事就顺了。