3、环境搭建与工具链:CUDA Toolkit、cuDNN、TensorRT的安装与版本匹配
说实话,环境搭建这事儿,看着简单,坑是真不少。
我见过太多人,代码写得挺溜,结果卡在安装这一步,一卡就是半天。你想想看,兴致勃勃想跑个模型,结果报错说「版本不兼容」,多扫兴。
这一章,我就把这几年的血泪经验摊开来讲。咱们把CUDA Toolkit、cuDNN、TensorRT这三兄弟的安装和版本匹配,一次性捋清楚。
3.1 版本匹配:这是最核心的「潜规则」
先记住一句话:TensorRT的版本,直接决定了你能用哪个CUDA版本。
为什么?因为TensorRT底层大量调用了CUDA的运行时库和cuDNN的算子。版本对不上,轻则报错,重则直接崩掉。
核心原则:
- TensorRT 8.x 系列:对应 CUDA 11.x,cuDNN 8.x
- TensorRT 10.x 系列:对应 CUDA 12.x,cuDNN 9.x
- 千万别跨大版本混搭,比如TensorRT 8配CUDA 12,基本跑不通
我个人习惯,每次装新环境前,先去NVIDIA官网查一下官方兼容性矩阵。别嫌麻烦,这一步省了,后面全是坑。
3.2 CUDA Toolkit 安装:别装「全家桶」
CUDA Toolkit 其实是个大包。里面包含了编译器(nvcc)、运行时库、各种工具。
但说实话,我们做推理部署的,很多时候只需要运行时库就够了。你不需要装那个完整的「开发者套件」,除非你要自己写CUDA kernel。
我的建议:
- 如果你只是跑TensorRT推理:装
cuda-runtime即可 - 如果你要编译自定义算子:装
cuda-toolkit完整版 - 安装路径:默认在
/usr/local/cuda-xx.x,记得配环境变量
我曾经在项目里图省事,直接apt装了个系统自带的CUDA。结果版本是10.2,跟TensorRT 8.5死活对不上。折腾了两小时,最后老老实实去官网下了runfile手动装。
嗯,这里要注意:千万别用系统包管理器装CUDA,除非你确定版本完全匹配。官网的runfile或者deb包,才是最靠谱的。
3.3 cuDNN:那个「复制粘贴」的艺术
cuDNN的安装,说白了就是解压、复制、粘贴。
但很多人就栽在这个「复制粘贴」上。为什么?因为cuDNN的库文件要放到CUDA的安装目录下,版本必须一一对应。
# 下载 cuDNN 的 tar 包后
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
# 复制到 CUDA 目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/
# 给权限
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h
sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*
你看,就这么几步。但有个细节:一定要用 -P 参数保留软链接。cuDNN的库文件有符号链接,丢了的话,TensorRT加载时会报找不到库。
避坑指南:
我曾经有一次,复制时忘了加 -P,结果所有软链接都变成了普通文件。TensorRT启动时直接报 libcudnn.so.8: cannot open shared object file。排查了半天,最后发现是软链接断了。
所以,复制cuDNN时,-P 参数一定不能省。
3.4 TensorRT 安装:两种方式,各有千秋
TensorRT的安装,主要有两种方式:
| 安装方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| tar包解压 | 灵活,可多版本共存 | 需要手动配环境变量 | 开发调试、多项目并行 |
| deb包安装 | 自动配置,省心 | 版本固定,切换麻烦 | 生产环境、单版本使用 |
| pip安装 | 最方便,一行命令 | 只包含Python绑定,缺C++库 | 快速验证、Python项目 |
我个人习惯用tar包。为什么?因为我可以同时保留TensorRT 8.5和10.0两个版本,切换时改一下 LD_LIBRARY_PATH 就行。
你想想看,项目A要用旧版API,项目B要用新版特性。如果装的是deb包,你只能二选一。但tar包,我随时切。
# 解压 TensorRT tar 包
tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
# 设置环境变量(加到 ~/.bashrc 里)
export TRT_ROOT=/path/to/TensorRT-8.6.1.6
export LD_LIBRARY_PATH=$TRT_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$TRT_ROOT/bin:$PATH
3.5 验证安装:别信「感觉」,信命令
装完了,怎么知道对不对?别靠感觉。跑几个命令验证一下。
# 检查 CUDA 版本
nvcc --version
# 检查 cuDNN 版本
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# 检查 TensorRT 版本
trtexec --version
# 或者用 Python
python -c "import tensorrt; print(tensorrt.__version__)"
如果这些命令都能正常输出版本号,那基本就稳了。
一个小技巧:
我每次装完环境,都会跑一遍TensorRT自带的 sample_onnx_mnist 示例。如果能成功推理出数字,说明整个工具链是通的。这一步虽然简单,但能帮你排除90%的环境问题。
3.6 常见问题与排查思路
装环境不出点问题,那都不叫「深度学习部署」。我列几个最常见的,你遇到了可以直接对号入座。
- 报错
libcuda.so.1: cannot open shared object file:显卡驱动没装,或者驱动版本太老。先跑nvidia-smi看看驱动是否正常。 - 报错
libnvinfer.so.8: cannot open shared object file:TensorRT的库路径没加到LD_LIBRARY_PATH里。检查环境变量。 - 报错
CUDA driver version is insufficient:驱动版本低于CUDA Toolkit要求的版本。升级驱动,或者降级CUDA。 - Python import tensorrt 报错:Python绑定没装对。用
pip install tensorrt重新装,或者检查Python路径。
我曾经在客户现场,遇到一个特别诡异的问题:TensorRT能正常编译模型,但一运行就崩。查了两天,最后发现是cuDNN的符号链接指向了错误的版本。嗯,从那以后,我每次装完环境都会用 ldd 检查一下库的依赖关系。
# 检查 TensorRT 依赖的库是否都找到了
ldd $TRT_ROOT/lib/libnvinfer.so | grep "not found"
如果这条命令有输出,说明有库没找到。顺着这个线索去排查,基本都能解决。
3.7 总结:一套「黄金组合」推荐
说了这么多,直接给一套我目前用得最稳的组合:
- CUDA Toolkit:11.8(稳定,兼容性好)
- cuDNN:8.9.7(跟CUDA 11.8完美匹配)
- TensorRT:8.6.1(支持绝大多数模型,API成熟)
- 显卡驱动:>= 525.60.13
这套组合,我在多个项目里验证过,从RTX 3090到A100,都没出过版本兼容问题。
当然,如果你要用最新的特性,比如FP8或者Flash Attention,那得上TensorRT 10.x + CUDA 12.x。但说实话,如果不是必须,我建议你等等。新版本总有些小坑要踩,让社区先趟一遍雷再说。
好了,环境搭建就聊到这儿。下一章,咱们开始真正上手,用TensorRT跑第一个模型。