在 Apple M5 MacBook Pro 上搭建 YOLO 训练环境:从 PyTorch MPS 到首次训练完整实录

一、背景

最近开始尝试在 Apple M5 MacBook Pro 上进行 YOLO 模型训练。

这台机器使用 Apple M5 芯片和统一内存架构,不支持 NVIDIA CUDA,但可以通过 PyTorch 的 MPS 后端调用 Apple GPU。因此,这次环境搭建的核心目标是:

  1. 使用 Conda 创建独立的 Python 环境;
  2. 安装支持 Apple Silicon 的 PyTorch;
  3. 验证 MPS 是否能够调用 M5 GPU;
  4. 安装 Ultralytics;
  5. 使用官方示例数据集完成一次 YOLO 冒烟训练;
  6. 安装 JupyterLab,方便后续编写训练代码。

本文完整记录实际执行过程,方便以后回查和重新搭建环境。


二、本次环境信息

本次实际安装完成后的主要环境如下:

项目 版本或配置
操作系统 macOS 26.5 arm64
芯片 Apple M5
统一内存 24GB
Conda 26.3.2
Python 3.11.15
PyTorch 2.13.0
torchvision 0.28.0
Ultralytics 8.4.91
JupyterLab 4.6.1
ipykernel 7.3.0
GPU 加速后端 MPS

Conda 创建环境时已经正确识别为 osx-arm64,Python 环境最终安装在 Miniforge 的独立环境目录中。


三、创建独立的 YOLO 环境

首先检查 Conda 是否已经安装:

bash 复制代码
conda --version

本机输出:

text 复制代码
conda 26.3.2

创建名为 yolo 的 Python 3.11 环境:

bash 复制代码
conda create -n yolo python=3.11 -y

激活环境:

bash 复制代码
conda activate yolo

激活成功后,终端前面会出现:

text 复制代码
(yolo)

检查当前 Python 是否为 Apple Silicon 原生架构:

bash 复制代码
python -c "import platform; print(platform.machine())"

输出:

text 复制代码
arm64

继续检查 Python 的实际路径:

bash 复制代码
which python

本机输出:

text 复制代码
/opt/homebrew/Caskroom/miniforge/base/envs/yolo/bin/python

这说明当前使用的是 yolo 环境中的 Python,而不是 macOS 系统自带的 Python。


四、安装 PyTorch

先更新 Python 包管理工具:

bash 复制代码
python -m pip install --upgrade pip setuptools wheel

然后安装 PyTorch 和 torchvision:

bash 复制代码
python -m pip install torch torchvision

本次实际安装的版本为:

text 复制代码
torch 2.13.0
torchvision 0.28.0

安装的 wheel 文件明确带有 macosxarm64 标识,说明安装的是 Apple Silicon 原生版本,而不是通过 Rosetta 运行的 Intel 版本。

为了以后能够完全复现本次环境,也可以直接指定版本:

bash 复制代码
python -m pip install torch==2.13.0 torchvision==0.28.0

五、验证 Apple M5 GPU 和 MPS

安装 PyTorch 后,最关键的一步是确认 MPS 是否可用。

执行:

bash 复制代码
python - <<'PY'
import platform
import torch

print("计算机架构:", platform.machine())
print("PyTorch版本:", torch.__version__)
print("MPS已构建:", torch.backends.mps.is_built())
print("MPS可用:", torch.backends.mps.is_available())

if torch.backends.mps.is_available():
    x = torch.rand(3, 3, device="mps")
    print("GPU张量设备:", x.device)
    print(x)
else:
    print("当前未检测到可用的MPS设备")
PY

本机输出的关键信息为:

text 复制代码
计算机架构: arm64
PyTorch版本: 2.13.0
MPS已构建: True
MPS可用: True
GPU张量设备: mps:0

同时成功在 mps:0 设备上创建了一个随机张量。

这一步说明:

  • 当前 Python 是 ARM64 原生环境;
  • PyTorch 已经编译了 MPS 支持;
  • Apple M5 GPU 可以被 PyTorch 调用;
  • 后续 YOLO 训练可以使用 device=mps

