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+ |
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
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
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!",恭喜你,环境搭建完成!
3.4 常见问题与解决方案
最后,我总结几个我踩过的坑:
- libcudart.so找不到:检查CUDA_HOME是否设置,或者LD_LIBRARY_PATH是否包含CUDA的lib64目录。
- cuDNN版本不匹配:用
dpkg -l | grep cudnn或rpm -qa | grep cudnn查看已安装版本。 - trtexec报段错误:大概率是CUDA驱动版本太低,升级驱动到525+。
- Python import tensorrt失败:检查Python路径,确保TensorRT的Python包在sys.path里。
嗯,环境搭建就这些。说白了,只要版本对、路径对,基本不会出大问题。下一章咱们开始讲动态批处理的核心概念,到时候你会觉得,今天搭环境这点苦,值了。