3、TensorRT环境搭建:CUDA与cuDNN版本要求、TensorRT安装方式(tar/deb/rpm)、验证安装是否成功

好,咱们进入正题。环境搭建这事儿,说难不难,说简单吧,我见过太多人卡在这一步。说白了,TensorRT是个很挑剔的家伙——它对底层的CUDA和cuDNN版本有严格的要求。你版本不对,它连编译都过不去。

我个人习惯是,先搞清楚自己显卡的算力,再决定装哪个版本的CUDA。你想想看,要是RTX 4090你给它装个CUDA 10.0,那不是暴殄天物吗?

3.1 CUDA与cuDNN版本要求

TensorRT每个版本都有对应的CUDA和cuDNN版本要求。这不是闹着玩的,我曾在项目中因为cuDNN版本差了0.1,结果推理速度直接掉了30%。

这里我整理了一张表,你直接对着看:

TensorRT版本 CUDA最低版本 cuDNN最低版本 推荐显卡算力
8.4.x 11.0 8.2 7.0+
8.5.x 11.6 8.3 7.5+
8.6.x 11.8 8.5 8.0+
10.0.x 12.0 8.9 8.9+
注意: 千万别想着用CUDA 12.0去跑TensorRT 8.4。我试过,编译能过,但跑起来各种段错误。嗯,血的教训。

3.2 TensorRT安装方式:tar/deb/rpm

TensorRT官方给了三种安装方式。我个人最推荐tar包方式,为什么呢?因为灵活。你可以在不同项目里切换不同版本,互不干扰。

3.2.1 tar包安装(推荐)

这种方式说白了就是解压即用。我一般这么干:

# 下载TensorRT tar包(以8.6.1为例)
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/secure/8.6.1/tars/TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz

# 解压到指定目录
tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz -C /opt/

# 配置环境变量
echo 'export LD_LIBRARY_PATH=/opt/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PATH=/opt/TensorRT-8.6.1.6/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
小技巧: 我习惯在~/.bashrc里写个函数,一键切换TensorRT版本。比如trt8.4() { export LD_LIBRARY_PATH=/opt/TensorRT-8.4.x/lib:$LD_LIBRARY_PATH; }。这样多版本共存,爽得很。

3.2.2 deb包安装(Ubuntu/Debian)

如果你用的是Ubuntu,deb包安装最省事。但要注意,它会覆盖系统级的库文件。

# 安装依赖
sudo apt-get install libcudnn8 libcudnn8-dev

# 安装TensorRT deb包
sudo dpkg -i nv-tensorrt-local-repo-ubuntu2204-8.6.1-cuda-11.8_1.0-1_amd64.deb
sudo apt-get update
sudo apt-get install tensorrt

嗯,这里要提醒你:deb安装后,版本切换比较麻烦。我一般只在测试机上用deb,生产环境还是tar包稳。

3.2.3 rpm包安装(CentOS/RHEL)

rpm包和deb类似,只是包格式不同。命令如下:

sudo rpm -ivh nv-tensorrt-local-repo-rhel8-8.6.1-cuda-11.8-1.0-1.x86_64.rpm
sudo yum install tensorrt

说实话,rpm我用的不多。有一次在CentOS 7上装TensorRT 8.5,折腾了半天才发现是glibc版本太低。所以,用rpm前一定先检查系统库版本。

3.3 验证安装是否成功

装完了怎么知道对不对?别急,我教你三招。

3.3.1 命令行验证

最简单的,直接跑trtexec:

trtexec --version

如果输出类似:

TensorRT Version: 8.6.1
Built: 2023-08-15 10:30:00
CUDA Version: 11.8
cuDNN Version: 8.5.0

那基本稳了。如果报错"command not found",八成是环境变量没配好。

3.3.2 Python接口验证

我习惯用Python写推理脚本,所以验证Python接口也很重要:

import tensorrt as trt

# 创建builder
builder = trt.Builder(trt.Logger(trt.Logger.WARNING))
print(f"TensorRT version: {trt.__version__}")

# 检查CUDA版本
runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))
print(f"CUDA version: {runtime.get_cuda_version()}")

# 检查cuDNN版本
print(f"cuDNN version: {runtime.get_cudnn_version()}")

输出应该是:

TensorRT version: 8.6.1
CUDA version: 11080
cuDNN version: 8500
注意: CUDA版本号是拼接的,比如11080代表CUDA 11.8。cuDNN 8500代表8.5.0。这个编码规则我一开始也懵,后来才搞明白。

3.3.3 跑一个简单模型验证

最后,我建议你跑一个最简单的模型,验证整个链路通不通:

import tensorrt as trt
import numpy as np

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

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

# 添加一个恒等映射层(Identity层)
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:
    print("✅ TensorRT engine build successfully!")
else:
    print("❌ Engine build failed!")

如果输出"✅ TensorRT engine build successfully!",恭喜你,环境搭建完成!

避坑指南: 我曾经在Docker里装TensorRT,忘了挂载CUDA库,结果engine build一直失败。折腾了两天才发现是LD_LIBRARY_PATH没设对。所以,验证时一定检查环境变量。

3.4 常见问题与解决方案

最后,我总结几个我踩过的坑:

  • libcudart.so找不到:检查CUDA_HOME是否设置,或者LD_LIBRARY_PATH是否包含CUDA的lib64目录。
  • cuDNN版本不匹配:用dpkg -l | grep cudnnrpm -qa | grep cudnn查看已安装版本。
  • trtexec报段错误:大概率是CUDA驱动版本太低,升级驱动到525+。
  • Python import tensorrt失败:检查Python路径,确保TensorRT的Python包在sys.path里。

嗯,环境搭建就这些。说白了,只要版本对、路径对,基本不会出大问题。下一章咱们开始讲动态批处理的核心概念,到时候你会觉得,今天搭环境这点苦,值了。