环境准备:CUDA、cuDNN、TensorRT、ONNX Runtime 的安装与版本匹配

说实话,这一章可能是整个课程里最「劝退」的部分。我见过太多同学模型都写好了,结果卡在环境配置上,一搞就是两三天。我自己早期也踩过不少坑,有一次因为 CUDA 和驱动版本不匹配,折腾了整整一个周末才找到原因。

所以咱们先把地基打牢。你想想看,后面所有的工作——导出 ONNX、用 TensorRT 加速、部署到边缘设备——全都依赖这一套环境。版本对不上,后面全是泪。

整体架构:这些组件到底什么关系?

先理清概念。CUDA、cuDNN、TensorRT、ONNX Runtime,它们不是平级关系,而是层层依赖的。我习惯把它们想象成一个四层蛋糕:

深度学习部署环境四层架构 第4层:应用层 ONNX Runtime · TensorRT Python API · 自定义推理引擎 第3层:推理优化层 TensorRT · ONNX Runtime(GPU 后端) 第2层:加速库层 cuDNN · cuBLAS · NCCL 第1层:驱动与计算层 NVIDIA 显卡驱动 · CUDA Toolkit ⚠ 上层依赖下层:版本必须从下往上逐层对齐,不能跳级

说白了,驱动和 CUDA 是地基,cuDNN 是加速库,TensorRT 和 ONNX Runtime 是推理引擎。上层依赖下层,版本必须逐层对齐。

第一步:检查你的硬件和驱动

动手之前,先看看你手里有什么牌。我建议你打开终端,跑一下这个命令:

nvidia-smi

你会看到类似这样的输出:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03   Driver Version: 535.129.03   CUDA Version: 12.2     |
+-----------------------------------------------------------------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. |
| Fan  Temp  Perf  Pwr:Usage     Cap |         Memory-Usage | GPU-Util  Compute M. |
+-----------------------------------------------------------------------------+
|   0  NVIDIA GeForce RTX 4090           | 00000000:01:00.0  Off |                  Off |
| 30%   35C    P0    60W / 450W |      0MiB / 24564MiB |      0%      Default |
+-----------------------------------------------------------------------------+

这里有两个关键信息:Driver Version 和 CUDA Version。注意,这个 CUDA Version 是驱动支持的最高版本,不是你实际安装的版本。我当年就搞混过,以为装好了 CUDA 12.2,结果发现只是驱动支持而已。

⚠ 避坑指南

我曾经在一台服务器上直接装了 CUDA 11.8,结果 nvidia-smi 显示驱动版本是 470.xx,根本不支持。最后只能先升级驱动,再装 CUDA。记住:驱动版本决定了你能装什么 CUDA。

驱动与 CUDA 版本的对应关系,可以参考这个表:

CUDA Toolkit 版本 最低驱动版本(Linux) 最低驱动版本(Windows)
CUDA 12.x ≥ 525.60.13 ≥ 527.41
CUDA 11.8 ≥ 520.61.05 ≥ 520.06
CUDA 11.7 ≥ 515.43.04 ≥ 515.43.04
CUDA 11.6 ≥ 510.39.01 ≥ 510.39.01

第二步:安装 CUDA Toolkit

确定好版本后,去 NVIDIA 官网下载对应的 CUDA Toolkit。我个人习惯用 runfile(Linux) 或 exe(Windows) 本地安装,因为网络安装包有时候会断。

安装步骤(以 Linux 为例):

  1. 下载 runfile:wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
  2. 执行安装:sudo sh cuda_12.2.0_535.54.03_linux.run
  3. 安装时 取消勾选 Driver(除非你要覆盖现有驱动)
  4. 配置环境变量:
export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH

验证安装:

nvcc --version
# 输出应该显示 Cuda compilation tools, release 12.2
💡 我的习惯

我会在 ~/.bashrc 里写死 CUDA 路径,而不是用 /usr/local/cuda 软链接。这样切换版本时不会乱。比如我同时装了 11.8 和 12.2,用哪个就改哪个的 PATH。

第三步:安装 cuDNN

