2、环境搭建:CUDA、cuDNN、TensorRT的安装与版本匹配,验证安装成功
好,咱们正式开始动手了。这一章我带你把整个环境搭起来。说实话,很多同学在TensorRT上踩的第一个坑,不是代码写错了,而是版本没对齐。我当年刚接触TensorRT的时候,就因为这个折腾了整整一个下午。
所以这一章,我会把CUDA、cuDNN、TensorRT的版本匹配关系讲清楚,然后一步步带你装好,最后验证一下是否真的跑通了。
2.1 版本匹配:为什么这是个大事?
你想想看,TensorRT是NVIDIA的推理优化库,它底层依赖CUDA来调用GPU,又依赖cuDNN来做卷积加速。这三个东西就像三兄弟,版本必须合拍。
举个例子,TensorRT 8.x 要求CUDA 11.x,你要是装了CUDA 12.0,那TensorRT 8.x 根本认不出来。我见过有人装完TensorRT,一跑就报错“libcudart.so.11.0: cannot open shared object file”,说白了就是CUDA版本对不上。
2.2 官方推荐的版本组合
我整理了一份常用的版本匹配表,你可以直接参考。这是我在多个项目中验证过的,基本不会出问题。
| TensorRT 版本 | CUDA 版本 | cuDNN 版本 | 备注 |
|---|---|---|---|
| 8.4 GA | 11.0 / 11.1 / 11.2 / 11.3 / 11.4 / 11.5 / 11.6 / 11.7 | 8.4 / 8.5 | 最稳定的组合之一 |
| 8.5 GA | 11.0 / 11.1 / 11.2 / 11.3 / 11.4 / 11.5 / 11.6 / 11.7 / 11.8 | 8.6 / 8.7 | 支持更多新特性 |
| 8.6 EA | 11.8 / 12.0 | 8.8 / 8.9 | 早期体验版,慎用 |
| 10.0 GA | 11.8 / 12.0 / 12.1 / 12.2 | 8.9 / 9.0 | 最新稳定版 |
2.3 安装步骤:一步一步来
好,下面咱们开始装。我假设你用的是Ubuntu 20.04或22.04,显卡驱动已经装好了。如果还没装驱动,先装驱动,这个我就不展开了。
2.3.1 安装CUDA
CUDA的安装方式有两种:runfile和deb包。我个人习惯用runfile,因为可以指定安装路径,方便多版本共存。
# 下载CUDA 11.6(以这个版本为例)
wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run
# 运行安装
sudo sh cuda_11.6.0_510.39.01_linux.run
# 安装时注意:不要勾选Driver,因为驱动你已经装好了
# 只选CUDA Toolkit和CUDA Samples即可
装完之后,配置环境变量:
# 在 ~/.bashrc 末尾添加
export PATH=/usr/local/cuda-11.6/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH
# 使生效
source ~/.bashrc
验证一下:
nvcc --version
# 应该输出 Cuda compilation tools, release 11.6, V11.6.124
✅ 验证通过的标准: nvcc能正常输出版本号,并且没有报错。
2.3.2 安装cuDNN
cuDNN需要去NVIDIA官网下载,需要注册账号。下载的时候注意选对CUDA版本对应的cuDNN。
# 假设你下载的是 cudnn-linux-x86_64-8.4.1.50_cuda11.6-archive.tar.xz
tar -xvf cudnn-linux-x86_64-8.4.1.50_cuda11.6-archive.tar.xz
# 复制到CUDA目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.6/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.6/lib64/
# 设置权限
sudo chmod a+r /usr/local/cuda-11.6/include/cudnn*.h
sudo chmod a+r /usr/local/cuda-11.6/lib64/libcudnn*
验证cuDNN是否装好:
cat /usr/local/cuda-11.6/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# 应该输出类似:
# #define CUDNN_MAJOR 8
# #define CUDNN_MINOR 4
# #define CUDNN_PATCHLEVEL 1
2.3.3 安装TensorRT
TensorRT同样需要去NVIDIA官网下载。我建议下载tar包版本,方便管理。
# 下载 TensorRT 8.4 GA for Linux x86_64
# 文件名类似:TensorRT-8.4.1.5.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
tar -xzvf TensorRT-8.4.1.5.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
sudo mv TensorRT-8.4.1.5 /usr/local/
# 配置环境变量
export LD_LIBRARY_PATH=/usr/local/TensorRT-8.4.1.5/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/TensorRT-8.4.1.5/bin:$PATH
安装Python包(如果你要用Python做推理):
cd /usr/local/TensorRT-8.4.1.5/python
pip install tensorrt-8.4.1.5-cp38-none-linux_x86_64.whl
# 注意:根据你的Python版本选择对应的whl文件
2.4 验证安装:跑一个简单的例子
装完了,怎么知道真的能用?我一般用两个方法验证。
2.4.1 命令行验证
trtexec --version
# 应该输出 TensorRT version: 8.4.1.5
如果能正常输出版本号,说明TensorRT本体装好了。
2.4.2 Python验证
python3 -c "import tensorrt as trt; print(trt.__version__)"
# 应该输出 8.4.1.5
如果报错找不到libnvinfer.so,说明LD_LIBRARY_PATH没配好。回去检查一下。
2.4.3 跑一个简单的推理测试
我建议用trtexec跑一个简单的模型,验证整个链路是否通。
# 生成一个简单的ONNX模型(这里用Python生成)
python3 -c "
import torch
import torch.nn as nn
class SimpleModel(nn.Module):
def __init__(self):
super().__init__()
self.conv = nn.Conv2d(3, 16, 3)
def forward(self, x):
return self.conv(x)
model = SimpleModel()
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, 'simple_model.onnx')
"
# 用trtexec转换并推理
trtexec --onnx=simple_model.onnx --saveEngine=simple_model.engine --fp16
trtexec --loadEngine=simple_model.engine
如果能看到类似这样的输出,说明一切正常:
[I] TensorRT version: 8.4.1.5
[I] Average on 10 runs: 0.523 ms
[I] Min latency: 0.498 ms
[I] Max latency: 0.567 ms
2.5 常见问题与避坑
我把自己踩过的坑列出来,你遇到了可以直接对照。
- 问题1: 运行trtexec报错“libcudart.so.11.0: cannot open shared object file”
原因: CUDA版本不对,或者LD_LIBRARY_PATH没指向正确的CUDA版本。
解决: 检查CUDA版本,确认环境变量指向了正确的路径。 - 问题2: Python import tensorrt报错“libnvinfer.so.8: cannot open shared object file”
原因: TensorRT的lib路径没加到LD_LIBRARY_PATH。
解决: 执行export LD_LIBRARY_PATH=/usr/local/TensorRT-8.4.1.5/lib:$LD_LIBRARY_PATH - 问题3: trtexec转换ONNX时报错“ERROR: Failed to parse ONNX model”
原因: ONNX模型中有TensorRT不支持的算子。
解决: 检查ONNX opset版本,建议用opset 11或13。或者用polygraphy工具分析哪些算子不支持。
✅ 最终验证清单:
- nvcc --version 正常输出
- cat cudnn_version.h 能看到版本号
- trtexec --version 正常输出
- Python import tensorrt 不报错
- trtexec能成功转换并运行一个简单的ONNX模型
这五条都过了,你的环境就算搭好了。恭喜,可以开始下一章了。
好,环境搭建就到这里。下一章我们开始讲TensorRT的核心概念——网络定义、Builder、Engine、Context,这些东西搞明白了,后面写代码就顺了。