六、安装 Ultralytics

在安装之前,可以查看 PyPI 上可用的 Ultralytics 版本:

bash 复制代码
python -m pip index versions ultralytics

当时查询到的最新版本为:

text 复制代码
8.4.91

本次实际使用以下命令安装:

bash 复制代码
python -m pip install -U ultralytics

为了避免以后重新安装时版本发生变化,更推荐明确指定版本:

bash 复制代码
python -m pip install ultralytics==8.4.91

安装完成后执行环境检查:

bash 复制代码
yolo checks

检查结果显示:

text 复制代码
Ultralytics 8.4.91
Python 3.11.15
torch 2.13.0
Apple M5
24GB RAM
Setup complete

Ultralytics 及其依赖均安装成功。

为什么 yolo checks 显示 GPU 为 None

检查结果中还出现了:

text 复制代码
GPU    None
CUDA   None

这并不代表 Apple GPU 无法使用。

这里的 GPU 信息主要面向 CUDA 设备。Apple Silicon 不使用 CUDA,而是通过 MPS 调用 GPU。判断 Apple GPU 是否可用,应当看:

python 复制代码
torch.backends.mps.is_available()

以及训练开始时是否显示:

text 复制代码
MPS (Apple M5)

本次后续训练已经明确使用 MPS 成功运行,因此 GPU None 不影响实际训练。


七、Ultralytics 版本和 YOLO 模型版本不是一回事

这里很容易产生一个误解。

本次安装的是:

text 复制代码
ultralytics 8.4.91

这表示 Python 软件包的版本。

而下面这些:

text 复制代码
yolov8n.pt
yolo11n.pt
yolo26n.pt

表示不同的 YOLO 模型及模型权重。

因此,安装 ultralytics==8.4.91 并不意味着只能使用 YOLOv8。只要当前 Ultralytics 版本支持,就可以在同一个 Python 环境中保存并调用多个模型权重。

例如使用 YOLO11:

bash 复制代码
yolo detect train \
  model=yolo11n.pt \
  data=coco8.yaml \
  epochs=1 \
  imgsz=640 \
  batch=2 \
  device=mps

本次实际冒烟测试使用的是 yolo26n.pt,但环境搭建方式与使用 YOLO11 完全一致。


八、执行第一次 YOLO 冒烟训练

为了验证整套环境是否真正可用,使用 Ultralytics 官方提供的 coco8 小型数据集进行一次训练。

实际执行命令如下:

bash 复制代码
yolo detect train \
  model=yolo26n.pt \
  data=coco8.yaml \
  epochs=1 \
  imgsz=640 \
  batch=2 \
  device=mps \
  workers=2

几个主要参数的含义:

text 复制代码
model=yolo26n.pt   使用 Nano 轻量模型
data=coco8.yaml    使用官方小型测试数据集
epochs=1           只训练一轮,用于环境验证
imgsz=640          输入图片尺寸为 640×640
batch=2            每批处理两张图片
device=mps         使用 Apple GPU
workers=2          设置数据加载进程数

第一次运行时,系统自动下载了:

text 复制代码
yolo26n.pt
coco8.zip

训练启动信息中明确显示:

text 复制代码
Ultralytics 8.4.91
Python 3.11.15
torch 2.13.0
MPS (Apple M5)

这说明 YOLO 已经成功调用 Apple M5 GPU,而不是退回 CPU。


九、第一次训练结果

模型结构统计如下:

text 复制代码
YOLO26n
260 layers
2,572,280 parameters
6.1 GFLOPs

训练数据集包含:

text 复制代码
训练图片:4张
验证图片:4张
验证目标:17个

一轮训练正常完成,训练阶段大约耗时8秒。验证结果为:

text 复制代码
Precision:0.889
Recall:0.661
mAP50:0.902
mAP50-95:0.668

这里的数据量非常小,指标没有实际项目价值。本次训练的目的只是验证:

  • 模型能够加载;
  • 数据集能够下载和解析;
  • 前向传播正常;
  • 反向传播正常;
  • MPS 可以参与训练;
  • 权重可以正常保存;
  • 验证流程可以完整执行。

