环境准备:CUDA、cuDNN、TensorRT、ONNX Runtime 的安装与版本匹配
说实话,这一章可能是整个课程里最「劝退」的部分。我见过太多同学模型都写好了,结果卡在环境配置上,一搞就是两三天。我自己早期也踩过不少坑,有一次因为 CUDA 和驱动版本不匹配,折腾了整整一个周末才找到原因。
所以咱们先把地基打牢。你想想看,后面所有的工作——导出 ONNX、用 TensorRT 加速、部署到边缘设备——全都依赖这一套环境。版本对不上,后面全是泪。
整体架构:这些组件到底什么关系?
先理清概念。CUDA、cuDNN、TensorRT、ONNX Runtime,它们不是平级关系,而是层层依赖的。我习惯把它们想象成一个四层蛋糕:
说白了,驱动和 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 为例):
- 下载 runfile:
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run - 执行安装:
sudo sh cuda_12.2.0_535.54.03_linux.run - 安装时 取消勾选 Driver(除非你要覆盖现有驱动)
- 配置环境变量:
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 量化的时候,你会发现今天的所有努力都是值得的。