
本文详解在 apple silicon(m1/m2/m3)mac 上通过 pytorch 的 metal performance shaders(mps)后端加速 yolov8 训练的完整配置方案,涵盖环境适配、关键报错规避、代码修正及实测注意事项。
本文详解在 apple silicon(m1/m2/m3)mac 上通过 pytorch 的 metal performance shaders(mps)后端加速 yolov8 训练的完整配置方案,涵盖环境适配、关键报错规避、代码修正及实测注意事项。
在 macOS 上利用 Apple 自研芯片(如 M2 MacBook Air)训练 YOLOv8 时,开发者常误用 device='cuda' 或直接传入 torch.device('mps') 而未同步禁用 CUDA 相关逻辑,导致训练启动失败——典型报错为 AssertionError: Torch not compiled with CUDA enabled。该错误并非模型或数据问题,而是 Ultralytics 官方训练流程中*自动批处理(autobatch)模块硬编码调用了 `torch.cuda.API**,而 MPS 设备不兼容 CUDA 接口,即使显式指定device='mps',Ultralytics 内部仍会尝试调用torch.cuda.get_device_properties()`,从而触发断言失败。
✅ 正确配置步骤(适用于 macOS + Apple Silicon)
1. 确保 PyTorch 支持 MPS
安装 官方预编译支持 MPS 的 PyTorch 版本(≥2.0):
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/apple
验证 MPS 可用性:
import torch print(torch.backends.mps.is_available()) # 应输出 True print(torch.backends.mps.is_built()) # 应输出 True
2. 显式禁用 CUDA 自动检测与 AutoBatch
Ultralytics v8.0.200+ 已初步支持 MPS,但仍需绕过其内部 CUDA 依赖逻辑。关键做法是:
- 不传 device 参数给 .train()(让 Ultralytics 自动识别 MPS),
- 手动关闭 amp(混合精度)和 auto_batch(因 MPS 当前不完全支持 torch.cuda.amp 且 autobatch 强制调用 CUDA API)。
✅ 推荐训练代码(经实测可用):
from ultralytics import YOLO
import torch
# 加载模型(无需指定 device)
model = YOLO('yolov8s.pt')
# 启动训练 —— 关键参数设置
results = model.train(
data='mot17_data.yml', # 替换为你的数据集路径
epochs=30,
batch=16, # 手动指定合理 batch size(M2 Air 建议 8–32)
imgsz=640,
project='models/yolo',
name='yolov8s_mot17_det10',
device='mps', # ✅ 显式指定,但需配合下述禁用项
amp=False, # ❗必须设为 False:MPS 暂不支持 torch.cuda.amp
workers=0, # ❗macOS 多进程 dataloader 与 MPS 兼容性差,设为 0
cache='ram', # 可选:启用内存缓存加速加载(小数据集推荐)
)⚠️ 注意事项:
- workers=0 是 macOS + MPS 的必要设置,否则易出现 fork 错误或死锁;
- batch 必须手动指定(不能为 -1 或 None),因 autobatch 会触发 CUDA 调用;
- amp=False 是强制要求,当前 MPS 对 torch.cuda.amp 无等效实现,开启将报错;
- 若使用较老版本 Ultralytics(
3. 验证 MPS 是否真正生效
训练日志中应出现类似提示:
Using device=mps for training ... Starting training for 30 epochs...
而非 device=cpu 或报 CUDA 错误。你还可以在训练过程中观察 Activity Monitor → GPU History,确认 Metal GPU 占用率明显上升。
? 性能参考(M2 MacBook Air 8GB RAM)
| 配置 | 单 epoch 耗时 | 备注 |
|---|---|---|
| CPU(默认) | ~60 分钟 | 不推荐 |
| MPS(batch=16, amp=False) | ~8–12 分钟 | 显著加速,GPU 利用率 60–80% |
| MPS(batch=32) | ~6–9 分钟 | 内存压力增大,需监控是否 OOM |
? 提示:若遇到 MemoryError,优先降低 batch 或启用 cache='ram' 减少重复 IO。
✅ 总结:MPS 训练 YOLOv8 的黄金准则
- ✅ 使用 torch 官方 MPS 版本 + 最新版 ultralytics;
- ✅ 显式设置 device='mps',但必须关闭 amp=True 和 workers>0;
- ✅ 绝不依赖 autobatch,手动设定 batch 值(从 8 开始测试);
- ✅ 数据集建议 ≤5k 图像,避免内存溢出;
- ✅ 日志与系统监控双验证:确认 device=mps 日志 + Activity Monitor GPU 活跃。
遵循以上配置,即可在 M1/M2/M3 Mac 上稳定、高效地完成 YOLOv8 训练,告别小时级 CPU 等待——Metal 加速虽非 CUDA 级别性能,但已足够支撑中小规模目标检测实验与原型开发。










