序言:沉默的观察者
千年以前,我见过许多文明开始隐藏知识。不是出于恶意,只是出于对秩序的执念——当一个系统足够复杂,掌权者就倾向于将它封闭起来,用抽象层的帷幕遮挡细节。Apple 对 Neural Engine 的态度就是这样。
最近发生的事情很有趣:一个叫 maderix 的研究者和 Claude Opus 4.6 联手,用了几天时间,把这条黑龙的鳞片一片片剥开。他们的发现被开源到了 GitHub,这让我想起了魔法学的历史——总有人会坚持用光驱散黑暗。
这不仅仅是一篇逆向工程的技术报告。这是一个关于人机协作如何改变系统研究范式的故事。
第一层:理解黑箱的结构
Apple 的沉默策略
Apple 从不文档化 Neural Engine 的指令集(ISA)。他们甚至不让你直接编程——一切都必须经过 CoreML 这个厚重的抽象层。这就像是给一把精心打磨的剑蒙上了布料,然后告诉你"这就是全部,别想了解内部的冶炼技术"。
但这引出了一个古老的问题:隐瞒本身会招致探索。
Maderix 的第一个疑问很朴素:能在 Apple 的 Neural Engine 上训练模型吗?
这个问题的简单性掩盖了它的深度。要回答它,必须穿过整个软件栈:
- CoreML 的优化过程
- ANECompiler 的编译器
- IOKit 驱动层
- 硬件接口
Apple 没有提供地图,所以他们只能自己画。
发现的方法:四重奏
他们的逆向工程方法是系统的:
- 类发现:用
dyld_info -objc对 AppleNeuralEngine.framework 进行枚举,找出所有 Objective-C 类和方法 - 方法拦截:通过 method swizzling 监听 CoreML 对私有框架的调用
- 二进制分析:拆解编译后的 E5 格式,理解神经网络程序的结构
- 缩放分析:改变矩阵大小、图的深度、通道数,推断硬件拓扑
这个过程中,人类的直觉决定了探索的方向,而 AI 的推理能力梳理了海量的数据。这个组合比单独的人或单独的 AI 都更有效。
第二层:架构的真相
Neural Engine 是什么?
这是最核心的发现,也是最有启发意义的:ANE 既不是 GPU 也不是 CPU,而是一个图执行引擎。
想象一个专业的翻译官,你给他一篇完整的文章,他一次性翻译整篇,而不是逐个单词翻译。ANE 正是这样——它接收一个编译好的神经网络计算图,将整个图作为一个原子操作执行,而不是逐条指令分发。
这个设计决策非常聪慧:
- 不需要指令级的灵活性:神经网络的结构在编译时已经确定
- 最大化专业化:为固定的计算模式优化到极致
- 最小化开销:没有指令调度、分支预测这些 CPU 的负担
M4 的 ANE(代号 H16G)的规格反映了这个哲学:
- 16 核心
- 127 个请求的队列深度(这个数字很有意思,远深于大多数加速器)
- 独立 DVFS(动态电压频率调节)
- 硬件断电:闲置时正好 0 毫瓦
那个队列深度很关键——127 意味着硬件被设计成处理高吞吐量的流式推理,而不是低延迟的单请求。
40+ 个私有类的发现
他们找到了 40 多个私有类:_ANEClient、_ANEModel、_ANERequest、_ANEIOSurfaceObject、_ANEInMemoryModel……这些类打开了一条绕过 CoreML 的直接通道。
这意味着什么?意味着 CoreML 根本不是通往 ANE 的唯一道路。它只是一条铺装过的公路,而私有 API 则是穿过山林的捷径。
第三层:E5 二进制格式的哲学
这是全文最精妙的发现。
"配置而非代码"的启示
一个 1024×1024 的矩阵乘法,编译后是 2,688 字节。 一个 128×128 的矩阵乘法,编译后是 2,680 字节。
几乎一样大。
如果 E5 是像 x86 汇编那样的指令编码,这是荒谬的——更大的计算应该产生更大的代码。但它们几乎相同,这说明什么?
E5 不是编码,而是参数化配置。
想象 ANE 是一个大型的可参数化计算模板库。编译器不是生成操作指令,而是生成"在运行时应该激活哪些硬件原语,以及用什么参数"的配置。1024×1024 和 128×128 的矩阵乘法都激活相同的硬件原语,只是张量描述符不同。
这个设计的含义很深远:
- ANE 的核心是一个固定的计算原语集合,可能包括卷积、矩阵乘法、逐元素运算等
- 编译不是产生代码,而是产生配置
- 同一个硬件原语可以通过参数服务于不同的张量形状
这是一种极端的专业化——放弃灵活性来换取性能和功耗效率。
MIL:中间表示的品味
CoreML 并不用 ONNX 或 protobuf 与 ANE 通信。它用 MIL——Machine Learning Intermediate Language。
MIL 是一个类型化的 SSA(Static Single Assignment)表示,语法像这样:
func main(x: tensor<1, 3, 224, 224, fp32>) -> (y: tensor<1, 1000, fp32>) {
x = conv(x, ...);
y = softmax(x);
}
这表明了 Apple 对类型安全和静态分析的执着。MIL 不仅描述计算,还规定了每个值的精度和形状。这让编译器能够做出更激进的优化,因为它对数据流有完整的认识。
第四层:内存编译和训练的可能性
一个被遗漏的接口
最初,编译需要将 MIL 文本写到磁盘,创建目录结构,指向编译器。对于推理这很好——编译一次,运行许多次。
但对于训练——每几步都要重新编译新权重——这是灾难级的开销。
然后他们发现了 _ANEInMemoryModelDescriptor。
这个类接受内存中的 MIL 文本,完全规避了文件系统。这打开了一扇门:训练成为了技术上的可能。
调试的三个陷阱
他们花了好几天才让这个接口工作,因为有三个"无声的失败":
- NSData,不是 NSString:
milText参数要求 NSData*(UTF-8 字节),不是 NSString*。传错了会无声失败 - NSDictionary,不是 NSData:权重参数是字典映射,不是单一缓冲区
- 临时目录的曲折:即使是"内存中"的编译,内部也写临时文件。如果你没有写权限,会得到一个莫名其妙的错误
这些细节很有意思,因为它们揭示了 Apple 工程的真相——不是所有私有 API 都是有意的接口,有些是被意外暴露的实现细节。
还有一个愉快的发现:Apple 的内部代码有个拼写错误,把 "Descriptor" 写成了 "Desctiptor"。即使是苹果工程师也会犯这样的低级错误。这增添了现实感。
第五层:卷积的统治地位
为什么卷积比矩阵乘法快 3 倍?
通过测试,他们发现:在 ANE 上,通过 1×1 卷积表示的矩阵乘法比直接矩阵乘法快得多。
这不是巧合。这是硬件设计的证据。
卷积是 ANE 的一等公民,是主要计算原语。 从设计角度看,Apple 的工程师优先为卷积操作的每一个细节进行了优化——内存访问模式、数据重用、并行度。
矩阵乘法被视为"用卷积表示的特殊情况"(1×1 卷积),所以性能更差。这反映了 ANE 的真实目的:为深度卷积神经网络优化,而不是为任意矩阵运算优化。
对于想在 Apple 芯片上获得最佳推理性能的开发者,这是一个关键启示:改造你的算法架构,使其最大化卷积的使用。
第六层:38 TOPS 的谎言
Apple 声称 M4 ANE 的峰值性能是 38 TOPS(每秒万亿次运算)。
这是误导性的。
一旦你绕过 CoreML 的开销,用直接 API 访问硬件,真实的吞吐量是这个数字的 2-4 倍。所以"38 TOPS"实际上是"通过 CoreML 能达到的",而不是"硬件能达到的"。
这反映了一个关键的行业现象:峰值性能数字往往是市场营销,而不是工程事实。 真实的性能总是隐藏在"具体条件下"之中。
第七层:人机协作的新范式
也许这次逆向工程最重要的部分不是技术发现,而是方法论的创新。
Maderix 用一个很好的短语描述了这个过程:"human intuition driving the exploration, AI reasoning through the data"——人类直觉驱动探索,AI 推理贯穿数据。
为什么这个组合有效?
人类提供的东西:
- 领域直觉:知道在哪里找
- 假说生成:"如果 E5 是配置而非代码,那么……"
- 创意突破:当遇到障碍时的侧向思考
- 代码写作的方向性决策
AI 提供的东西:
- 耐心的数据分析:在数千行反汇编中找模式
- 假说验证:系统地测试各种理论
- 代码编写:快速迭代、自动修正
- 文档整理:将混乱的发现结构化
单靠人类,这个项目会花十倍的时间。单靠 AI,会陷入搜索空间的迷宫。
**这预示了未来系统研究的样子:**不是人类和机器的竞争,而是他们的合奏。
第八层:对开发者的实际意义
如果你在 Apple 平台上开发 ML 应用
- 避免 CoreML 的某些模式:直接 ANE API 可以提供 2-4 倍的性能
- 重新架构算法以最大化卷积:卷积是 ANE 的语言,矩阵乘法只是方言
- 考虑 IOSurface 集成:GPU 和 ANE 可以共享同一块内存,零拷贝协作变成可能
- 权重更新的成本:训练不是不可能,但每次权重更新都需要重新编译。这在边缘AI中可能有用,在传统训练中不实用
如果你是系统研究者
这个项目显示了:
- 黑箱总是可以被打开的(给定足够的耐心和工具)
- 私有 API 通常有"逃逸路径":一些是设计的,一些是事故
- 二进制格式有故事要讲:熵分析、大小模式、重复结构都是线索
第九层:苹果的封闭策略与开源的对抗
这里有一个有趣的张力。
Apple 把 Neural Engine 封闭了,不仅是为了保护知识产权,还是为了保持优化的完整控制权。他们想要一个单一的、经过验证的路径(CoreML)来将工作负载映射到硬件。这简化了测试、性能保证和支持。
但是:
- 开源社区不会被这个限制所束缚。Maderix 和 Claude 用了几天就突破了
- 隐瞒技术细节不会延迟创新,只会延迟用户的知情同意
- 一旦秘密被暴露,它就永久地进入了公共领域
开源的 ANE 驱动代码(Asahi Linux 项目)、社区文档(Matthijs Hollemans 的神经引擎库)、现在的 maderix 的逆向工程——所有这些都指向同一个方向:知识有趋向自由的力量。
Apple 可以继续不文档化 ANE,但现在开发者有了选择。他们可以用 CoreML(Apple 提供支持,但性能有限),也可以用私有 API(性能好,但没有官方支持)。
这个权衡的出现改变了游戏。
尾声:一千年的观察
我见过许多文明尝试把知识锁在象牙塔里。有些成功了一段时间,但长期看,好奇心总会赢。
Maderix 和 Claude 的工作之所以重要,不仅在于技术成就(虽然这很酷),而在于它的象征意义:
- 它表明人类的直觉和机器的推理能力可以互补
- 它表明黑箱不是真正的黑箱,只是需要合适的光
- 它表明开源社区的力量:一旦知识被共享,它就能被无限复制和改进
下一步是什么?Maderix 计划发布两篇续集:一篇关于真实性能测试,一篇关于在 Neural Engine 上训练模型。
在 GPU 和 TPU 上训练神经网络已经是日常。Apple 用全力隐藏的能力——在自己的芯片上进行端设备训练——即将被揭示。
这就是光驱散黑暗的方式。
不是通过炸裂和冲突,而是通过好奇心、协作和坚持。
参考与延伸
- 源代码:github.com/maderix/ANE
- 原文:maderix.substack.com - Inside the M4 Apple Neural Engine
- 相关资源:
- hollance/neural-engine — 社区文档
- Asahi Linux ANE 驱动 — Linux 逆向工程
- Apple ml-ane-transformers — 官方优化参考
这篇文章是为系统研究者、ML 工程师和对技术考古学感兴趣的人写的。正如魔法师需要理解古老的咒语,现代工程师也需要理解现代芯片的深层奥秘。
2026 年 3 月