环境搭建:CUDA与cuDNN版本选择、TensorRT安装与验证

好,咱们直接进入正题。环境搭建这事儿,说难不难,说简单吧,我见过太多人在这上面栽跟头了。尤其是TensorRT,版本匹配稍微不对,后面编译报错能让你怀疑人生。今天我就把这几年的实战经验掰开揉碎讲给你听。

一、CUDA与cuDNN版本选择——别小看这一步

先聊CUDA。很多人觉得CUDA版本越新越好,其实不是这么回事。我个人的习惯是:先看你的显卡驱动支持的最高CUDA版本,再往下兼容。你想想看,驱动版本决定了你能装哪个CUDA toolkit,这个顺序不能反。

⚠️ 重要提醒: 别用nvidia-smi显示的CUDA Version来判断能装什么版本。那个是驱动支持的最高版本,不是当前安装的版本。我刚开始也犯过这个错,折腾了半天才发现。

具体怎么选?我一般遵循这个原则:

  • TensorRT 8.x:推荐CUDA 11.x系列(11.4、11.6、11.8都行),cuDNN 8.4以上
  • TensorRT 10.x:必须CUDA 12.x起步,cuDNN 9.x
  • TensorRT 10.7+:我最近在用的版本,CUDA 12.4/12.5,cuDNN 9.3

这里有个坑——cuDNN版本不是越新越好。我曾经在项目里直接装了最新的cuDNN 9.5,结果TensorRT 10.6编译报错,查了半天发现是cuDNN API有变动。所以我的建议是:去NVIDIA官网查TensorRT的Release Notes,里面明确写了支持的cuDNN版本

TensorRT版本 推荐CUDA版本 推荐cuDNN版本 我的备注
8.4.x 11.6 / 11.7 8.4.1 稳定,适合老项目
8.6.x 11.8 8.6.0 支持动态形状的早期版本
10.0.x 12.0 / 12.1 8.9.7 大版本升级,注意API变化
10.7.x 12.4 / 12.5 9.3.0 目前我主力使用的组合
💡 小技巧: 如果你不确定,直接装CUDA 11.8 + cuDNN 8.6 + TensorRT 8.6,这个组合我验证过几十次,兼容性最好。

二、TensorRT安装——tar包 vs deb包,怎么选?

TensorRT的安装方式主要有两种:tar包和deb包。说白了,tar包是绿色版,deb包是系统集成版。我两种都用过,说说我的感受。

2.1 deb包安装(推荐新手)

deb包安装最省心,apt一键搞定。但有个前提——你得先装好CUDA和cuDNN的deb包。步骤很简单:

# 1. 下载TensorRT的deb包(以10.7为例)
wget https://developer.download.nvidia.com/compute/machine-learning/tensorrt/10.7.0/local_repo/nv-tensorrt-local-repo-ubuntu2204-10.7.0-cuda-12.5_1.0-1_amd64.deb

# 2. 安装本地仓库
sudo dpkg -i nv-tensorrt-local-repo-ubuntu2204-10.7.0-cuda-12.5_1.0-1_amd64.deb

