@0x0SojalSec:苹果在每台 M4 Mac 和 iPhone 中隐藏了 15.8 TFLOPS 的原始 AI 算力。他们只允许你使用神经网络引擎进行推理。……
摘要
一位开发者逆向工程了苹果的私有 API,使得在 M4 Mac 和 iPhone 的 Apple 神经网络引擎(ANE)上直接训练神经网络成为可能,绕过了 CoreML 和 GPU。该项目表明 ANE 硬件能够进行训练,尽管存在利用率低以及某些操作回退到 CPU 等限制。
查看缓存全文
缓存时间: 2026/06/15 23:10
Apple 在每台 M4 Mac 和 iPhone 中隐藏了 15.8 TFLOPS 的原始 AI 算力。
他们只允许你把 Neural Engine 用于推理。
我对他们的私有 API 进行了逆向工程,并直接在 ANE 上运行了完整的反向传播和 Transformer 训练,
没有 CoreML,没有 Metal,没有 GPU。
- 在 M4 上以 9.3ms/step 训练 Transformer。
完整的 Transformer 训练:前向传播、反向传播、注意力、梯度、优化器,全部在内存中完成。 - 从头构建自定义 MIL(模型中间语言)程序。
- 将神经网络图直接在内存中编译到 ANE 硬件。
- 零外部依赖,仅使用系统框架,无需写入磁盘,无需 mlmodelc 文件。
一切都在内存中完成。硬件本身是具备能力的。
解决方法?程序通过 exec() 对自己的状态进行检查点保存并重新启动。
它真的会“重生”以继续训练。
现在你可以在 Apple 的 Neural Engine 上进行训练了。
- http://github.com/maderix/ANE
maderix/ANE
来源:https://github.com/maderix/ANE
ANE 训练 —— 在 Apple Neural Engine 上实现反向传播
通过逆向工程获得的私有 API,直接在 Apple Neural Engine (ANE) 上训练神经网络。无需 CoreML 训练 API、无需 Metal、无需 GPU —— 纯 ANE 计算。
项目范围与意图
我由衷感谢本项目获得的所有关注 —— 我从未预料到一个周末研究 hack 能引起如此大的反响。感谢每一位 star、fork、在自己硬件上运行基准测试以及分享这项工作的人。这对我意义重大。
尽管如此,我想明确本项目的定位。
这是一个研究项目,而非生产框架。
目标是证明在 Apple Neural Engine 以及其他潜在 NPU 上进行训练是可行的,并且障碍从来都是软件支持,而非硬件能力。ANE 是一块性能卓越的硅片,但 Apple 通过 CoreML 将其限制为仅用于推理。本项目利用逆向工程获得的私有 API 绕过了这一限制,展示当你给硬件机会时可以实现什么。
本项目是什么
- 通过
_ANEClient和_ANECompiler私有 API 进行 ANE 训练的概念验证 - 记录真实 ANE 性能特征(吞吐量、功耗、SRAM 行为)的一组基准测试
- 为任何探索 CoreML 之外直接访问 ANE 的人提供参考
- 研究发现有趣内容时我会推送更新的研究代码
本项目不是什么
- 一个受维护的框架或库
- CoreML、MLX、llama.cpp 或任何生产推理栈的替代品
- 在消费级硬件上训练大模型的路径(目前)
关于炒作
一些媒体报道夸大了本项目的意义。在此明确说明:
- 训练可行,但利用率很低(约峰值 5-9%),仍有重大工程挑战
- 许多逐元素操作仍回退到 CPU
- 目前这不能替代 GPU 训练任何超出小型研究模型的规模
诚实的成果(包括所有限制)已记录在配套文章中:
- 第 1 部分:逆向工程 (https://maderix.substack.com/p/inside-the-m4-apple-neural-engine)
- 第 2 部分:基准测试 (https://maderix.substack.com/p/inside-the-m4-apple-neural-engine-615)
- 第 3 部分:训练 (https://maderix.substack.com/p/inside-the-m4-apple-neural-engine-c8b)
关于维护
我不打算将此项目发展成一个大型社区项目。我的重点是原创研究(边缘 AI 优化的编译器基础设施),维护一个开源框架会占用时间。
不过:
- 当我发现有趣的东西时,会持续推送更新
- 欢迎提交 bug 修复和基准测试贡献(尤其是我没有的硬件上的数据)
- 功能请求很可能不会被处理 —— 但欢迎 fork
- PR 合并速度会相对较慢,否则我会成为社区围绕这项技术发展的瓶颈
尽管 fork,在此基础上构建
本仓库使用 MIT 许可证。现在每个人都拥有了 AI 辅助开发工具,可以在几小时内适配和扩展代码。如果这个项目对你有用 —— 拿去用,修改它,构建更好的东西。如果你用它做了很酷的事情,我很乐意听说。如果未来社区决定维护一个统一的主仓库,我完全支持。
这是什么
一个从头实现的 Transformer 训练(前向 + 反向传播),在 Apple Silicon 的 ANE 上运行。ANE 是 Apple Silicon 中一个 15.8 TFLOPS FP16(M4)的推理加速器,Apple 不开放给训练使用。本项目逆向工程了 _ANEClient/_ANECompiler 私有 API 以及 MIL(模型中间语言)格式,在 ANE 硬件上直接运行自定义计算图 —— 包括反向传播。
当前结果:
| 模型 | 参数量 | ms/step | 流水线 |
|---|---|---|---|
| Stories110M (12L, dim=768, MHA 12/12) | 109M | 91 ms | 动态(无需重新编译) |
| Qwen3-0.6B (28L, dim=1024, GQA 16/8) | 596M | 412 ms | 动态(无需重新编译) |
- 所有前向和反向 dx 传递在 ANE 上,dW 梯度在 CPU 上(Accelerate cblas)
- Adam 优化器、梯度累积、通过 exec() 重启实现检查点/恢复
- 支持 GQA(分组查询注意力),通过每头切片/规约实现
- GPU↔ANE 零拷贝流水线,通过共享 IOSurface(GPU 预填充 → ANE 解码)
INT8 W8A8 量化 —— 吞吐量提升 1.88 倍(M4, H16G):
| 配置 | FP16 | INT8 W8A8 | 加速比 |
|---|---|---|---|
| 128x conv 512ch 64x64 | 18.6 TOPS, 14.8ms | 35.1 TOPS, 7.8ms | 1.88x |
| 64x conv 512ch 64x64 | 18.4 TOPS, 7.5ms | 34.1 TOPS, 4.0ms | 1.85x |
INT8 激活通过 MIL 的 quantize/dequantize 操作将 L2 SRAM 带宽减半。权重使用 constexpr_affine_dequantize(存储为 int8,编译时转为 fp16)。
架构
动态流水线使用共享的 ANE kernel,权重被打包进空间维度(权重变化时无需重新编译):
MHA 模型 (Stories110M) —— 每层 6 个 kernel:
| Kernel | 功能 |
|---|---|
sdpaFwd | QKV 投影 + SDPA + 输出投影 |
ffnFused | SwiGLU FFN (W1, W3, SiLU, W2) |
ffnBwdW2t / ffnBwdW13t | FFN 反向(为节省内存拆分) |
sdpaBwd1 / sdpaBwd2 | SDPA 反向 |
GQA 模型 (Qwen3-0.6B) —— 每层 10 个 kernel:
增加独立的 woFwd、qBwd、kvBwd kernel,用于分组查询注意力(Q_DIM ≠ DIM)。
CPU 负责:RMSNorm 前向/反向、残差连接(DeepNet α 缩放)、损失计算、dW 梯度累积(cblas_sgemm)、Adam 优化器更新。
关键优化:
- 通道优先的 CPU 布局 —— 匹配 ANE IOSurface 的
[1,C,1,S]格式,消除所有转置开销 - vDSP 向量化 RMSNorm —— 比朴素实现快 10 倍(6.7ms → 0.7ms)
- GCD 异步 cblas 重叠 —— dW 梯度 sgemm 与 ANE 评估在串行调度队列上并行运行
- 延迟 cblas 等待 —— 将等待推入下一步的前向传播中,实现最大重叠
- ANE RMSNorm 融合 —— RMSNorm 作为 MIL 操作融合到前向 kernel(reduce_sum + pow + mul)
- Wo^T 融合 —— 输出投影反向合并到 SDPA 反向 kernel
- 前向 tap —— Q、K、V、注意力分数、隐藏状态通过 concat 输出暴露,避免 CPU 重新计算
- exec() 重启 —— 绕过每个进程约 119 次 ANE 编译的限制
文件结构
├── api_exploration.m # 初始 ANE API 发现 ├── inmem_basic.m # 内存内 MIL 编译概念验证 ├── inmem_bench.m # ANE 调度延迟基准测试 ├── inmem_peak.m # 峰值 TFLOPS 测量 (2048x2048 matmul) ├── ane_int8_bench.m # INT8 W8A8 vs FP16 吞吐量基准测试 ├── sram_bench.m # ANE SRAM 带宽探测 ├── sram_probe.m # SRAM 大小/布局探索 ├── gpu_ane_share.m # GPU↔ANE 零拷贝 IOSurface 演示 ├── gpu_prefill_ane_decode.m # GPU 预填充 → ANE 解码流水线 ├── bridge/ │ ├── ane_bridge.h # C 可调用的 ANE API(编译、评估、I/O) │ ├── ane_bridge.m # 桥接实现(int8 + fp16 权重 blob) │ └── Makefile └── training/ ├── ane_runtime.h # ANE 私有 API 包装器(编译、评估、IOSurface) ├── ane_classifier.h # 分类器前向(32K conv)、softmax、rmsnorm 在 ANE 上 ├── train_large.m # 静态流水线(权重作为常量,重新编译) ├── training_dynamic/ │ ├── train.m # 动态训练循环(模型无关) │ ├── config.h # 派生大小、结构体、分配辅助函数 │ ├── mil_dynamic.h # 用于动态权重 kernel 的 MIL 生成器(支持 GQA) │ ├── io.h # IOSurface I/O、权重暂存、GQA 切片/规约 │ ├── models/ │ │ ├── stories110m.h # Stories110M 配置 (12L, MHA) │ │ └── qwen3_06b.h # Qwen3-0.6B 配置 (28L, GQA) │ └── Makefile ├── dashboard.py # 实时训练仪表盘(文本终端界面) └── Makefile
训练数据
训练需要预分词的 TinyStories 数据。下载命令:
bash cd training && bash download_data.sh
详细训练说明见 training/README.md。
构建
需要 macOS 15+ 和 Apple Silicon(已在 M4 上测试)。
``bash
动态流水线(推荐)—— 在构建时选择模型
cd training/training_dynamic make MODEL=stories110m # Stories110M (12L, MHA, 109M params) make MODEL=qwen3_06b # Qwen3-0.6B (28L, GQA, 596M params) ./train –scratch # 从随机初始化开始训练 ./train –resume # 从检查点恢复
静态流水线(旧版 —— 每一步重新编译权重)
cd training && make train_large ./train_large ane_stories110M_ckpt.bin 256 100 1e-4
INT8 基准测试
xcrun clang -O2 -fobjc-arc -framework Foundation -framework IOSurface -ldl
-o ane_int8_bench ane_int8_bench.m
./ane_int8_bench
桥接库(C 可调用的 ANE API)
cd bridge && make ``
无外部依赖。仅使用系统框架 + 运行时通过 objc_msgSend 解析的私有 ANE API。
工作原理
- MIL 生成 —— Objective-C 代码在运行时构建 MIL 程序文本,指定卷积(用于线性层)、矩阵乘(用于注意力)、softmax、逐元素操作
- 内存内编译 ——
_ANEInMemoryModelDescriptor将 MIL 文本 + 权重 blob 直接编译成 ANE 程序,无需磁盘 mlmodelc - IOSurface I/O —— 输入/输出张量通过 IOSurface 共享内存在
[1, channels, 1, spatial]格式中传递(fp16 或 fp32;fp16 直接 I/O 快约 37%) - 动态权重 —— 激活值和权重被打包进单个空间输入维度,在 MIL kernel 内部切片出来。权重变化无需重新编译。
- 梯度流 —— 前向 tap 暴露反向所需中间值;反向 kernel 在 ANE 上计算 dx(输入梯度);dW(权重梯度)在 CPU 上通过 cblas 计算
- INT8 量化 ——
constexpr_affine_dequantize用于 int8 权重,quantize/dequantize在层间用于 L2 SRAM 中的 int8 激活缓存(吞吐量提升 1.88 倍)
限制
- SDPA 因果掩码 —— ANE 硬件在 SDPA 操作中忽略
attn_mask;因果注意力被分解为 Q@K^T(ANE)→ mask+softmax(CPU)→ scores@V(ANE) - 约 119 次编译限制 —— ANE 编译器泄漏资源;通过带有检查点的
exec()重启绕过 - FP16 梯度下溢 —— 反向矩阵乘在 fp16 下下溢;通过全局损失缩放(
256 * NLAYERS)修复 - 单输入限制 —— 多输入 ANE 请求导致 0x1d 错误;改为将输入打包进空间维度
性能
训练吞吐量 (M4):
| 模型 | 参数量 | ms/step | 层数 | 每层 kernel 数 |
|---|---|---|---|---|
| Stories110M | 109M | 91 ms | 12 | 6 (MHA) |
| Qwen3-0.6B | 596M | 412 ms | 28 | 10 (GQA) |
ANE 峰值吞吐量 (M4, H16G):
| 精度 | 峰值 TOPS | 配置 |
|---|---|---|
| FP16 | 18.6 | 128x conv 512ch 64x64 |
| INT8 W8A8 | 35.1 | 128x conv 512ch 64x64 |
GPU↔ANE 推理流水线 (M4, seq=256):
| 模型 | GPU 预填充 | ANE 解码 | 总计 |
|---|---|---|---|
| Stories110M | 6.7ms | 1.9ms | 8.8ms |
| Qwen3-0.6B | 9.7ms | 2.3ms | 12.0ms |
免责声明
本项目使用 Apple 私有的、未文档化的 API(_ANEClient、_ANECompiler、_ANEInMemoryModelDescriptor)。这些 API 不受任何公开稳定性保证的约束,可能在 macOS 更新时发生变化或失效。这是关于 Apple Neural Engine 架构的独立研究,使用通过运行时内省发现的 API,基于合理使用和互操作性条款(参见 Sega v. Accolade, 1992;DMCA §1201(f))进行研究和教育。本仓库不包含任何 Apple 专有代码或二进制文件。本项目与 Apple Inc. 无关联,也未获其认可。使用风险自负。
许可证
MIT —— 见 LICENSE
由人类 + Claude 在一个周末内构建。
相似文章
苹果发布全新 Apple Silicon 端侧推理引擎
苹果在 WWDC 上发布了 CoreAI,这是一款适用于 Apple Silicon 的全新端侧推理引擎,将取代 CoreML,并通过优化推理支持多达 200 亿参数的更大模型,重点面向手机和平板设备。
@akshay_pachaar: 苹果终于做到了。其新框架 Core AI 完全在 Apple 芯片上运行模型,因此推理发生在用户设备上…
苹果发布了 Core AI,这是一个新框架,可在 Apple 硅设备(iPhone、iPad、Mac、Vision Pro)上完全运行 AI 模型,无需服务器调用。它包含一个内存安全的 Swift API、用于 PyTorch 的模型导出配方、一个优化器和调试工具,支持 Qwen、Mistral 和 SAM3 等模型。
苹果押注AI靠硬件,而非软件
苹果赌定AI的未来取决于定制硬件与iPhone先进处理器实现的本地推理,而非云端大模型。
我为Apple Silicon打造了最快的本地AI引擎。专为代理式使用优化。
作者宣布发布'lightning-mlx',这是一个针对Apple Silicon优化的本地AI引擎,可为编码代理和工具调用工作流实现高令牌速度。
Apple Core AI Framework
Apple 推出 Core AI Framework,一种用于设备端机器学习的新工具。