cuDNN 是 NVIDIA 的深度学习加速库,卷积、池化这些操作全靠它提速。你需要去 NVIDIA 开发者网站注册账号才能下载,嗯,这一步确实有点烦。

下载后是一个压缩包,解压后把内容复制到 CUDA 目录:

# 假设你下载了 cuDNN for CUDA 12.x
tar -xzvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.2/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.2/lib64/
sudo chmod a+r /usr/local/cuda-12.2/include/cudnn*.h /usr/local/cuda-12.2/lib64/libcudnn*

验证 cuDNN 版本:

cat /usr/local/cuda-12.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
⚠ 版本匹配要点

cuDNN 的版本号必须与 CUDA 版本对应。比如 cuDNN 8.9.x 支持 CUDA 11.x 和 12.x,但 cuDNN 8.4.x 只支持到 CUDA 11.x。下载页面会有明确的兼容性矩阵,别选错。

第四步:安装 TensorRT

TensorRT 是 NVIDIA 的推理优化引擎,也是咱们这个课程的核心工具。我建议下载 TensorRT 的 tar 包,而不是 deb 或 pip 包。为什么?因为 tar 包可以随意切换版本,方便后面做对比实验。

下载地址同样在 NVIDIA 开发者网站,选择对应 CUDA 12.x 的版本:

tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.0.tar.gz
sudo mv TensorRT-8.6.1.6 /opt/
export LD_LIBRARY_PATH=/opt/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH
export PATH=/opt/TensorRT-8.6.1.6/bin:$PATH

安装 Python 包:

pip install /opt/TensorRT-8.6.1.6/python/tensorrt-8.6.1-cp310-none-linux_x86_64.whl

验证:

python -c "import tensorrt as trt; print(trt.__version__)"
# 输出:8.6.1
💡 个人经验

我建议同时安装 trtexec 命令行工具,它在 /opt/TensorRT-8.6.1.6/bin/ 下。后面做模型性能测试时,直接用 trtexec --onnx=model.onnx 就能跑 benchmark,比写 Python 脚本方便多了。

第五步:安装 ONNX Runtime

ONNX Runtime 是微软开源的推理引擎,支持多后端。咱们主要用它的 GPU 版本:

pip install onnxruntime-gpu==1.16.3

验证 GPU 是否可用:

python -c "import onnxruntime as ort; print(ort.get_device())"
# 输出:GPU

如果输出是 CPU,说明 CUDA 和 cuDNN 没配置对。我遇到过好几次这种情况,最后发现是 LD_LIBRARY_PATH 没设置好。

版本匹配速查表

为了方便你对照,我整理了一份经过验证的版本组合:

组件 推荐版本(组合 A) 推荐版本(组合 B)
NVIDIA 驱动 ≥ 535.129.03 ≥ 525.60.13
CUDA Toolkit 12.2.0 11.8.0
cuDNN 8.9.4 for CUDA 12.x 8.7.0 for CUDA 11.x
TensorRT 8.6.1 for CUDA 12.x 8.5.3 for CUDA 11.x
ONNX Runtime 1.16.3 1.15.1
📌 核心原则

版本匹配的黄金法则是:驱动 ≥ CUDA ≥ cuDNN ≥ TensorRT ≥ ONNX Runtime,版本号只能向下兼容,不能向上。比如 CUDA 12.2 的驱动可以跑 CUDA 11.8 的程序,但反过来不行。

常见问题与排查

安装过程中你可能会遇到这些问题,我帮你提前列出来:

  • nvcc 找不到:检查 PATH 里有没有包含 CUDA 的 bin 目录
  • libcudart.so 找不到:检查 LD_LIBRARY_PATH 有没有包含 CUDA 的 lib64 目录
  • TensorRT 导入报错:确认 whl 文件版本和 CUDA 版本一致
  • ONNX Runtime 显示 CPU:运行 ldd 检查 onnxruntime 的依赖库是否都找到了

嗯,环境准备这部分确实琐碎,但值得花时间一次搞定。后面咱们导出 ONNX 模型、用 TensorRT 做 INT8 量化的时候,你会发现今天的所有努力都是值得的。