环境搭建:CUDA与cuDNN版本选择、TensorRT安装与验证
好,咱们直接进入正题。环境搭建这事儿,说难不难,说简单吧,我见过太多人在这上面栽跟头了。尤其是TensorRT,版本匹配稍微不对,后面编译报错能让你怀疑人生。今天我就把这几年的实战经验掰开揉碎讲给你听。
一、CUDA与cuDNN版本选择——别小看这一步
先聊CUDA。很多人觉得CUDA版本越新越好,其实不是这么回事。我个人的习惯是:先看你的显卡驱动支持的最高CUDA版本,再往下兼容。你想想看,驱动版本决定了你能装哪个CUDA toolkit,这个顺序不能反。
具体怎么选?我一般遵循这个原则:
- 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 | 目前我主力使用的组合 |
二、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
$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构建失败,请检查安装。")
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的核心概念——网络定义与构建器配置。到时候见!