# 3. 添加密钥
sudo cp /var/nv-tensorrt-local-repo-ubuntu2204-10.7.0-cuda-12.5/*.gpg /usr/share/keyrings/

# 4. 更新并安装
sudo apt-get update
sudo apt-get install tensorrt

# 5. 安装Python绑定(如果你用Python)
sudo apt-get install python3-libnvinfer-dev

嗯,这里要注意:deb包会把TensorRT装到系统目录,比如/usr/lib/x86_64-linux-gnu/。好处是系统自动管理依赖,坏处是如果你想同时装多个版本,deb包就不太方便了。

2.2 tar包安装(我个人的首选)

为什么我更喜欢tar包?说白了就是灵活。你可以把不同版本的TensorRT放在不同目录,想用哪个切哪个。尤其在做多个项目时,这个优势太明显了。

# 1. 下载tar包
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/10.7.0/tars/TensorRT-10.7.0.23.Linux.x86_64-gnu.cuda-12.5.tar.gz

# 2. 解压到指定目录
sudo tar -xzf TensorRT-10.7.0.23.Linux.x86_64-gnu.cuda-12.5.tar.gz -C /opt/
sudo mv /opt/TensorRT-10.7.0.23 /opt/tensorrt-10.7

# 3. 配置环境变量(加到~/.bashrc里)
export TRT_ROOT=/opt/tensorrt-10.7
export LD_LIBRARY_PATH=$TRT_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$TRT_ROOT/bin:$PATH

# 4. 安装Python包
cd $TRT_ROOT/python
pip install tensorrt-10.7.0-cp310-cp310-linux_x86_64.whl

# 5. 安装uff和graphsurgeon(如果需要)
pip install $TRT_ROOT/uff/uff-0.6.9-py2.py3-none-any.whl
pip install $TRT_ROOT/graphsurgeon/graphsurgeon-0.4.6-py2.py3-none-any.whl
🔑 关键点: tar包安装后,一定要把$TRT_ROOT/lib加到LD_LIBRARY_PATH。我见过太多人忘了这步,结果运行时提示找不到libnvinfer.so。

三、验证安装是否成功——别光看版本号

装完了怎么确认?很多人直接跑个trtexec --version就完事了。说实话,这只能说明程序能跑,但真正的验证要深入一些。

3.1 基础验证:检查库文件

# 检查TensorRT库是否被正确加载
ldconfig -p | grep nvinfer

# 输出应该类似:
# libnvinfer.so.10 (libc6,x86-64) => /opt/tensorrt-10.7/lib/libnvinfer.so.10
# libnvinfer_plugin.so.10 (libc6,x86-64) => /opt/tensorrt-10.7/lib/libnvinfer_plugin.so.10

如果这里没输出,说明你的LD_LIBRARY_PATH没配好,或者库文件没装对。

3.2 Python验证:跑个简单的推理

我个人习惯用Python写个最小验证脚本,这样能同时确认Python绑定和C++核心库都正常:

import tensorrt as trt
import numpy as np

# 创建logger
logger = trt.Logger(trt.Logger.WARNING)

# 创建builder
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))

# 添加一个简单的输入层
input_tensor = network.add_input("input", trt.float32, (1, 3, 224, 224))

# 添加一个恒等层(identity layer)
identity = network.add_identity(input_tensor)
network.mark_output(identity.get_output(0))

# 构建engine
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 20)  # 1MB
engine = builder.build_serialized_network(network, config)

if engine is not None:
    print("✅ TensorRT安装成功!Engine构建正常。")
    print(f"   TensorRT版本: {trt.__version__}")
    print(f"   CUDA版本: {trt.__cuda_version__}")
else:
    print("❌ Engine构建失败,请检查安装。")
💡 我的经验: 这个脚本虽然简单,但能验证TensorRT的核心功能——builder、network、config、engine构建。如果这步过了,基本可以放心了。

3.3 终极验证:用trtexec跑一个真实模型

如果你有时间,我建议再用trtexec跑一个ONNX模型试试。这是最接近实际使用场景的验证:

# 下载一个简单的ONNX模型(比如ResNet50)
wget https://github.com/onnx/models/raw/main/vision/classification/resnet/model/resnet50-v2-7.onnx

# 用trtexec转换并推理
trtexec --onnx=resnet50-v2-7.onnx \
        --fp16 \
        --workspace=1024 \
        --saveEngine=resnet50.engine \
        --verbose

# 如果看到 "PASSED" 或者 "SUCCESS",说明一切正常

我曾经在一个客户现场,对方说TensorRT装好了,但trtexec跑模型时一直报cudaErrorInsufficientDriver。查了半天,原来是驱动版本太老,不支持CUDA 12。所以这里再强调一遍:驱动、CUDA、cuDNN、TensorRT,这四个东西的版本必须匹配,缺一不可。

四、常见问题与避坑指南

  • 问题1:找不到libcudnn.so
    原因:cuDNN没装或者路径没配。解决方案:确认/usr/local/cuda/lib64或你的cuDNN安装目录在LD_LIBRARY_PATH中。
  • 问题2:Python import tensorrt报错
    原因:Python包版本和系统库版本不匹配。我曾经遇到过pip install的tensorrt是8.6,但系统里装的是10.7,结果import就崩了。解决方案:用pip list | grep tensorrt检查版本,确保一致。
  • 问题3:trtexec报错"Unsupported ONNX opset"
    原因:ONNX模型用了TensorRT不支持的算子版本。解决方案:用onnx-simplifier简化模型,或者升级TensorRT版本。
⚠️ 终极警告: 不要在生产环境里用apt-get install tensorrt直接装!那个版本通常比较老。一定要从NVIDIA官网下载对应版本。

好了,环境搭建这部分就到这里。说实话,这一步虽然枯燥,但基础打好了,后面学动态形状处理才能顺风顺水。下一章我们开始真正接触TensorRT的核心概念——网络定义与构建器配置。到时候见!