第2章:Ubuntu + CUDA + cuDNN + PyTorch + YOLOv8 环境配置

环境搭建,说白了就是给 YOLO 安家。我见过太多同学模型写得溜,一到配环境就卡三天。这一章咱们就把 Ubuntu 上的深度学习全家桶一次装明白,顺便把那些常见的版本冲突坑都填上。

核心原则:先定 CUDA 版本,再定 PyTorch 版本,最后定 YOLOv8 版本。顺序错了,后面全是泪。

2.1 整体架构一览

先看一张图,搞清楚这些组件是怎么串起来的。你想想看,YOLOv8 跑在 PyTorch 上,PyTorch 依赖 CUDA 驱动 GPU,cuDNN 给 CUDA 加速。任何一个版本对不上,训练就崩。

YOLO 安家环境栈 YOLOv8 (Ultralytics) PyTorch (torch + torchvision) cuDNN (深度学习加速库) CUDA Toolkit + NVIDIA 驱动 Ubuntu 20.04 / 22.04 版本匹配关键 CUDA 12.x → PyTorch 2.x CUDA 11.8 → PyTorch 1.13+ cuDNN 必须对齐 CUDA 我的推荐组合 Ubuntu 22.04 CUDA 11.8 + cuDNN 8.9 PyTorch 2.0.1 + YOLOv8

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 镜像,开箱即用。但生产环境我还是推荐裸机安装,性能更好。

最后提醒:环境搭建没有捷径,每一步都要验证。别想着一次装完所有东西再测试,那样出了问题根本不知道是哪一步错了。装一个组件,验证一个,再装下一个。