一、背景
最近开始尝试在 Apple M5 MacBook Pro 上进行 YOLO 模型训练。
这台机器使用 Apple M5 芯片和统一内存架构,不支持 NVIDIA CUDA,但可以通过 PyTorch 的 MPS 后端调用 Apple GPU。因此,这次环境搭建的核心目标是:
- 使用 Conda 创建独立的 Python 环境;
- 安装支持 Apple Silicon 的 PyTorch;
- 验证 MPS 是否能够调用 M5 GPU;
- 安装 Ultralytics;
- 使用官方示例数据集完成一次 YOLO 冒烟训练;
- 安装 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 文件明确带有 macosx 和 arm64 标识,说明安装的是 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.pt 和 last.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.pt与last.pt权重正常生成;- JupyterLab 和独立 YOLO 内核正常运行。
Apple M5 虽然不能使用 CUDA,但对于 YOLO Nano、Small 等轻量模型的学习、小型数据集训练、模型微调和功能验证已经足够。
接下来就可以进入真正的项目阶段:准备自己的图片、完成目标标注、编写 data.yaml,然后使用 yolo11n.pt 开始第一个自定义目标检测模型训练。