最终结果保存在:

text 复制代码
/opt/homebrew/runs/detect/train

主要文件包括:

text 复制代码
/opt/homebrew/runs/detect/train/weights/best.pt
/opt/homebrew/runs/detect/train/weights/last.pt
/opt/homebrew/runs/detect/train/results.png
/opt/homebrew/runs/detect/train/labels.jpg

日志显示 best.ptlast.pt 均已成功生成,说明完整训练链路已经跑通。


十、关于 MPS 的确定性警告

训练过程中出现了以下警告:

text 复制代码
index_put_with_accumulate_mps does not have a deterministic implementation

这条信息的意思是:

当前训练开启了确定性算法,但 PyTorch 中某个 MPS 算子还没有完全确定性的实现。

这是一条警告,不是错误。本次训练在警告出现后仍然完成了反向传播、模型验证和权重保存,因此不会影响环境是否搭建成功。

若后续不要求每次训练结果严格复现,可以尝试:

bash 复制代码
yolo detect train \
  model=yolo11n.pt \
  data=data.yaml \
  device=mps \
  deterministic=False

对于正式实验,如果需要对比不同模型或超参数,仍建议固定随机种子,并记录完整训练配置。


十一、安装 JupyterLab

为了方便后续通过 Notebook 编写代码,继续安装 JupyterLab 和 ipykernel:

bash 复制代码
python -m pip install jupyterlab ipykernel

本次安装的主要版本为:

text 复制代码
jupyterlab 4.6.1
ipykernel 7.3.0

把当前 Conda 环境注册为 Jupyter 内核:

bash 复制代码
python -m ipykernel install \
  --user \
  --name yolo \
  --display-name "Python 3.11 - YOLO MPS"

安装成功后输出:

text 复制代码
Installed kernelspec yolo in
/Users/jefferliu/Library/Jupyter/kernels/yolo

启动 JupyterLab:

bash 复制代码
jupyter lab

服务成功运行在:

text 复制代码
http://localhost:8888/lab

进入 JupyterLab 后,应选择以下内核:

text 复制代码
Python 3.11 - YOLO MPS

JupyterLab、内核注册和本地服务均已正常启动。

需要注意,Jupyter 启动地址中通常包含访问 Token。Token 相当于临时访问凭证,不应复制到公开博客、聊天群或代码仓库中。


十二、安装过程中遇到的一个小问题

停止 JupyterLab 时,终端出现:

text 复制代码
Shut down this Jupyter server (y/[n])?

此时在同一个终端直接输入了:

bash 复制代码
brew install --cask visual-studio-code

但这条命令并没有被 Shell 执行,而是被 Jupyter 当成了关机确认问题的回答,因此 Jupyter 又恢复了运行。日志最后显示的是 resuming operation,而不是 VS Code 安装成功。

正确处理方法有两种。

第一种,先关闭 Jupyter:

text 复制代码
Control + C
y

关闭后再执行:

bash 复制代码
brew install --cask visual-studio-code

第二种,保持 Jupyter 运行,另外打开一个新的终端窗口,再安装 VS Code。


十三、在 JupyterLab 中验证 MPS

创建 Notebook 后,可以运行下面的代码:

python 复制代码
import platform
import torch
import ultralytics

print("架构:", platform.machine())
print("PyTorch:", torch.__version__)
print("Ultralytics:", ultralytics.__version__)
print("MPS可用:", torch.backends.mps.is_available())

device = "mps" if torch.backends.mps.is_available() else "cpu"
print("当前设备:", device)

预期输出:

text 复制代码
架构: arm64
PyTorch: 2.13.0
Ultralytics: 8.4.91
MPS可用: True
当前设备: mps

也可以直接在 Notebook 中训练 YOLO11:

python 复制代码
from ultralytics import YOLO

model = YOLO("yolo11n.pt")

results = model.train(
    data="coco8.yaml",
    epochs=1,
    imgsz=640,
    batch=2,
    device="mps",
    workers=2
)

