
本文详解在 apple silicon mac(如 m2 macbook air)上启用 metal performance shaders(mps)加速 yolov8 训练的完整方案,涵盖环境配置、代码适配、常见报错修复及性能优化建议。
本文详解在 apple silicon mac(如 m2 macbook air)上启用 metal performance shaders(mps)加速 yolov8 训练的完整方案,涵盖环境配置、代码适配、常见报错修复及性能优化建议。
YOLOv8 原生支持 MPS(Metal Performance Shaders)后端,可在搭载 Apple Silicon(M1/M2/M3)的 macOS 设备上实现 GPU 加速训练,显著提升速度(相较纯 CPU 可提速 3–5 倍)。但直接传入 device=torch.device('mps') 往往触发 AssertionError: Torch not compiled with CUDA enabled 错误——这并非 YOLOv8 问题,而是 Ultralytics 内部自动批处理(autobatch)模块在检测设备时错误调用了 CUDA API(如 torch.cuda.get_device_properties),而该函数在 macOS 上即使未使用 CUDA 也会被调用,导致断言失败。
✅ 正确配置与训练步骤
1. 确保 PyTorch 支持 MPS
首先验证你的 PyTorch 是否已编译支持 MPS(macOS 12.3+ + Python ≥3.9):
python -c "import torch; print(torch.backends.mps.is_available(), torch.backends.mps.is_built())"
输出应为 True True。若为 False,请卸载并重装官方 MPS 版本:
pip uninstall torch torchvision torchaudio pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/macos/arm64
⚠️ 注意:必须使用 arm64 构建版本;x86_64(Rosetta)版不支持 MPS。
2. 禁用自动批处理(关键修复)
Ultralytics 的 check_train_batch_size 在 MPS 模式下会误调 CUDA 函数。最稳妥的解决方式是显式禁用自动批处理,并手动指定合理 batch size:
from ultralytics import YOLO
import torch
model = YOLO('yolov8s.pt')
# ✅ 关键:禁用 autobatch,避免触发 CUDA 检查
results = model.train(
data='mot17_data.yml',
epochs=30,
batch=8, # 手动设置(M2 Air 推荐 4–16,视内存而定)
imgsz=640,
project='models/yolo',
name='yolov8s_mot17_det10',
device='mps', # 直接传字符串 'mps' 更安全(无需 torch.device)
amp=False, # MPS 当前不支持 AMP(自动混合精度),必须设为 False
workers=2, # MPS 不依赖多进程数据加载,设为 2–4 即可,过高反而降低性能
cache='ram' # 启用内存缓存可加速小数据集读取(需足够 RAM)
)? 为什么 amp=False?截至 PyTorch 2.3 和 Ultralytics v8.2.x,MPS 后端尚未实现 torch.cuda.amp 兼容性,启用 amp=True 将导致运行时错误或静默降级为 CPU。
3. 验证 MPS 是否生效
训练启动后,观察日志中是否出现类似以下信息:
Using device: mps ... AutoBatch: disabled (manual batch=8 specified)
同时可通过活动监视器 → “GPU History” 查看 Metal 引擎占用率,确认 GPU 正在参与计算。
? 常见误区与注意事项
- ❌ 不要传 torch.device('mps'):Ultralytics 内部对 device 参数的解析对 torch.device 对象支持不完善,统一使用字符串 'mps';
- ❌ 勿启用 deterministic=True 或 cudnn.benchmark=True:这些 CUDA 专属优化在 MPS 下无效,可能引发警告或异常;
- ⚠️ batch size 需实测调整:MPS 显存管理不同于 CUDA,过大易 OOM(报 MPS backend out of memory)。建议从 batch=4 开始,逐步增至 8 或 12;
- ? 小技巧:启用 cache='ram' 可大幅提升 MOT 类中小图像数据集(如 MOT17)的 I/O 效率,尤其当系统内存 ≥16GB 时效果显著;
- ? 性能预期:M2 Air(8GB 统一内存)典型训练速度约为 2–4 min/epoch(batch=8, imgsz=640),远优于 CPU(~60 min/epoch),但弱于同代 NVIDIA GPU。
✅ 总结:MPS 训练 YOLOv8 四要素
| 要素 | 正确做法 | 错误做法 |
|---|---|---|
| PyTorch 版本 | torch==2.3.1+cpu(arm64 官方 MPS 构建版) | x86_64 版或非 MPS 编译版 |
| device 参数 | 字符串 'mps' | torch.device('mps') 或 'cuda' |
| AMP 设置 | amp=False(强制关闭) | amp=True(必然报错) |
| batch size | 手动指定(如 batch=8),禁用 autobatch | 留空或设为 -1(触发 CUDA 检查) |
遵循以上配置,即可在 M1/M2 Mac 上稳定、高效地完成 YOLOv8 自定义数据集训练。随着 PyTorch 对 MPS 的持续完善,未来将支持更多高级特性(如动态图优化、完整 AMP),但当前方案已具备生产可用性。










