第3章:环境搭建与工具链——CUDA、cuDNN、TensorRT版本匹配与安装验证

说实话,我见过太多工程师在模型部署上栽跟头,最后发现根本不是算法问题,而是环境没搭对。版本不匹配、路径配错、库文件冲突……这些坑我几乎都踩过一遍。今天咱们就把这套工具链彻底捋清楚。

3.1 版本匹配:为什么不能随便装?

CUDA、cuDNN、TensorRT这三个东西,说白了是层层依赖的关系。CUDA是底层计算平台,cuDNN在CUDA之上做深度神经网络加速,TensorRT又依赖前两者做推理优化。版本不对,直接报错给你看。

我曾经在客户现场遇到过:TensorRT 8.4搭配CUDA 11.4,结果跑模型时一直报"cudaErrorInsufficientDriver"。折腾了两小时,最后发现TensorRT 8.4要求CUDA 11.6以上。从那以后,我每次搭建环境第一件事就是查版本兼容表。

下面这张表是我整理的主流版本匹配关系,建议你保存下来:

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+ 最新架构支持
我的习惯:工业检测项目我一般选TensorRT 8.4 + CUDA 11.7 + cuDNN 8.5。这个组合经过大量验证,稳定性最好。别追新,稳定压倒一切。

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 动态形状最大值 按实际输入设
避坑指南:我曾经用trtexec转一个检测模型,没设--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'}
    }
)
我的经验:opset_version别用太新,11或12最稳。太新的opset有些算子TensorRT不支持,转换时会报错。

3.5.3 ONNX生态工具

工具 用途 推荐指数
ONNX Simplifier 简化模型结构 ⭐⭐⭐⭐⭐
ONNX Runtime 跨平台推理 ⭐⭐⭐⭐
Netron 可视化模型结构 ⭐⭐⭐⭐⭐
ONNX GraphSurgeon 手动修改计算图 ⭐⭐⭐

我个人最常用的是ONNX Simplifier和Netron。Simplifier能把模型里那些冗余的Cast、Reshape去掉,Netron能让我直观看到模型结构,方便排查问题。

3.6 本章知识体系

下面这张图把本章的核心内容串起来了,你可以对照着检查自己掌握了多少:

第3章:环境搭建与工具链知识体系 TensorRT部署环境 版本匹配 安装步骤 trtexec工具 ONNX生态 CUDA cuDNN TensorRT CUDA安装 cuDNN安装 TRT安装 模型转换 推理测试 性能分析 模型导出 工具链 可视化 核心原则 版本匹配 → 顺序安装 → 命令验证 → 工具熟练

环境搭建是后面所有优化的基础。这一步走稳了,后面模型转换、精度调优才能顺利进行。别急,慢慢来,把每个验证命令都跑一遍,确保环境没问题再往下走。