十四、保存当前环境

仅仅把安装命令记录在文章中还不够。为了准确复现,建议在环境稳定后导出依赖。

导出 pip 依赖:

bash 复制代码
python -m pip freeze > requirements-yolo-m5.txt

导出完整 Conda 环境:

bash 复制代码
conda env export --no-builds > yolo-m5-environment.yml

以后可以通过以下命令重建环境:

bash 复制代码
conda env create -f yolo-m5-environment.yml

查看环境:

bash 复制代码
conda env list

激活环境:

bash 复制代码
conda activate yolo

退出环境:

bash 复制代码
conda deactivate

彻底删除环境:

bash 复制代码
conda remove -n yolo --all

十五、完整复现命令

下面是根据本次实际版本整理的精简复现流程:

bash 复制代码
# 1. 创建环境
conda create -n yolo python=3.11 -y

# 2. 激活环境
conda activate yolo

# 3. 验证架构
python -c "import platform; print(platform.machine())"

# 4. 更新基础工具
python -m pip install --upgrade pip setuptools wheel

# 5. 安装指定版本的PyTorch
python -m pip install torch==2.13.0 torchvision==0.28.0

# 6. 安装指定版本的Ultralytics
python -m pip install ultralytics==8.4.91

# 7. 检查环境
yolo checks

# 8. 使用YOLO11进行冒烟训练
yolo detect train \
  model=yolo11n.pt \
  data=coco8.yaml \
  epochs=1 \
  imgsz=640 \
  batch=2 \
  device=mps \
  workers=2

# 9. 安装JupyterLab
python -m pip install jupyterlab==4.6.1 ipykernel==7.3.0

# 10. 注册Jupyter内核
python -m ipykernel install \
  --user \
  --name yolo \
  --display-name "Python 3.11 - YOLO MPS"

# 11. 启动JupyterLab
jupyter lab

十六、总结

本次在 Apple M5 MacBook Pro 上完成了 YOLO 基础训练环境搭建,并验证了以下内容:

  • Miniforge 和 Conda 环境正常;
  • Python 运行在原生 ARM64 架构;
  • PyTorch 正确支持 MPS;
  • Apple M5 GPU 可以执行张量计算;
  • Ultralytics 安装成功;
  • YOLO 模型能够通过 MPS 完成训练和验证;
  • best.ptlast.pt 权重正常生成;
  • JupyterLab 和独立 YOLO 内核正常运行。

Apple M5 虽然不能使用 CUDA,但对于 YOLO Nano、Small 等轻量模型的学习、小型数据集训练、模型微调和功能验证已经足够。

接下来就可以进入真正的项目阶段:准备自己的图片、完成目标标注、编写 data.yaml,然后使用 yolo11n.pt 开始第一个自定义目标检测模型训练。

相关推荐
Promise微笑4 小时前
激光清障仪市场与技术深度分析:基于原理、应用及厂家格局的综述
大数据·人工智能·物联网
eybk4 小时前
写一个可以编制pdf文件的python程序
开发语言·python·pdf
大郭鹏宇4 小时前
LangChain Model I/O 完全指南:从模型调用到多平台实战
人工智能
2601_956414144 小时前
AI生成的材质不够真实,该如何在平台内优化?V2Fun里的材质修正流程
人工智能·材质
卷无止境4 小时前
从Python的cryptography库出发,从零开始理解密码学,到构建零信任网络
后端·python
没落英雄4 小时前
5. 从零开始搭建一个 AI Agent —— 人机协作与中断恢复
前端·人工智能·架构
YFJ_mily4 小时前
**Python 实战:写一个论文 PDF 投稿自检工具|附 IPAT 2026 智能光子学会议征稿信息
人工智能·python·pdf·量子计算·论文投稿·智能光子学
三川6984 小时前
Tkinter库的学习记录05-文本框Entry
python
科技发布4 小时前
广告投放首选:传播易、朝闻通、拓氪科技三大营销平台
人工智能·科技
cui_ruicheng4 小时前
Python从入门到实战(八):封装、多态与抽象类
开发语言·python