@0x0SojalSec:苹果在每台 M4 Mac 和 iPhone 中隐藏了 15.8 TFLOPS 的原始 AI 算力。他们只允许你使用神经网络引擎进行推理。……

X AI KOLs Timeline 工具

摘要

一位开发者逆向工程了苹果的私有 API,使得在 M4 Mac 和 iPhone 的 Apple 神经网络引擎(ANE)上直接训练神经网络成为可能,绕过了 CoreML 和 GPU。该项目表明 ANE 硬件能够进行训练,尽管存在利用率低以及某些操作回退到 CPU 等限制。

苹果在每台 M4 Mac 和 iPhone 中隐藏了 15.8 TFLOPS 的原始 AI 算力。 他们只允许你使用神经网络引擎进行推理。 逆向工程了他们的私有 API,并直接在 ANE 上运行完整的反向传播和 Transformer 训练, 无需 CoreML,无需 Metal,无需 GPU。 - 在 M4 上以 9.3ms/步的速度训练 Transformer。 完整的 Transformer 训练:前向传播、反向传播、注意力机制、梯度、优化器 全部在内存中完成。 - 从头构建自定义 MIL(模型中间语言)程序 - 将神经网络图直接编译到内存中的 ANE 硬件上 - 零外部依赖。 仅使用系统框架。无需磁盘写入,无需 mlmodelc 文件, 一切都在内存中完成,硬件是可行的。 解决方法?没错。 程序会检查其状态,并通过 exec() 重新启动自身。 它实际上是通过重生来保持训练。 现在你可以在 Apple 的神经网络引擎上进行训练了。 - http://github.com/maderix/ANE
查看原文
查看缓存全文

缓存时间: 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)109M91 ms动态(无需重新编译)
Qwen3-0.6B (28L, dim=1024, GQA 16/8)596M412 ms动态(无需重新编译)
  • 所有前向和反向 dx 传递在 ANE 上,dW 梯度在 CPU 上(Accelerate cblas)
  • Adam 优化器、梯度累积、通过 exec() 重启实现检查点/恢复
  • 支持 GQA(分组查询注意力),通过每头切片/规约实现
  • GPU↔ANE 零拷贝流水线,通过共享 IOSurface(GPU 预填充 → ANE 解码)

INT8 W8A8 量化 —— 吞吐量提升 1.88 倍(M4, H16G):

配置FP16INT8 W8A8加速比
128x conv 512ch 64x6418.6 TOPS, 14.8ms35.1 TOPS, 7.8ms1.88x
64x conv 512ch 64x6418.4 TOPS, 7.5ms34.1 TOPS, 4.0ms1.85x

INT8 激活通过 MIL 的 quantize/dequantize 操作将 L2 SRAM 带宽减半。权重使用 constexpr_affine_dequantize(存储为 int8,编译时转为 fp16)。

架构

动态流水线使用共享的 ANE kernel,权重被打包进空间维度(权重变化时无需重新编译):

MHA 模型 (Stories110M) —— 每层 6 个 kernel:

Kernel功能
sdpaFwdQKV 投影 + SDPA + 输出投影
ffnFusedSwiGLU FFN (W1, W3, SiLU, W2)
ffnBwdW2t / ffnBwdW13tFFN 反向(为节省内存拆分)
sdpaBwd1 / sdpaBwd2SDPA 反向

GQA 模型 (Qwen3-0.6B) —— 每层 10 个 kernel: 增加独立的 woFwdqBwdkvBwd 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。

工作原理

  1. MIL 生成 —— Objective-C 代码在运行时构建 MIL 程序文本,指定卷积(用于线性层)、矩阵乘(用于注意力)、softmax、逐元素操作
  2. 内存内编译 —— _ANEInMemoryModelDescriptor 将 MIL 文本 + 权重 blob 直接编译成 ANE 程序,无需磁盘 mlmodelc
  3. IOSurface I/O —— 输入/输出张量通过 IOSurface 共享内存在 [1, channels, 1, spatial] 格式中传递(fp16 或 fp32;fp16 直接 I/O 快约 37%)
  4. 动态权重 —— 激活值和权重被打包进单个空间输入维度,在 MIL kernel 内部切片出来。权重变化无需重新编译。
  5. 梯度流 —— 前向 tap 暴露反向所需中间值;反向 kernel 在 ANE 上计算 dx(输入梯度);dW(权重梯度)在 CPU 上通过 cblas 计算
  6. 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 数
Stories110M109M91 ms126 (MHA)
Qwen3-0.6B596M412 ms2810 (GQA)

ANE 峰值吞吐量 (M4, H16G):

精度峰值 TOPS配置
FP1618.6128x conv 512ch 64x64
INT8 W8A835.1128x conv 512ch 64x64

GPU↔ANE 推理流水线 (M4, seq=256):

模型GPU 预填充ANE 解码总计
Stories110M6.7ms1.9ms8.8ms
Qwen3-0.6B9.7ms2.3ms12.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 端侧推理引擎

Reddit r/LocalLLaMA

苹果在 WWDC 上发布了 CoreAI,这是一款适用于 Apple Silicon 的全新端侧推理引擎,将取代 CoreML,并通过优化推理支持多达 200 亿参数的更大模型,重点面向手机和平板设备。

Apple Core AI Framework

Hacker News Top

Apple 推出 Core AI Framework,一种用于设备端机器学习的新工具。