2、环境搭建与工具链准备:CUDA、cuDNN、PyTorch、TensorRT、ONNX Runtime的安装与配置
做模型量化推理加速,说白了就是跟GPU打交道。环境搭不对,后面全是坑。我见过太多同学花了两天装环境,最后跑demo时崩了——嗯,多半是版本没对齐。
这一章咱们把CUDA、cuDNN、PyTorch、TensorRT、ONNX Runtime这五件套装好。别急,我按顺序来,每一步都告诉你为什么这么干。
2.1 整体工具链关系图
先看一张图,搞清楚这些工具到底谁依赖谁。你想想看,装环境最怕的就是“装完A发现B不认C”。
核心原则:版本对齐是环境搭建的第一要务。CUDA版本决定cuDNN版本,cuDNN版本决定PyTorch/TensorRT的兼容范围。别想着“装最新版就完事”——我吃过这个亏。
2.2 CUDA Toolkit 安装
CUDA是NVIDIA GPU的“翻译官”。没有它,PyTorch根本没法跟显卡说话。
2.2.1 确认你的GPU
先跑一行命令,看看显卡型号和驱动版本:
nvidia-smi
输出里你会看到类似这样的信息:
| 字段 | 示例值 | 说明 |
|---|---|---|
| Driver Version | 535.129.03 | 驱动版本,决定CUDA兼容范围 |
| CUDA Version | 12.2 | 当前驱动支持的最高CUDA版本 |
| GPU Name | NVIDIA A100 80GB | 显卡型号,决定算力等级 |
注意:nvidia-smi显示的CUDA Version是驱动支持的最高版本,不是你实际安装的版本。我曾经被这个搞晕过——装完CUDA 11.8发现nvidia-smi显示12.2,以为装错了,其实没问题。
2.2.2 选择CUDA版本
我个人习惯用CUDA 11.8或12.1。为什么?因为PyTorch和TensorRT对这两个版本支持最稳。你想想看,YOLOv11官方推荐也是这个范围。
下载地址:NVIDIA官网CUDA Toolkit Archive。选对应版本,按系统下载runfile或deb包。
以Ubuntu 22.04 + CUDA 11.8为例:
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
安装时注意:
- 不要勾选Driver(除非你的驱动太老)
- 只选CUDA Toolkit和CUDA Samples
- 安装路径默认即可
装完配置环境变量:
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
验证:
nvcc --version
看到Cuda compilation tools, release 11.8就对了。
2.3 cuDNN 安装
cuDNN是NVIDIA的深度学习加速库。说白了,卷积、池化、归一化这些操作,cuDNN帮你跑得飞快。
2.3.1 版本匹配
cuDNN版本必须跟CUDA版本一一对应。比如CUDA 11.8,就下载cuDNN for CUDA 11.x。
| CUDA版本 | cuDNN推荐版本 | 备注 |
|---|---|---|
| 11.8 | 8.9.7 | 稳定,PyTorch官方测试通过 |
| 12.1 | 9.0.0 | 新特性多,但部分旧模型可能不兼容 |
| 12.4 | 9.3.0 | 最新,但TensorRT支持可能滞后 |
我的建议:做YOLOv11量化,CUDA 11.8 + cuDNN 8.9.7是最稳的组合。我在三个项目里都用这个组合,没出过兼容问题。
2.3.2 安装步骤
下载cuDNN需要NVIDIA开发者账号。下载后是tar包:
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*
验证:
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
看到类似#define CUDNN_MAJOR 8就对了。
2.4 PyTorch 安装
PyTorch是咱们训练和导出模型的主力框架。YOLOv11就是用PyTorch写的。
2.4.1 选择安装方式
我个人推荐用pip安装,干净利落。别用conda——conda的PyTorch版本经常滞后,而且依赖解析慢得要命。
对应CUDA 11.8:
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118
对应CUDA 12.1:
pip install torch==2.3.0 torchvision==0.18.0 torchaudio==2.3.0 --index-url https://download.pytorch.org/whl/cu121
2.4.2 验证GPU可用
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
输出True和你的显卡型号,说明PyTorch认出了GPU。
避坑:如果输出False,八成是CUDA版本跟PyTorch不匹配。我曾经在CUDA 12.4上装了PyTorch 2.1.0,结果torch.cuda.is_available()返回False——因为PyTorch 2.1.0最高只支持到CUDA 12.1。
2.5 TensorRT 安装
TensorRT是NVIDIA的推理优化引擎。FP16量化主要靠它。说白了,它能把模型“编译”成GPU最擅长跑的格式。
2.5.1 版本选择
TensorRT版本必须跟CUDA和cuDNN对齐。我整理了一张表:
| TensorRT版本 | CUDA版本 | cuDNN版本 | 适用场景 |
|---|---|---|---|
| 8.6.1 | 11.8 | 8.9.x | YOLOv11 FP16量化首选 |
| 9.2.0 | 12.1 | 9.0.x | 新特性多,但部分插件不兼容 |
| 10.0.0 | 12.4 | 9.3.x | 最新,但社区支持少 |
2.5.2 安装步骤
下载TensorRT的tar包(推荐)或deb包。我习惯用tar包,灵活:
tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
sudo mv TensorRT-8.6.1.6 /usr/local/
export LD_LIBRARY_PATH=/usr/local/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH
安装Python包:
pip install /usr/local/TensorRT-8.6.1.6/python/tensorrt-8.6.1-cp39-none-linux_x86_64.whl
验证:
python -c "import tensorrt as trt; print(trt.__version__)"
小技巧:TensorRT的Python包名跟系统架构和Python版本有关。下载前看清楚文件名里的cp39(对应Python 3.9)。我一开始没注意,装了cp311的包,结果import报错——Python版本不匹配。
2.6 ONNX Runtime 安装
ONNX Runtime是微软的推理引擎。咱们用它做模型格式转换和CPU/GPU推理验证。YOLOv11导出ONNX后,用ONNX Runtime跑一遍,能提前发现算子兼容问题。
2.6.1 安装命令
ONNX Runtime分CPU版和GPU版。做量化推理,必须装GPU版:
pip install onnxruntime-gpu==1.16.3
如果只是做模型转换验证,CPU版也够用:
pip install onnxruntime==1.16.3
2.6.2 验证GPU支持
python -c "import onnxruntime as ort; print(ort.get_device())"
输出GPU说明ONNX Runtime认出了你的显卡。
注意:ONNX Runtime GPU版依赖CUDA和cuDNN。如果输出CPU,检查一下环境变量里有没有正确配置CUDA路径。我遇到过一种情况——装了GPU版但LD_LIBRARY_PATH没包含CUDA的lib64,结果它默默回退到CPU了。
2.7 环境验证清单
所有工具装完后,跑一遍这个脚本,确保每个环节都通:
#!/bin/bash
echo "=== CUDA ==="
nvcc --version | grep "release"
echo "=== cuDNN ==="
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep "CUDNN_MAJOR"
echo "=== PyTorch ==="
python -c "import torch; print(f'PyTorch {torch.__version__}, CUDA available: {torch.cuda.is_available()}')"
echo "=== TensorRT ==="
python -c "import tensorrt as trt; print(f'TensorRT {trt.__version__}')"
echo "=== ONNX Runtime ==="
python -c "import onnxruntime as ort; print(f'ONNX Runtime {ort.__version__}, device: {ort.get_device()}')"
输出应该类似这样:
| 工具 | 期望输出 |
|---|---|
| CUDA | release 11.8 |
| cuDNN | 8 |
| PyTorch | 2.1.0, CUDA available: True |
| TensorRT | 8.6.1 |
| ONNX Runtime | 1.16.3, device: GPU |