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,那才是真正有意思的部分。