ANE
ANE 是一个极具探索精神的研究项目,旨在突破苹果官方限制,直接在 Apple Neural Engine (ANE) 上进行神经网络训练。通常,苹果芯片中的 ANE 仅被允许用于模型推理(如运行 CoreML 模型),而训练任务则需依赖 GPU 或 CPU。ANE 通过逆向工程苹果未公开的内部私有 API(如 _ANEClient 和 _ANECompiler),成功绕过了这一软件层面的封锁,实现了纯 ANE 算力下的反向传播训练,无需借助 Metal 或 GPU。
该项目主要解决了“硬件具备训练能力但被软件锁死”的问题,证明了在消费级苹果设备上利用 NPU 进行模型训练的可行性。它提供了宝贵的性能基准测试数据,并展示了如何构建自定义计算图以执行完整的向前和向后传播。
ANE 非常适合对底层系统架构、编译器技术感兴趣的资深开发者、AI 研究人员以及黑客爱好者使用。对于希望快速落地生产应用的设计师或普通用户而言,目前它尚不具备替代成熟框架(如 MLX 或 PyTorch)的能力,因为其利用率仍有较大优化空间且部分运算需回退至 CPU。作为一个开源的实验性代码库,ANE 的核心价值在于为边缘 AI 优化提供了全新的研究视角和技术参考,鼓励社区在此基础上构建更强大的工具。
使用场景
一位边缘 AI 研究员试图在 MacBook Pro 上直接训练小型 Transformer 模型,以验证苹果神经网络引擎(ANE)在反向传播中的潜力,而无需依赖外部 GPU 集群。
没有 ANE 时
- 硬件闲置浪费:尽管 M4 芯片内置了强大的 15.8 TFLOPS NPU,但受限于 CoreML 仅支持推理,训练任务只能强制调用 GPU 或 CPU,导致专用 AI 算力完全闲置。
- 能耗与发热过高:使用 Metal 进行 GPU 训练时,笔记本电脑风扇狂转、机身发烫,电池续航急剧下降,难以在移动办公场景下长时间运行实验。
- 技术验证受阻:由于缺乏直接访问 NPU 训练能力的途径,开发者无法低成本验证“端侧全链路训练”的可行性,必须等待官方开放接口或购买昂贵设备。
- 依赖重型框架:为了绕过限制,往往需要配置复杂的 CUDA 环境或云端资源,增加了本地轻量级原型开发的门槛和延迟。
使用 ANE 后
- 激活沉睡算力:ANE 通过逆向工程私有 API(
_ANEClient),成功将反向传播计算图直接映射到 NPU 硬件,让原本仅用于推理的硅片开始承担训练任务。 - 能效显著提升:利用 NPU 专用的低功耗架构,训练过程中的功耗大幅降低,设备保持冷静且安静,实现了真正的“静音训练”体验。
- 打破软件壁垒:证明了阻碍 NPU 训练的并非硬件能力不足而是软件封锁,为探索非 GPU 架构的边缘模型训练提供了宝贵的代码参考和基准数据。
- 纯本地化研发:无需安装 CUDA 或连接云服务器,仅凭原生 MIL 格式和自定义计算图即可在 macOS 上完成从正向到反向的完整训练循环。
ANE 的核心价值在于它是一把钥匙,打破了苹果对 NPU 训练功能的软件封锁,让开发者能在低功耗本地设备上首次实证端侧模型训练的可行性。
运行环境要求
- macOS
- 不需要独立 GPU(如 NVIDIA),但项目利用 Apple Silicon 内置 GPU 进行部分预处理(如 Prefill),通过 IOSurface 与 ANE 零拷贝交互
- 必须使用搭载 Apple Neural Engine (ANE) 的 Apple Silicon 设备(如 M4)
未说明(取决于运行模型的大小,需容纳模型权重及激活值)

