2、环境搭建:CUDA、cuDNN、TensorRT、PyTorch的版本匹配与安装

说实话,环境搭建这一步,劝退了至少一半想入门TensorRT的人。

我见过太多同学,代码写得挺溜,结果一跑就报错。一看日志,全是版本冲突。CUDA版本不对,cuDNN没对上,PyTorch和TensorRT互相不认。嗯,这感觉我太熟了。我自己刚入行那会儿,光装环境就折腾了两天。

所以这一章,咱们就把这事彻底捋清楚。你跟着我的节奏来,保证一次过。

2.1 版本匹配:核心原则

说白了,TensorRT的版本匹配,就是一场「三方会谈」。CUDA是底层驱动,cuDNN是加速库,PyTorch是上层框架。TensorRT夹在中间,必须跟两边都谈拢。

我个人的习惯是:先定TensorRT版本,再定CUDA,最后定PyTorch。为什么?因为TensorRT对CUDA的依赖最严格,PyTorch反而相对灵活。

核心原则:

  • TensorRT 8.x 要求 CUDA 11.x
  • TensorRT 10.x 要求 CUDA 12.x
  • cuDNN版本必须与CUDA大版本一致
  • PyTorch的CUDA版本必须≤系统CUDA版本

举个例子。我最近一个项目用的是TensorRT 8.6,系统CUDA是11.8。PyTorch我选了1.13.1,对应的CUDA也是11.7。你看,PyTorch的CUDA版本比系统低一点,完全没问题。但反过来就不行。

2.2 推荐版本组合

这里我直接给出一张表。这是我在多个项目中验证过的组合,你照着选就行。

TensorRT版本 CUDA版本 cuDNN版本 PyTorch版本 适用场景
8.4 GA 11.6 / 11.7 8.4 1.12.x / 1.13.x 稳定生产,兼容性好
8.5 GA 11.8 8.6 1.13.x / 2.0.x 推荐,性能均衡
8.6 EA 11.8 / 12.0 8.7 2.0.x / 2.1.x 尝鲜,支持新特性
10.0 GA 12.2 8.9 2.1.x / 2.2.x 最新,但生态较新

我的建议:如果你刚开始学,直接用TensorRT 8.5 + CUDA 11.8 + PyTorch 1.13.1。这套组合最稳,网上资料也多,遇到问题好搜。

2.3 安装步骤详解

2.3.1 检查现有环境

别急着装。先看看你机器上有什么。

# 检查CUDA版本
nvcc --version

# 检查cuDNN版本
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

# 检查PyTorch版本
python -c "import torch; print(torch.__version__)"

# 检查显卡驱动
nvidia-smi

我曾经遇到一个坑:nvidia-smi显示的CUDA版本是12.0,但nvcc --version显示的是11.8。为什么?因为驱动和CUDA Toolkit是两回事。nvidia-smi看的是驱动支持的CUDA版本,nvcc看的是实际安装的Toolkit。你装TensorRT时,要以nvcc的版本为准。

2.3.2 安装CUDA

去NVIDIA官网下载runfile。我建议用runfile,别用deb。为什么?因为runfile可以指定安装路径,方便多版本共存。

# 下载CUDA 11.8 runfile
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run

# 运行安装,注意不要安装驱动
sudo sh cuda_11.8.0_520.61.05_linux.run --toolkit --silent --override

注意:安装时取消勾选Driver选项。你的显卡驱动应该单独管理,别让CUDA安装包覆盖了。

装完后配置环境变量:

# 在 ~/.bashrc 中添加
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

# 生效
source ~/.bashrc

2.3.3 安装cuDNN

cuDNN需要注册NVIDIA账号才能下载。你下载对应CUDA 11.8的版本就行。

# 解压
tar -xzvf cudnn-linux-x86_64-8.6.0.163_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 /usr/local/cuda-11.8/lib64/libcudnn*

验证一下:

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

2.3.4 安装TensorRT

TensorRT我推荐用tar包安装。别用pip,pip版本经常缺东西。

# 下载TensorRT 8.5 GA tar包
# 解压
tar -xzvf TensorRT-8.5.3.1.Linux.x86_64-gnu.cuda-11.8.cudnn8.6.tar.gz

# 移动到合适位置
sudo mv TensorRT-8.5.3.1 /usr/local/

# 配置环境变量
export LD_LIBRARY_PATH=/usr/local/TensorRT-8.5.3.1/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/TensorRT-8.5.3.1/bin:$PATH

安装Python包:

cd /usr/local/TensorRT-8.5.3.1/python
pip install tensorrt-8.5.3.1-cp38-none-linux_x86_64.whl

小技巧:装完后运行 python -c "import tensorrt; print(tensorrt.__version__)" 验证。如果报错,八成是libnvinfer.so没找到。检查一下LD_LIBRARY_PATH。

2.3.5 安装PyTorch

PyTorch的安装最灵活。直接用pip,指定CUDA版本就行。

# 安装PyTorch 1.13.1,对应CUDA 11.7
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117

验证:

python -c "import torch; print(torch.cuda.is_available()); print(torch.version.cuda)"

输出True就对了。

2.4 常见问题与避坑

这里我总结几个高频问题,都是我在项目中踩过的坑。

问题1:TensorRT报错 "libnvinfer.so.8: cannot open shared object file"

原因:LD_LIBRARY_PATH没设置对。检查一下TensorRT的lib目录是否在路径中。

解决:export LD_LIBRARY_PATH=/usr/local/TensorRT-8.5.3.1/lib:$LD_LIBRARY_PATH

问题2:PyTorch能检测到CUDA,但TensorRT报CUDA版本不匹配

原因:PyTorch用的是自己的CUDA runtime,跟系统的CUDA Toolkit版本可能不同。

解决:确保PyTorch的CUDA版本 ≤ 系统CUDA版本。比如系统是11.8,PyTorch用11.7就没事。

问题3:安装cuDNN后,运行TensorRT报错 "CUDNN_STATUS_NOT_INITIALIZED"

原因:cuDNN文件权限不对,或者版本不匹配。

解决:检查 chmod a+r 是否执行了。另外确认cuDNN版本跟CUDA大版本一致。

2.5 验证环境是否就绪

最后,跑一个完整的验证脚本。确保所有组件都能协同工作。

import torch
import tensorrt as trt

# 检查PyTorch
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"PyTorch CUDA版本: {torch.version.cuda}")

# 检查TensorRT
print(f"TensorRT版本: {trt.__version__}")
print(f"TensorRT构建时的CUDA版本: {trt.__cuda_version__}")

# 检查cuDNN
from ctypes import cdll
try:
    lib = cdll.LoadLibrary("libcudnn.so")
    print("cuDNN: 已加载")
except:
    print("cuDNN: 未找到")

# 简单测试
if torch.cuda.is_available():
    x = torch.randn(1, 3, 224, 224).cuda()
    print(f"GPU测试通过: {x.device}")
else:
    print("GPU不可用,请检查驱动")

如果所有输出都正常,恭喜你,环境搭建成功了。

嗯,这一章内容不少。但环境搭建就是这样,一次搞定,后面就顺了。下一章我们开始讲PyTorch模型导出ONNX,那才是真正有意思的部分。