第2章:Ubuntu + CUDA + cuDNN + PyTorch + YOLOv8 环境配置
环境搭建,说白了就是给 YOLO 安家。我见过太多同学模型写得溜,一到配环境就卡三天。这一章咱们就把 Ubuntu 上的深度学习全家桶一次装明白,顺便把那些常见的版本冲突坑都填上。
核心原则:先定 CUDA 版本,再定 PyTorch 版本,最后定 YOLOv8 版本。顺序错了,后面全是泪。
2.1 整体架构一览
先看一张图,搞清楚这些组件是怎么串起来的。你想想看,YOLOv8 跑在 PyTorch 上,PyTorch 依赖 CUDA 驱动 GPU,cuDNN 给 CUDA 加速。任何一个版本对不上,训练就崩。
2.2 环境版本对照表
我整理了一份实测过的版本组合。记住,不是越新越好,稳定才是王道。
| 组件 | 推荐版本 | 兼容版本 | 踩坑版本 |
|---|---|---|---|
| Ubuntu | 22.04 LTS | 20.04 LTS | 24.04(部分驱动未适配) |
| NVIDIA 驱动 | 535 或 545 | 525+ | 470 以下(不支持 CUDA 12) |
| CUDA Toolkit | 11.8 | 12.1 / 12.2 | 12.0(PyTorch 支持差) |
| cuDNN | 8.9.7 | 8.9.x | 9.x(与旧 PyTorch 不兼容) |
| PyTorch | 2.0.1 | 1.13.1 / 2.1.0 | 2.2+(部分算子变更) |
| YOLOv8 | 8.2.0 | 8.0.x - 8.3.x | 8.0.0 以下(API 差异大) |
我的习惯:每次新项目都先查 PyTorch 官网的 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118,确认 CUDA 11.8 版本还在支持列表里,再动手装驱动。
2.3 分步安装流程
2.3.1 安装 NVIDIA 驱动
这一步最容易翻车。我曾经在一台双卡机器上装驱动,结果黑屏了三次才找到原因——Secure Boot 没关。
# 查看推荐驱动版本
ubuntu-drivers devices
# 自动安装推荐驱动
sudo ubuntu-drivers autoinstall
# 或者手动指定版本(推荐 535)
sudo apt install nvidia-driver-535
# 重启后验证
nvidia-smi
注意:安装驱动前一定要进 BIOS 关闭 Secure Boot,否则驱动加载失败。装完后重启,如果 nvidia-smi 报错,八成是这个原因。
2.3.2 安装 CUDA Toolkit
我个人习惯用 runfile 安装,不用 deb 包。为什么?因为 runfile 可以自定义安装路径,方便多版本共存。
# 下载 CUDA 11.8 runfile
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
# 执行安装(注意不要装驱动,只装 toolkit)
sudo sh cuda_11.8.0_520.61.05_linux.run --toolkit --silent --override
# 配置环境变量
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 验证
nvcc --version
2.3.3 安装 cuDNN
cuDNN 需要去 NVIDIA 官网注册下载,不能直接 wget。下载后是个 tar 包,解压复制就行。
# 解压 cuDNN 8.9.7 for CUDA 11.x
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
# 复制到 CUDA 目录
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
sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*
# 验证
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
2.3.4 安装 PyTorch
这里有个坑:不要直接用 pip install torch,它会装 CPU 版本。一定要指定 CUDA 版本。
# 创建虚拟环境(强烈推荐)
python3 -m venv yolov8_env
source yolov8_env/bin/activate
# 安装 PyTorch 2.0.1 + CUDA 11.8
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
# 验证 GPU 可用
python -c "import torch; print(torch.cuda.is_available()); print(torch.version.cuda)"
输出应为:
True
11.8
如果输出 False,说明 CUDA 没识别到。检查驱动和 CUDA 路径。
2.3.5 安装 YOLOv8
# 安装 ultralytics 包
pip install ultralytics
# 验证安装
yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'
# 或者用 Python 验证
python -c "from ultralytics import YOLO; model = YOLO('yolov8n.pt'); print('YOLOv8 安装成功')"
2.4 常见版本冲突与解决方案
这部分是我在项目中踩过的坑,一个一个说。
2.4.1 CUDA 版本与 PyTorch 不匹配
报错:CUDA error: no kernel image is available for execution on the device
原因:PyTorch 编译时用的 CUDA 版本和当前驱动支持的 CUDA 版本不一致。
解决:
- 查驱动支持的最高 CUDA 版本:
nvidia-smi右上角显示 - 去 PyTorch 官网选对应版本的安装命令
- 或者降级 PyTorch:
pip install torch==1.13.1+cu117 --index-url https://download.pytorch.org/whl/cu117
2.4.2 cuDNN 版本不兼容
报错:libcudnn.so.8: cannot open shared object file
原因:cuDNN 版本与 CUDA 不匹配,或者路径没配置对。
解决:
- 确认 cuDNN 版本:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR - 检查 LD_LIBRARY_PATH 是否包含 CUDA lib64 目录
- 如果还不行,试试软链接:
sudo ln -sf /usr/local/cuda-11.8/targets/x86_64-linux/lib/libcudnn.so.8 /usr/lib/x86_64-linux-gnu/libcudnn.so.8
2.4.3 PyTorch 与 YOLOv8 版本冲突
报错:AttributeError: module 'torch' has no attribute 'compile'
原因:YOLOv8 新版本用了 torch.compile,但 PyTorch 版本太低不支持。
解决:
- 升级 PyTorch 到 2.0+:
pip install torch>=2.0.0 - 或者降级 YOLOv8:
pip install ultralytics==8.0.100
2.4.4 GCC 版本问题
报错:gcc: error: unrecognized command line option '-std=c++17'
原因:系统 GCC 版本太老,不支持 C++17。
解决:
# 安装 GCC 9+
sudo apt install gcc-9 g++-9
# 设置默认版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90
2.5 环境验证脚本
我写了个一键验证脚本,每次配完环境跑一遍,心里踏实。
#!/bin/bash
# check_env.sh - YOLOv8 环境验证脚本
echo "=== 1. NVIDIA 驱动 ==="
nvidia-smi | head -n 3
echo -e "\n=== 2. CUDA 版本 ==="
nvcc --version | grep "release"
echo -e "\n=== 3. cuDNN 版本 ==="
cat /usr/local/cuda/include/cudnn_version.h | grep "CUDNN_MAJOR\|CUDNN_MINOR\|CUDNN_PATCHLEVEL"
echo -e "\n=== 4. PyTorch + GPU ==="
python -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA可用: {torch.cuda.is_available()}'); print(f'GPU数量: {torch.cuda.device_count()}'); print(f'当前GPU: {torch.cuda.get_device_name(0)}')"
echo -e "\n=== 5. YOLOv8 ==="
python -c "from ultralytics import YOLO; print('YOLOv8 导入成功')"
我的建议:把这个脚本保存为 check_env.sh,每次换机器或者重装系统后,跑一遍就知道环境有没有问题。省得训练到一半才发现 GPU 没识别。
2.6 避坑指南
- 不要用 sudo pip install:容易污染系统 Python,一定要用虚拟环境。我习惯用
venv,轻量无依赖。 - CUDA 不要装最新版:PyTorch 对最新 CUDA 的支持通常滞后 1-2 个月。CUDA 11.8 是目前最稳的选择。
- 多版本 CUDA 共存:用 runfile 装到不同目录,通过
update-alternatives切换。我机器上就同时有 11.8 和 12.1。 - 磁盘空间:CUDA Toolkit 大约 3GB,cuDNN 几百 MB,PyTorch 带依赖 2GB 左右。确保 /usr 分区有 20GB 以上空闲。
- Docker 方案:如果实在配不好,直接用
nvcr.io/nvidia/pytorch:23.08-py3镜像,开箱即用。但生产环境我还是推荐裸机安装,性能更好。
最后提醒:环境搭建没有捷径,每一步都要验证。别想着一次装完所有东西再测试,那样出了问题根本不知道是哪一步错了。装一个组件,验证一个,再装下一个。