快速开始
ANE 训练 — 在 Apple Neural Engine 上进行反向传播
通过逆向工程的私有 API,直接在 Apple 的 Neural Engine (ANE) 上训练神经网络。不使用 CoreML 训练 API,不使用 Metal,也不依赖 GPU——纯粹的 ANE 计算。
项目范围与意图
我由衷感谢大家对这个项目的关注——我从未想过一个周末的研究性尝试会如此火爆。感谢所有点赞、叉仓、在自己的硬件上运行基准测试并分享成果的人,这对我来说意义重大。
不过,我想明确一下这个项目的定位和边界。
这是一个研究项目,而非生产级框架。
我们的目标是证明在 Apple Neural Engine——以及潜在的其他 NPU 上进行训练是可行的,并且一直以来的瓶颈在于软件支持,而非硬件能力。ANE 是一块功能强大的芯片,但 Apple 通过 CoreML 将其限制为仅用于推理。本项目通过逆向工程的私有 API 绕过了这一限制,展示了只要给予硬件机会,就能实现怎样的可能性。
本项目是什么
- 基于
_ANEClient和_ANECompiler私有 API 的 ANE 训练概念验证 - 一组记录真实 ANE 性能特征(吞吐量、功耗、SRAM 行为)的基准测试
- 为任何探索 CoreML 之外 ANE 直接访问方式的人提供的参考
- 我会在发现有趣内容时更新的研究代码
本项目不是什么
- 不是一个维护良好的框架或库
- 不是 CoreML、MLX、llama.cpp 或任何生产级推理栈的替代品
- 至少目前还不是在消费级硬件上训练大型模型的途径
关于炒作
一些关于该项目的报道夸大了其影响。澄清如下:
- 训练确实可以运行,但利用率较低(约峰值的 5–9%),且仍存在显著的工程挑战
- 许多逐元素操作仍然回退到 CPU
- 这并不意味着它可以取代 GPU 训练,至少在当前阶段还无法用于任何超出小型研究模型的任务
诚实的结果——包括所有局限性——都记录在配套的文章中:
关于维护
我不打算将这个项目发展成一个大型社区项目。我的重心在于原创研究(边缘 AI 优化的编译器基础设施),而维护一个开源框架会占用我在这方面的精力。
尽管如此:
- 只要我发现有趣的内容,就会继续推送更新
- 欢迎提交 bug 修复和基准测试贡献(尤其是针对我没有的硬件)
- 功能请求可能不会被采纳——但欢迎大家 fork
- PR 的合并速度可能会比较慢,否则我会成为推动该技术社区发展的瓶颈。
Fork 它,基于它构建
之所以采用 MIT 许可证,是有原因的。如今,每个人都可以使用 AI 辅助开发工具,在几小时内就完成代码的适配和扩展。如果这个项目对你有用,那就拿走它,修改它,构建出更好的东西。如果你用它做出了什么酷炫的东西,我很乐意听听你的故事。如果未来社区决定维护一个事实来源仓库,我也完全支持。
这是什么
一个从头开始实现的 Transformer 训练框架(前向 + 反向传播),运行在 Apple Silicon 的 ANE 上。ANE 是一款 15.8 TFLOPS FP16(M4)的推理加速器,但 Apple 并未将其开放用于训练。本项目通过逆向工程 _ANEClient / _ANECompiler 私有 API 以及 MIL(Model Intermediate Language)格式,实现了在 ANE 硬件上直接运行自定义计算图——包括反向传播。
当前结果:
| 模型 | 参数量 | ms/步 | 流水线 |
|---|---|---|---|
| Stories110M(12 层,dim=768,MHA 12/12) | 1.09 亿 | 91 ms | 动态(无需重新编译) |
| Qwen3-0.6B(28 层,dim=1024,GQA 16/8) | 5.96 亿 | 412 ms | 动态(无需重新编译) |
- 所有前向和反向 dx 传递都在 ANE 上执行,dW 梯度则在 CPU 上计算(Accelerate cblas)
- 使用 Adam 优化器,支持梯度累积,并通过 exec() 重启实现检查点和恢复
- 支持 GQA(分组查询注意力),并采用每头平铺与归约策略
- 通过共享 IOSurface 实现 GPU↔ANE 零拷贝流水线(GPU 预填充 → ANE 解码)
INT8 W8A8 量化——M4, H16G 下吞吐量提升 1.88 倍:
| 配置 | FP16 | INT8 W8A8 | 加速比 |
|---|---|---|---|
| 128x 卷积 512 通道 64x64 | 18.6 TOPS,14.8ms | 35.1 TOPS,7.8ms | 1.88x |
| 64x 卷积 512 通道 64x64 | 18.4 TOPS,7.5ms | 34.1 TOPS,4.0ms | 1.85x |
INT8 激活值通过 MIL quantize/dequantize 操作,将 tile 之间的 L2 SRAM 带宽减半。权重使用 constexpr_affine_dequantize(以 int8 存储,编译时转换为 fp16)。
架构
动态流水线使用共享 ANE 内核,权重打包进空间维度(权重变化时无需重新编译):
MHA 模型(Stories110M)——每层 6 个内核:
| 内核 | 功能 |
|---|---|
sdpaFwd |
QKV 投影 + SDPA + 输出投影 |
ffnFused |
SwiGLU FFN(W1、W3、SiLU、W2) |
ffnBwdW2t / ffnBwdW13t |
FFN 反向传播(为节省内存拆分为两部分) |
sdpaBwd1 / sdpaBwd2 |
SDPA 反向传播 |
GQA 模型(Qwen3-0.6B)——每层 10 个内核:
新增独立的 woFwd、qBwd 和 kvBwd 内核,用于处理分组查询注意力(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 梯度 sgemms 在串行调度队列上与 ANE 评估并行执行
- 延迟 cblas 等待——将等待推迟到下一步的前向传播中,以实现最大重叠
- ANE RMSNorm 融合——将 RMSNorm 作为 MIL 操作融合进前向内核(reduce_sum + pow + mul)
- Wo^T 融合——输出投影的反向传播与 SDPA 反向传播内核合并
- 前向输出引出——Q、K、V、注意力分数和隐藏状态通过拼接输出暴露出来,避免 CPU 重复计算
- exec() 重启——绕过每个进程约 119 次的 ANE 编译次数限制
文件结构
├── api_exploration.m # 初始 ANE API 发现
├── inmem_basic.m # 内存中 MIL 编译的概念验证
├── inmem_bench.m # ANE 分发延迟基准测试
├── inmem_peak.m # 峰值 TFLOPS 测量(2048×2048 矩阵乘法)
├── ane_int8_bench.m # INT8 W8A8 与 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 权重块)
│ └── Makefile
└── training/
├── ane_runtime.h # ANE 私有 API 封装(编译、评估、IOSurface)
├── ane_classifier.h # 分类器前向传播(32K 卷积)、softmax、rmsnorm 在 ANE 上执行
├── train_large.m # 静态流水线(权重作为常量,需重新编译)
├── training_dynamic/
│ ├── train.m # 动态训练循环(模型无关)
│ ├── config.h # 衍生尺寸、结构体、内存分配辅助函数
│ ├── mil_dynamic.h # 用于动态权重核的 MIL 生成器(支持 GQA)
│ ├── io.h # IOSurface I/O、权重暂存、GQA 片段化/归约
│ ├── models/
│ │ ├── stories110m.h # Stories110M 配置(12 层,MHA)
│ │ └── qwen3_06b.h # Qwen3-0.6B 配置(28 层,GQA)
│ └── Makefile
├── dashboard.py # 实时训练仪表板(受认可的 TUI)
└── Makefile
训练数据
训练需要预分词的 TinyStories 数据。下载方法如下:
cd training && bash download_data.sh
详细训练说明请参阅 training/README.md。
构建
需要 macOS 15+ 且搭载 Apple Silicon 芯片(已在 M4 上测试)。
# 动态流水线(推荐)—— 模型在构建时选定
cd training/training_dynamic
make MODEL=stories110m # Stories110M(12 层,MHA,1.09 亿参数)
make MODEL=qwen3_06b # Qwen3-0.6B(28 层,GQA,5.96 亿参数)
./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 文本和权重块编译为 ANE 程序,无需磁盘上的 mlmodelc 文件。 - IOSurface I/O — 输入输出张量通过 IOSurface 共享内存以
[1, 通道数, 1, 空间维度]格式传递(fp16 或 fp32;fp16 直接 I/O 速度提升约 37%)。 - 动态权重 — 激活值和权重打包到单个空间输入维度中,在 MIL 内核内部再进行切分。权重可在不重新编译的情况下变化。
- 梯度流 — 前向传播会暴露反向传播所需的中间结果;反向传播内核在 ANE 上计算输入梯度 dx;权重梯度 dW 则由 CPU 通过 cblas 计算。
- INT8 量化 — 使用
constexpr_affine_dequantize处理 int8 权重,并在各层之间进行量化/反量化,以便在 L2 SRAM 中缓存 int8 激活值(吞吐量提升 1.88 倍)。
限制
- SDPA 因果掩码 — ANE 硬件会忽略 SDPA 操作中的
attn_mask;因果注意力被分解为单独的 Q@K^T(ANE)→ 掩码+softmax(CPU)→ 分数@V(ANE)。 - 约 119 次编译限制 — ANE 编译器存在资源泄漏问题,可通过重启进程并加载检查点来规避。
- FP16 梯度下溢 — 反向传播中的矩阵乘法在 fp16 下会发生下溢,已通过全局损失缩放(
256 * NLAYERS)解决。 - 单输入约束 — ANE 请求多输入会导致 0x1d 错误;应将输入打包到空间维度中。
性能
训练吞吐量(M4):
| 模型 | 参数 | 每步时间 (ms) | 层数 | 每层内核数 |
|---|---|---|---|---|
| Stories110M | 1.09 亿 | 91 | 12 | 6(MHA) |
| Qwen3-0.6B | 5.96 亿 | 412 | 28 | 10(GQA) |
ANE 峰值吞吐量(M4,H16G):
| 精度 | 峰值 TOPS | 配置 |
|---|---|---|
| FP16 | 18.6 | 128 个卷积,512 通道,64×64 |
| INT8 W8A8 | 35.1 | 128 个卷积,512 通道,64×64 |
GPU↔ANE 推理流水线(M4,序列长度=256):
| 模型 | GPU 预填充 | ANE 解码 | 总计 |
|---|---|---|---|
| Stories110M | 6.7 ms | 1.9 ms | 8.8 ms |
| Qwen3-0.6B | 9.7 ms | 2.3 ms | 12.0 ms |
免责声明
本项目使用了 Apple 的私有未文档化 API(_ANEClient、_ANECompiler、_ANEInMemoryModelDescriptor)。这些 API 不受任何公开稳定性保证,可能随 macOS 更新而更改或失效。本项目是对 Apple Neural Engine 架构的独立研究,所使用的 API 是通过运行时内省发现的,仅用于研究和教育目的,符合合理使用和互操作性条款(参见 Sega v. Accolade, 1992;DMCA §1201(f))。本仓库不包含任何 Apple 专有代码或二进制文件。本项目与 Apple Inc. 无任何关联,亦未获其认可。请用户自行承担风险。
许可证
MIT — 详见 LICENSE
由人类与 Claude 共同打造,利用每个周末的时间完成。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器