三年前,Eileen Yoon开始逆向工程苹果神经网络引擎(ANE)——苹果M系列芯片中专用的机器学习加速器——并发布了一个Linux驱动程序。她暂停了,确信该模块过于专而无法具有普遍用途。现在她回来了,不是为了让ANE执行新工作负载,而是为了精确映射其内部架构如何揭示苹果在2017年A11 Bionic中首次将神经加速投入硅片时所押注的内容。

核心发现是,ANE是为卷积神经网络(CNN)设计的——这是2018年之前主导机器学习的图像处理架构——而不是为驱动当今大语言模型的Transformer模型设计的。CNN的密集、可预测的数据复用与ANE的数据流完美映射;而Transformer的自回归解码则不是。Yoon认为,苹果自己的回应是在M5(2025年)中将ANE核心折叠到GPU集群内——实际上是在退役独立NPU,而不是对其进行适配。

M1 ANE的每个计算核心包含128个并行乘加(MAC)通道——全芯片共2048个——执行递推式 s ← s + a × b。MAC是一个标量缩减单元:它对正在缩减的张量的哪个维度一无所知;该含义来自操作数如何被调度到核心上。累加器是一个Q16.16格式的32位定点寄存器,在2¹⁵处饱和,乘积以FP16读出。这一选择——16位乘法、32位累加、16位读出——是苹果所瞄准的CNN工作负载的直接结果:有界激活、可预测的范围、定点友好。

对于非线性函数,ANE不在硬件中计算tanh。它使用一个33条目的分段线性查找表,配合线性插值,结点间距为1/8。ReLU是模式1(恒等),tanh是模式2(LUT)。Core ML的编译器在编译时将偏置和激活折叠到同一个后MAC路径中——偏置寄存器和非线性模式按层设置,MAC输出直接馈入查找表,无需中间内存往返。

图表显示Core ML在ReLU激活之前将常量尺度和偏移折叠到卷积权重和偏置中
Core ML编译器在编译时将偏置和激活折叠到后MAC路径中,避免了中间内存往返eiln.github.io

文章解释Core ML的编译器在编译时将偏置和激活折叠到同一个后MAC路径中,偏置寄存器和非线性模式按层设置,MAC输出直接馈入查找表,无需中间内存往返

一个非零查找表条目在ANE的分段线性tanh近似中产生两条直线段
单个非零LUT条目生成两条直线段,说明了ANE的分段线性插值方案eiln.github.io

文章描述了ANE的非线性方法:一个33条目的分段线性查找表,配合线性插值,结点间距为1/8,其中tanh是模式2,ReLU是模式1

Core ML tanh与双精度tanh叠加,其后为带符号误差图
Core ML tanh输出与双精度tanh叠加,带符号误差在下方eiln.github.io

文章讨论了ANE的tanh实现作为分段线性查找表中的模式2;该图验证了近似精度相对于双精度参考

据Yoon描述,调度器令人失望地简单。驱动程序从不发送CONV或MATMUL操作码。所有神经操作都被预编译为固定大小任务描述符的命令流;驱动程序将流加载到内存中,将TM_ADDR/TM_SIZE指向它,并触发TM_PUSH。然后硬件拥有该提交直到完成,完成后向ARM64核心发出中断。八个任务队列(qid 0–7)提供乒乓式暂存——一个描述符槽执行时软件填充另一个——每个队列带有一个32条目的基地址寄存器表,用于映射分块级工作。

Yoon的GitHub仓库(eiln/ane)包含内核模块、用户态库和Python绑定——193次提交,537个星标。这项工作明确不是为了让ANE今天变得有用;而是为了读取苹果在2017年蚀刻到硅片中的架构假设,并追踪当这些假设遇上Transformer时代时发生了什么。

仍不确定的是:M4及之后的ANE模块是否暴露了超出Yoon所记录的M1设计的能力(一个讨论提示指出苹果显然为M6/A20加倍了ANE块,且M5中GPU核心内的"Neural Accelerators"是不同的子系统)。Yoon的源码仅涵盖M1 ANE,文章并未独立验证M4/M5的说法。同样地,独立开发者是否能够访问ANE——与苹果将其限制在计算摄影流水线中——也无法由所提供的材料解决;一位评论者断言了这种限制,但所提供的驱动程序本身就是Linux访问存在的证据,即使只是通过逆向工程。