章节 01
导读 / 主楼:Apple Neural Engine 上的生产级 LLM 推理实战指南
一份详尽的实战手册,教你如何将大语言模型部署到 Apple Neural Engine 上,实现低功耗、高效率的本地推理
正文
一份详尽的实战手册,教你如何将大语言模型部署到 Apple Neural Engine 上,实现低功耗、高效率的本地推理
章节 01
一份详尽的实战手册,教你如何将大语言模型部署到 Apple Neural Engine 上,实现低功耗、高效率的本地推理
章节 02
章节 03
每一台 Apple Silicon Mac 和 iPhone 都内置了 Apple Neural Engine(ANE)。在 M4 Max 上,它提供 38 TOPS 的算力,功耗却只有 GPU 的几分之一。然而现实是,当 llama.cpp 在 CPU 上燃烧资源、Metal 在消耗电池时,ANE 却处于闲置状态。
问题的根源在于 Apple 并未公开 ANE 的 SDK。通往 ANE 的唯一官方路径是 CoreML,而 CoreML 的文档是为想要运行 Vision 模型的应用开发者编写的,并非为那些希望在 ANE 上运行 80 亿参数 MoE Transformer 的研究者准备的。
这份开源书籍正是为了填补这一空白——它基于 35 次以上实验,涵盖 5 个模型家族,系统性地记录了将真实 LLM 部署到 ANE 所需的全部知识。
章节 04
大语言模型并非一次性生成完整答案,而是通过反复预测下一个 token 来工作。这个过程包含以下步骤:将文本 token 化为整数 ID、查找嵌入向量、运行 transformer 层堆栈、将最终隐藏状态投影到词汇表 logits、采样一个 token、将其附加到序列,然后重复循环。
生成的文本只是可见的表面,真正的热点路径是隐藏向量通过数十层网络的反复更新。每个新 token 都需要再次遍历整个模型,因此推理效率的核心在于如何让这个投影密集型的循环在最快的硬件上运行,同时最小化数据移动。
现代推理分为两个阶段:
预填充(Prefill) 阶段处理用户输入的 prompt。如果 prompt 有 512 个 token,模型可以一次性批量处理这些 token,这更像是矩阵-矩阵运算,能够充分利用硬件。
解码(Decode) 阶段生成新 token。它是顺序的:第 37 个 token 必须等到第 36 个 token 确定后才能生成。解码通常受内存带宽限制,因为每个新 token 都需要重新加载大型权重矩阵来更新单个隐藏向量。
章节 05
注意力机制让每个 token 都能读取之前的 token。如果没有缓存,每个解码步骤都需要重新计算整个前缀的 keys 和 values,这是巨大的浪费。
KV 缓存存储过去的 key 和 value 行。在解码过程中,模型计算新 token 的 K/V 行,将其写入当前位置,注意力机制从缓存中读取已存储的前缀。在 GPU 和 CPU 运行时中,这个缓存通常是传递给内核的主机管理内存;而在 CoreML 中,公开机制是 MLState——由模型运行时拥有、在 prediction() 调用之间复用的状态张量。
章节 06
| 特性 | ANE | GPU (Metal) | CPU |
|---|---|---|---|
| 峰值算力 | 38 TOPS (M4 Max) | ~14 TFLOPS fp16 | ~1 TFLOPS |
| 负载功耗 | ~2–4W | ~10–20W | ~8–15W |
| 内存带宽 | 片上 SRAM + UMA | UMA (共享) | UMA |
| 每操作延迟 | 低 (固定功能) | 较高 (着色器启动) | 高 |
| 可编程性 | 仅 CoreML | Metal Shaders | 任意 |
| 原生 INT8 | 支持 | 支持 (通过 Metal) | 支持 |
| 状态缓存 | 支持 (MLState) | 手动管理 | 手动管理 |
ANE 在每 token 功耗上胜出。在解码速度上,限制因素是内存带宽(每个 token 加载权重),而 ANE 的固定功能卷积引擎在 y = Wx(每个 LLM 中的主导操作)上比通用着色器网格更快、更省电。
但代价是:ANE 只能运行 CoreML 允许通过的内容,而 CoreML 非常挑剔。
章节 07
CoreML 是一个编译器,接收 PyTorch 或 TorchScript 模型并输出 .mlpackage。当你调用 xcrun coremlcompiler compile 时,它会生成 .mlmodelc 目录,包含:
model.espresso.net —— 网络图的 flatbuffer 表示model.espresso.shape —— 张量形状元数据*.mlmodelc/Data/com.apple.CoreML/weights/ —— 量化权重块运行时,CoreML 框架将操作分发到三个后端之一:ANE(Apple Neural Engine,卷积/矩阵乘法最快,支持状态)、GPU(Metal Performance Shaders)、CPU(Accelerate/vDSP)。分发决策由 ANE 编译器(ANEF)在 .mlmodelc 编译期间做出,而非运行时。你可以通过 MLComputePlan 检查操作最终落在 ANE 还是 GPU/CPU 上——这是验证部署效果的权威来源。
章节 08
ANE 的主要指令是 2D 卷积。GPU 有通用矩阵乘法(GEMM)着色器,ANE 没有独立的 GEMM。
技巧在于:对 [1, C_in, T, 1] 输入使用 [C_out, C_in, 1, 1] 核的 1×1 卷积,数学上等同于 y = Wx,其中 W 是 [C_out, C_in]。
# 这就是每个 LLM 线性投影变成 ANE 原生的方式:
self.proj = nn.Conv2d(d_in, d_out, kernel_size=1, bias=False)
# 输入: [batch=1, d_in, seq_len, 1]
# 输出: [batch=1, d_out, seq_len, 1]
这是本书中最重要的事实。如果你不将所有内容重塑为 [1, channels, T, 1] 并使用 Conv2d(1×1),什么都不会落到 ANE 上。