第3章:环境搭建与工具链——CUDA、cuDNN、TensorRT版本匹配与安装验证
说实话,我见过太多工程师在模型部署上栽跟头,最后发现根本不是算法问题,而是环境没搭对。版本不匹配、路径配错、库文件冲突……这些坑我几乎都踩过一遍。今天咱们就把这套工具链彻底捋清楚。
3.1 版本匹配:为什么不能随便装?
CUDA、cuDNN、TensorRT这三个东西,说白了是层层依赖的关系。CUDA是底层计算平台,cuDNN在CUDA之上做深度神经网络加速,TensorRT又依赖前两者做推理优化。版本不对,直接报错给你看。
下面这张表是我整理的主流版本匹配关系,建议你保存下来:
| TensorRT版本 | CUDA版本 | cuDNN版本 | 推荐用途 |
|---|---|---|---|
| 8.4 GA | 11.6 / 11.7 | 8.4 / 8.5 | 工业检测主流 |
| 8.5 GA | 11.8 | 8.6 | 新特性验证 |
| 8.6 EA | 12.0 | 8.8 | 尝鲜(不推荐生产) |
| 10.0 GA | 12.2 / 12.4 | 9.0+ | 最新架构支持 |
3.2 安装步骤:三步走,不踩坑
安装顺序有讲究:先CUDA,再cuDNN,最后TensorRT。反过来装大概率会出问题。
3.2.1 CUDA安装
去NVIDIA官网下载runfile或deb包。我个人推荐runfile方式,因为可以指定安装路径,方便多版本共存。
# 下载CUDA 11.7 runfile
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run
# 安装(注意不要安装驱动,只装toolkit)
sudo sh cuda_11.7.0_515.43.04_linux.run --toolkit --silent --override
# 配置环境变量
echo 'export PATH=/usr/local/cuda-11.7/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
nvcc --version,看到版本号就对了。
3.2.2 cuDNN安装
cuDNN需要NVIDIA开发者账号才能下载。下载后其实就是把文件拷贝到CUDA目录下。
# 解压cuDNN包
tar -xzvf cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz
# 拷贝到CUDA目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.7/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.7/lib64/
sudo chmod a+r /usr/local/cuda-11.7/include/cudnn*.h /usr/local/cuda-11.7/lib64/libcudnn*
cat /usr/local/cuda-11.7/include/cudnn_version.h | grep CUDNN_MAJOR -A 2,能看到版本号就对了。
3.2.3 TensorRT安装
TensorRT我推荐用tar包方式安装,方便管理。
# 下载TensorRT 8.4 GA tar包
tar -xzvf TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
# 配置环境变量
echo 'export LD_LIBRARY_PATH=/path/to/TensorRT-8.4.3.1/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PATH=/path/to/TensorRT-8.4.3.1/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 安装Python包(如果要用Python API)
cd /path/to/TensorRT-8.4.3.1/python
pip install tensorrt-8.4.3.1-cp38-none-linux_x86_64.whl
3.3 安装验证:别信感觉,信命令
装完了一定要验证。我见过有人装完觉得"应该没问题",结果跑模型时各种报错。
# 验证CUDA
nvcc --version
# 验证cuDNN
cat /usr/local/cuda-11.7/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# 验证TensorRT
trtexec --version
# Python验证
python -c "import tensorrt as trt; print(trt.__version__)"
四条命令都返回正确版本号,才算环境搭好了。
3.4 trtexec命令行工具初体验
trtexec是TensorRT自带的瑞士军刀。你不用写一行代码,就能完成模型转换、推理测试、性能分析。我在项目中经常用它做快速验证。
3.4.1 基本用法
# 将ONNX模型转换为TensorRT引擎
trtexec --onnx=model.onnx --saveEngine=model.engine
# 运行推理测试
trtexec --loadEngine=model.engine --iterations=100
# 查看网络结构
trtexec --onnx=model.onnx --verbose
3.4.2 常用参数
| 参数 | 作用 | 我的推荐 |
|---|---|---|
--fp16 |
启用FP16精度 | 工业检测常用 |
--int8 |
启用INT8量化 | 精度要求不高时用 |
--workspace |
设置工作空间大小 | 至少1GB |
--minShapes |
动态形状最小值 | 按实际输入设 |
--optShapes |
动态形状优化值 | 常用分辨率 |
--maxShapes |
动态形状最大值 | 按实际输入设 |
--workspace,结果默认只有512MB,转换到一半就崩了。后来改成--workspace=4096,一次通过。
3.5 ONNX生态介绍
ONNX(Open Neural Network Exchange)说白了就是模型界的"通用语言"。不管你是用PyTorch、TensorFlow还是其他框架训练的模型,都能转成ONNX格式,然后被TensorRT吃进去。
3.5.1 ONNX的核心价值
- 框架互通:PyTorch训练的模型可以直接给TensorRT用
- 算子标准化:所有框架的算子都映射到ONNX算子集
- 工具链丰富:ONNX Runtime、ONNX Simplifier等工具
3.5.2 从PyTorch导出ONNX
import torch
import torch.onnx
# 假设model是你的检测模型
dummy_input = torch.randn(1, 3, 640, 640)
torch.onnx.export(
model,
dummy_input,
"model.onnx",
opset_version=11,
input_names=['input'],
output_names=['output'],
dynamic_axes={
'input': {0: 'batch_size'},
'output': {0: 'batch_size'}
}
)
3.5.3 ONNX生态工具
| 工具 | 用途 | 推荐指数 |
|---|---|---|
| ONNX Simplifier | 简化模型结构 | ⭐⭐⭐⭐⭐ |
| ONNX Runtime | 跨平台推理 | ⭐⭐⭐⭐ |
| Netron | 可视化模型结构 | ⭐⭐⭐⭐⭐ |
| ONNX GraphSurgeon | 手动修改计算图 | ⭐⭐⭐ |
我个人最常用的是ONNX Simplifier和Netron。Simplifier能把模型里那些冗余的Cast、Reshape去掉,Netron能让我直观看到模型结构,方便排查问题。
3.6 本章知识体系
下面这张图把本章的核心内容串起来了,你可以对照着检查自己掌握了多少:
环境搭建是后面所有优化的基础。这一步走稳了,后面模型转换、精度调优才能顺利进行。别急,慢慢来,把每个验证命令都跑一遍,确保环境没问题再往下走。