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版本对不上。

⚠️ 重要提醒: 不要盲目追求最新版CUDA。TensorRT的发布节奏比CUDA慢,新CUDA出来之后,TensorRT往往要过几个月才支持。我个人习惯是,先确定TensorRT版本,再倒推CUDA和cuDNN的版本。

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 最新稳定版
💡 我的建议: 如果你刚开始学,直接用 TensorRT 8.4 + CUDA 11.6 + cuDNN 8.4。这套组合我用了大半年,没出过兼容性问题。等熟悉了再升级。

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
⚠️ 注意: 有些教程会让你用dpkg装deb包,但我更推荐手动复制。为什么呢?因为dpkg会把cuDNN装到系统目录,如果你有多个CUDA版本,容易搞混。手动复制到指定CUDA目录,每个版本各管各的,清爽多了。

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
💡 小技巧: 第一次跑trtexec的时候,可能会比较慢,因为它在做模型优化和kernel autotuning。别急,等它跑完。第二次再跑就快多了。

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工具分析哪些算子不支持。

✅ 最终验证清单:

  1. nvcc --version 正常输出
  2. cat cudnn_version.h 能看到版本号
  3. trtexec --version 正常输出
  4. Python import tensorrt 不报错
  5. trtexec能成功转换并运行一个简单的ONNX模型

这五条都过了,你的环境就算搭好了。恭喜,可以开始下一章了。

好,环境搭建就到这里。下一章我们开始讲TensorRT的核心概念——网络定义、Builder、Engine、Context,这些东西搞明白了,后面写代码就顺了。