一、背景
最近开始尝试在 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 是否已经安装:
conda--version本机输出:
conda 26.3.2创建名为yolo的 Python 3.11 环境:
conda create-nyolopython=3.11-y激活环境:
conda activate yolo激活成功后,终端前面会出现:
(yolo)检查当前 Python 是否为 Apple Silicon 原生架构:
python-c"import platform; print(platform.machine())"输出:
arm64继续检查 Python 的实际路径:
whichpython本机输出:
/opt/homebrew/Caskroom/miniforge/base/envs/yolo/bin/python这说明当前使用的是yolo环境中的 Python,而不是 macOS 系统自带的 Python。
四、安装 PyTorch
先更新 Python 包管理工具:
python-mpipinstall--upgradepip setuptools wheel然后安装 PyTorch 和 torchvision:
python-mpipinstalltorch torchvision本次实际安装的版本为:
torch 2.13.0 torchvision 0.28.0安装的 wheel 文件明确带有macosx和arm64标识,说明安装的是 Apple Silicon 原生版本,而不是通过 Rosetta 运行的 Intel 版本。
为了以后能够完全复现本次环境,也可以直接指定版本:
python-mpipinstalltorch==2.13.0torchvision==0.28.0五、验证 Apple M5 GPU 和 MPS
安装 PyTorch 后,最关键的一步是确认 MPS 是否可用。
执行:
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本机输出的关键信息为:
计算机架构: 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 版本:
python-mpip index versions ultralytics当时查询到的最新版本为:
8.4.91本次实际使用以下命令安装:
python-mpipinstall-Uultralytics为了避免以后重新安装时版本发生变化,更推荐明确指定版本:
python-mpipinstallultralytics==8.4.91安装完成后执行环境检查:
yolo checks检查结果显示:
Ultralytics 8.4.91 Python 3.11.15 torch 2.13.0 Apple M5 24GB RAM Setup completeUltralytics 及其依赖均安装成功。
为什么yolo checks显示 GPU 为 None
检查结果中还出现了:
GPU None CUDA None这并不代表 Apple GPU 无法使用。
这里的 GPU 信息主要面向 CUDA 设备。Apple Silicon 不使用 CUDA,而是通过 MPS 调用 GPU。判断 Apple GPU 是否可用,应当看:
torch.backends.mps.is_available()以及训练开始时是否显示:
MPS (Apple M5)本次后续训练已经明确使用 MPS 成功运行,因此GPU None不影响实际训练。
七、Ultralytics 版本和 YOLO 模型版本不是一回事
这里很容易产生一个误解。
本次安装的是:
ultralytics 8.4.91这表示 Python 软件包的版本。
而下面这些:
yolov8n.pt yolo11n.pt yolo26n.pt表示不同的 YOLO 模型及模型权重。
因此,安装ultralytics==8.4.91并不意味着只能使用 YOLOv8。只要当前 Ultralytics 版本支持,就可以在同一个 Python 环境中保存并调用多个模型权重。
例如使用 YOLO11:
yolo detect train\model=yolo11n.pt\data=coco8.yaml\epochs=1\imgsz=640\batch=2\device=mps本次实际冒烟测试使用的是yolo26n.pt,但环境搭建方式与使用 YOLO11 完全一致。
八、执行第一次 YOLO 冒烟训练
为了验证整套环境是否真正可用,使用 Ultralytics 官方提供的coco8小型数据集进行一次训练。
实际执行命令如下:
yolo detect train\model=yolo26n.pt\data=coco8.yaml\epochs=1\imgsz=640\batch=2\device=mps\workers=2几个主要参数的含义:
model=yolo26n.pt 使用 Nano 轻量模型 data=coco8.yaml 使用官方小型测试数据集 epochs=1 只训练一轮,用于环境验证 imgsz=640 输入图片尺寸为 640×640 batch=2 每批处理两张图片 device=mps 使用 Apple GPU workers=2 设置数据加载进程数第一次运行时,系统自动下载了:
yolo26n.pt coco8.zip训练启动信息中明确显示:
Ultralytics 8.4.91 Python 3.11.15 torch 2.13.0 MPS (Apple M5)这说明 YOLO 已经成功调用 Apple M5 GPU,而不是退回 CPU。
九、第一次训练结果
模型结构统计如下:
YOLO26n 260 layers 2,572,280 parameters 6.1 GFLOPs训练数据集包含:
训练图片:4张 验证图片:4张 验证目标:17个一轮训练正常完成,训练阶段大约耗时8秒。验证结果为:
Precision:0.889 Recall:0.661 mAP50:0.902 mAP50-95:0.668这里的数据量非常小,指标没有实际项目价值。本次训练的目的只是验证:
- 模型能够加载;
- 数据集能够下载和解析;
- 前向传播正常;
- 反向传播正常;
- MPS 可以参与训练;
- 权重可以正常保存;
- 验证流程可以完整执行。
最终结果保存在:
/opt/homebrew/runs/detect/train主要文件包括:
/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 的确定性警告
训练过程中出现了以下警告:
index_put_with_accumulate_mps does not have a deterministic implementation这条信息的意思是:
当前训练开启了确定性算法,但 PyTorch 中某个 MPS 算子还没有完全确定性的实现。
这是一条警告,不是错误。本次训练在警告出现后仍然完成了反向传播、模型验证和权重保存,因此不会影响环境是否搭建成功。
若后续不要求每次训练结果严格复现,可以尝试:
yolo detect train\model=yolo11n.pt\data=data.yaml\device=mps\deterministic=False对于正式实验,如果需要对比不同模型或超参数,仍建议固定随机种子,并记录完整训练配置。
十一、安装 JupyterLab
为了方便后续通过 Notebook 编写代码,继续安装 JupyterLab 和 ipykernel:
python-mpipinstalljupyterlab ipykernel本次安装的主要版本为:
jupyterlab 4.6.1 ipykernel 7.3.0把当前 Conda 环境注册为 Jupyter 内核:
python-mipykernelinstall\--user\--nameyolo\--display-name"Python 3.11 - YOLO MPS"安装成功后输出:
Installed kernelspec yolo in /Users/jefferliu/Library/Jupyter/kernels/yolo启动 JupyterLab:
jupyter lab服务成功运行在:
http://localhost:8888/lab进入 JupyterLab 后,应选择以下内核:
Python 3.11 - YOLO MPSJupyterLab、内核注册和本地服务均已正常启动。
需要注意,Jupyter 启动地址中通常包含访问 Token。Token 相当于临时访问凭证,不应复制到公开博客、聊天群或代码仓库中。
十二、安装过程中遇到的一个小问题
停止 JupyterLab 时,终端出现:
Shut down this Jupyter server (y/[n])?此时在同一个终端直接输入了:
brewinstall--caskvisual-studio-code但这条命令并没有被 Shell 执行,而是被 Jupyter 当成了关机确认问题的回答,因此 Jupyter 又恢复了运行。日志最后显示的是resuming operation,而不是 VS Code 安装成功。
正确处理方法有两种。
第一种,先关闭 Jupyter:
Control + C y关闭后再执行:
brewinstall--caskvisual-studio-code第二种,保持 Jupyter 运行,另外打开一个新的终端窗口,再安装 VS Code。
十三、在 JupyterLab 中验证 MPS
创建 Notebook 后,可以运行下面的代码:
importplatformimporttorchimportultralyticsprint("架构:",platform.machine())print("PyTorch:",torch.__version__)print("Ultralytics:",ultralytics.__version__)print("MPS可用:",torch.backends.mps.is_available())device="mps"iftorch.backends.mps.is_available()else"cpu"print("当前设备:",device)预期输出:
架构: arm64 PyTorch: 2.13.0 Ultralytics: 8.4.91 MPS可用: True 当前设备: mps也可以直接在 Notebook 中训练 YOLO11:
fromultralyticsimportYOLO model=YOLO("yolo11n.pt")results=model.train(data="coco8.yaml",epochs=1,imgsz=640,batch=2,device="mps",workers=2)十四、保存当前环境
仅仅把安装命令记录在文章中还不够。为了准确复现,建议在环境稳定后导出依赖。
导出 pip 依赖:
python-mpip freeze>requirements-yolo-m5.txt导出完整 Conda 环境:
condaenvexport--no-builds>yolo-m5-environment.yml以后可以通过以下命令重建环境:
condaenvcreate-fyolo-m5-environment.yml查看环境:
condaenvlist激活环境:
conda activate yolo退出环境:
conda deactivate彻底删除环境:
conda remove-nyolo--all十五、完整复现命令
下面是根据本次实际版本整理的精简复现流程:
# 1. 创建环境conda create-nyolopython=3.11-y# 2. 激活环境conda activate yolo# 3. 验证架构python-c"import platform; print(platform.machine())"# 4. 更新基础工具python-mpipinstall--upgradepip setuptools wheel# 5. 安装指定版本的PyTorchpython-mpipinstalltorch==2.13.0torchvision==0.28.0# 6. 安装指定版本的Ultralyticspython-mpipinstallultralytics==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. 安装JupyterLabpython-mpipinstalljupyterlab==4.6.1ipykernel==7.3.0# 10. 注册Jupyter内核python-mipykernelinstall\--user\--nameyolo\--display-name"Python 3.11 - YOLO MPS"# 11. 启动JupyterLabjupyter 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开始第一个自定义目标检测模型训练。