多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Laya-CoreML 如何把Transformer送上Neural Engine:BC1L激活、1×1投影与逐头注意力的ANE图重写

Laya-CoreML 如何把Transformer送上Neural Engine:BC1L激活、1×1投影与逐头注意力的ANE图重写 Laya-CoreML 如何把Transformer送上Neural EngineBC1L激活、1×1投影与逐头注意力的ANE图重写【免费下载链接】laya-coremlLocal Laya typed decisions on Apple Core ML and Neural Engine. Validated ports, ~5 ms short decisions on M3 Max, reproducible speed and energy benchmarks.项目地址: https://gitcode.com/gh_mirrors/la/laya-coremlLaya-CoreML是一个把开源 Laya 决策模型移植到 Apple Core ML / Neural EngineANE的项目它在 M3 Max 上用 ANE FP16 实现单条多语言短决策4.98 ms P50每条决策的整机能耗仅为编译版 MLX 的约 1/2.8且全程不生成任何 token。本文拆解它最硬核的工程部分——一次完整的ANE 图重写BC1L 通道优先激活、1×1 卷积投影与逐头注意力是如何让整张 Transformer 计算图落入 Neural Engine 的。为什么原始图“上不了”ANE直接把原版 PyTorch Transformer 导出 Core ML 并选择CPU_AND_NE结果并不理想计算计划中1,318 个被分配算子的偏好设备全部是 CPU尽管其中 988 个算子“支持” ANE24 个 SDPA缩放点积注意力算子设备归属未知大量 cast、slice、shape 查询、gather、transpose 散布其间图无法被切分到 ANE 上执行。关键教训单个算子“支持 ANE” ≠ 图会跑在 ANE 上。原始图的问题在于动态形状操作、整头批量注意力whole-head SDPA和B×L×C布局与 ANE 的执行偏好全面错位。图重写三板斧BC1L、1×1 卷积、逐头注意力重写后的导出模型独立实现在 experiments/ane_engineering/model.py遵循 Apple ANE Transformer 部署研究的布局原则但权重原封不动、不做重训练1. BC1L 通道优先激活把隐藏态从B×L×C改为B,C,1,Lbatch, channel, 1, length的 4D 张量。整个 22 层编码器 2 层决策头 打分器都保持这一布局避免在每个线性层周围反复转换布局——布局拷贝正是 ANE 调度的大敌。2. 线性投影 → 1×1 卷积ANE 对 1×1 卷积有专门优化。重写把每个稠密权重W[out,in]直接变形为卷积核K[out,in,0,0]Y[b,l,o] Σᵢ W[o,i]·X[b,l,i] bias[o] ≡ Conv2D(U, K)[b,o,0,l]函数完全等价只是算子表示不同。QKV 保留为单个D → 3D卷积再按通道切分门控 MLP 的D → 2I融合投影也原样保留value 走精确 GELU再乘 gate。3. 逐头注意力替代整头 SDPA把注意力拆成64 通道的独立头K 张量只转置一次用两个显式 einsum 完成 QK 和 AV始终保留 4D 布局Softmax 沿 key 轴维度 1进行。RoPE 则严格按“每个头内部的 32 通道对”拆分旋转——多语言 checkpoint 的 local theta 为 160000跨头错误拆分会静默改变注意力结果。配套细节同样讲究通道归一化保持原始normalized * weight bias顺序与 epsilon全注意力/滑窗掩码保留“有效 key 掩蔽 padded-query”规则最终 marker gather 用外部准备好的 one-hot 选择器 4D einsum 表达。CPU → ANE → CPU一次跨界整图执行运行时 laya_coreml/ane.py 中的ANEAgent采用CPU→ANE→CPU 单次边界设计而不是每层切换设备阶段设备工作内容前段CPU分词、只取请求的 embedding 行、构造固定形状掩码/类型向量/marker 选择器中段ANE一次 Core ML 调用完成 embedding 归一化、全部 22 层编码器、决策头与打分卷积FP16后段CPU从未校准 raw-logit softmax 提取动作特征FP32 跑小 action head 与校准结果是6,390 个非常量算子在计算计划中全部偏好 ANE剩下 3,809 个条目都是常量而原始 SDPA 导出在同一系统上没有一个 NE 偏好算子。重写后的验证与实测收益改图不等于换模型验证门禁非常严格L96 短决策子集59/59答案一致最大校准概率漂移仅0.002925独立 L1024 FP16 导出通过完整63/63金标集100 次重复调用输出完全一致。独立 CPU 回归测试见 tests/test_ane_layout.py。M3 Max 上的配对对比91 token 真实问题补齐至 9665,598 次稳定调用指标编译版 MLX FP16Core ML ANE FP16ANE W8 K-meansP50 / P956.94 / 7.39 ms4.98 / 5.31 ms4.88 / 5.23 ms整机平均功率61.39 W30.75 W27.39 W每决策整机能耗0.4288 J0.1540 J2.78×0.1344 J3.19×需要诚实说明这并非 10× 目标1024 token 长请求约 91.7 ms短输入优势不等于长上下文优势。原始证据与测量细节见 docs/ANE_BENCHMARKS.md 与 benchmarks/results/ 下的原始 JSON。如何上手体验推理端一条命令即可Apple Silicon · macOS 15 · Python 3.11–3.13pip install laya-coreml[demo]ANE 研究转换、压缩与基准脚本在 Git 检出中需要 clone 仓库运行git clone https://gitcode.com/gh_mirrors/la/laya-coreml延伸阅读ANE 工程实验全过程docs/ANE_ENGINEERING.md10× 目标的数学边界docs/ANE_MATH.md导出模型布局探针报告experiments/ane_engineering/body96/API 与离线用法docs/USAGE.md完整基准记录benchmarks/results/一句话总结ANE 红利不是改一个开关而是把整张计算图改写成 ANE 喜欢的形状——通道优先布局、1×1 卷积投影、逐头注意力再只留一次 CPU↔ANE 边界。图对了引擎才会真的干活。【免费下载链接】laya-coremlLocal Laya typed decisions on Apple Core ML and Neural Engine. Validated ports, ~5 ms short decisions on M3 Max, reproducible speed and energy benchmarks.项目地址: https://gitcode.com/gh_mirrors/la/laya-coreml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表