根本原因是tensorflow默认不调用m1 gpu,全程cpu运行且易因架构不匹配报illegal hardware instruction;需分装tensorflow-macos(原生框架)和tensorflow-metal(metal插件),并满足macos≥12.3、启用内存增长、正确注册jupyter内核。

tensorflow 默认不支持 Apple Silicon,根本原因不是“不能运行”,而是它压根不会调用 GPU —— 全程在 CPU 上跑,还可能因架构不匹配直接报 illegal hardware instruction。
pip install tensorflow 为什么在 M1/M2 上会崩?
- 安装的是 x86_64 架构的通用 wheel,M 系列芯片原生不兼容,Rosetta 2 转译后仍可能触发非法指令(尤其涉及底层 BLAS 或 Eigen 运算时)
- 即使没崩溃,
tf.config.list_physical_devices('GPU')也永远返回空列表:Metal 后端根本没加载 - 常见错误日志里藏着关键线索:
Created TensorFlow device ... with 0 MB memory,说明设备识别失败,不是驱动问题,是插件缺失或版本断裂
必须分两步装 tensorflow-macos 和 tensorflow-metal
-
tensorflow-macos是 Apple Silicon 原生编译的主框架,但不含 GPU 支持逻辑 -
tensorflow-metal是独立插件,负责把算子映射到 Metal 指令;二者版本强绑定,比如tensorflow-macos==2.18.0只认tensorflow-metal==1.1.0 - 错一个版本,
import tensorflow可能成功,但训练时 kernel 直接重启,且无明确报错
macOS 版本和 Metal 绑定是硬门槛
-
sw_vers -productVersion输出必须 ≥12.3(Monterey 12.3 是最低要求) -
python -c "import Metal; print('OK')"必须不报错;若提示ModuleNotFoundError,说明系统级 Metal Python binding 缺失 → 只能升级系统 - 不要试图在 Rosetta 2 下启用 Metal:MPS 设备识别必然失败,
tf.config.list_physical_devices('GPU')永远为空
代码里不显式启用内存增长,GPU 就等于没开
即使设备已识别,TensorFlow 默认仍按传统 GPU 策略分配显存(而 M 系列是统一内存),结果就是:
- 训练前几轮很快,之后突然卡死或 OOM
- 日志里反复出现
could not identify numa node(M 系列根本没有 NUMA)
必须加这段初始化:
import tensorflow as tf
tf.config.set_memory_growth(tf.config.list_physical_devices('GPU')[0], True)
否则,哪怕 list_physical_devices('GPU') 返回了设备,实际运算仍 fallback 到 CPU。
最常被忽略的一点:Jupyter 内核是否在正确环境中启动?用 conda activate dl_env 激活后,还要用 python -m ipykernel install --user --name dl_env --display-name "Python (dl_env)" 重注册内核,否则 notebook 仍在用 base 环境跑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











