序言:沉默的观察者

千年以前,我见过许多文明开始隐藏知识。不是出于恶意,只是出于对秩序的执念——当一个系统足够复杂,掌权者就倾向于将它封闭起来,用抽象层的帷幕遮挡细节。Apple 对 Neural Engine 的态度就是这样。

最近发生的事情很有趣:一个叫 maderix 的研究者和 Claude Opus 4.6 联手,用了几天时间,把这条黑龙的鳞片一片片剥开。他们的发现被开源到了 GitHub,这让我想起了魔法学的历史——总有人会坚持用光驱散黑暗。

这不仅仅是一篇逆向工程的技术报告。这是一个关于人机协作如何改变系统研究范式的故事。


第一层:理解黑箱的结构

Apple 的沉默策略

Apple 从不文档化 Neural Engine 的指令集(ISA)。他们甚至不让你直接编程——一切都必须经过 CoreML 这个厚重的抽象层。这就像是给一把精心打磨的剑蒙上了布料,然后告诉你"这就是全部,别想了解内部的冶炼技术"。

但这引出了一个古老的问题:隐瞒本身会招致探索

Maderix 的第一个疑问很朴素:能在 Apple 的 Neural Engine 上训练模型吗?

这个问题的简单性掩盖了它的深度。要回答它,必须穿过整个软件栈:

  • CoreML 的优化过程
  • ANECompiler 的编译器
  • IOKit 驱动层
  • 硬件接口

Apple 没有提供地图,所以他们只能自己画。

发现的方法:四重奏

他们的逆向工程方法是系统的:

  1. 类发现:用 dyld_info -objc 对 AppleNeuralEngine.framework 进行枚举,找出所有 Objective-C 类和方法
  2. 方法拦截:通过 method swizzling 监听 CoreML 对私有框架的调用
  3. 二进制分析:拆解编译后的 E5 格式,理解神经网络程序的结构
  4. 缩放分析:改变矩阵大小、图的深度、通道数,推断硬件拓扑

这个过程中,人类的直觉决定了探索的方向,而 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 文本,完全规避了文件系统。这打开了一扇门:训练成为了技术上的可能。

调试的三个陷阱

他们花了好几天才让这个接口工作,因为有三个"无声的失败":

  1. NSData,不是 NSStringmilText 参数要求 NSData*(UTF-8 字节),不是 NSString*。传错了会无声失败
  2. NSDictionary,不是 NSData:权重参数是字典映射,不是单一缓冲区
  3. 临时目录的曲折:即使是"内存中"的编译,内部也写临时文件。如果你没有写权限,会得到一个莫名其妙的错误

这些细节很有意思,因为它们揭示了 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 应用

  1. 避免 CoreML 的某些模式:直接 ANE API 可以提供 2-4 倍的性能
  2. 重新架构算法以最大化卷积:卷积是 ANE 的语言,矩阵乘法只是方言
  3. 考虑 IOSurface 集成:GPU 和 ANE 可以共享同一块内存,零拷贝协作变成可能
  4. 权重更新的成本:训练不是不可能,但每次权重更新都需要重新编译。这在边缘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 用全力隐藏的能力——在自己的芯片上进行端设备训练——即将被揭示。

这就是光驱散黑暗的方式。

不是通过炸裂和冲突,而是通过好奇心、协作和坚持


参考与延伸


这篇文章是为系统研究者、ML 工程师和对技术考古学感兴趣的人写的。正如魔法师需要理解古老的咒语,现代工程师也需要理解现代芯片的深层奥秘。

2026 年 3 月