新闻详情

新闻详情

首页 / 资讯中心 / 详情

ANE 训练实战:在 Apple Neural Engine 上通过逆向私有 API 实现 Transformer 前向与反向传播

发布时间:2026/10/2 1:59:49来源:尧图网络
ANE 训练实战:在 Apple Neural Engine 上通过逆向私有 API 实现 Transformer 前向与反向传播
【免费下载链接】ANETraining neural networks on Apple Neural Engine via reverse-engineered private APIs项目地址https://gitcode.com/GitHub_Trending/ane2/ANE点击查看免费下载本篇技术指南以开源研究项目 ANETraining neural networks on Apple Neural Engine via reverse-engineered private APIs的根文档为核心系统讲解如何绕过 CoreML 的推理-only 限制直接调用 Apple 私有框架AppleNeuralEngine中的_ANEClient/_ANECompiler与 MILModel Intermediate Language格式在 Apple Silicon 的 ANE 硬件上运行包含反向传播的 Transformer 训练计算图。读完本文你将掌握该项目的架构设计、动态权重流水线原理、构建与训练命令、已知硬件限制及其工程规避手段并能在源码层面定位每一步对应的实现文件。项目定位研究验证型代码库而非生产框架README 开篇即明确了项目边界这是一个研究项目research project不是生产框架其目标是证明在 Apple Neural Engine以及潜在的其它 NPU上进行训练是可能的并指出真正的障碍一直在于软件支持而非硬件能力——ANE 是能力相当出色的硅片但 Apple 通过 CoreML 将其限制为仅推理使用本项目通过逆向私有 API 绕过这一限制。作者在 README 中对社区热度做了冷静的澄清这些数据对理解项目真实能力至关重要训练确实能跑通但利用率偏低约为峰值的 5%~9%仍有大量工程难题待解许多逐元素运算仍回退到 CPU执行就目前而言除小型研究模型外它无法替代 GPU 训练。同时维护策略也很明确作者不打算将其发展成大型社区项目但会持续推送有价值的更新欢迎 bug 修复与基准测试贡献尤其是作者未拥有的硬件平台MIT 许可证见 LICENSE意味着任何人都可以 fork 并在此基础上构建更好的东西。核心原理私有 API 与 MIL 格式项目的技术底座是一套从零实现的 Transformer 训练前向 反向运行在 Apple Silicon 的 ANE 上ANE 是 Apple 未对外开放训练能力的15.8 TFLOPS FP16M4推理加速器项目逆向工程了_ANEClient/_ANECompiler私有 API 以及MILModel Intermediate Language格式用于直接在 ANE 硬件上运行自定义计算图——包括反向传播全程无 CoreML 训练 API、无 Metal、无 GPU纯 ANE 计算。私有 API 的接入方式在源码中有明确体现。training/ane_runtime.h 中的ane_init()通过dlopen加载私有框架并用NSClassFromString按名称获取四个关键类类名用途_ANEInMemoryModelDescriptor承载 MIL 文本 权重 blob 的模型描述符_ANEInMemoryModel内存内编译/加载/评估的模型对象_ANERequest描述输入/输出 IOSurface 与权重缓冲区的请求_ANEIOSurfaceObject将 IOSurface 包装为 ANE 输入/输出对象而 training/training_dynamic/config.h 中的ane_init()采用了完全相同的加载模式dlopenNSClassFromString并通过objc_msgSend在运行时动态派发所有方法调用——这正是无外部依赖仅使用系统框架 运行时解析的私有 ANE API这一描述在代码层面的印证。当前成果概览训练吞吐与 INT8 量化README 给出了两条动态流水线的实测结果M4 平台动态管线即无需重编译模型参数量ms/step管线Stories110M12 层dim768MHA 12/12109M91 ms动态无需重编译Qwen3-0.6B28 层dim1024GQA 16/8596M412 ms动态无需重编译关键能力清单所有前向与反向 dx输入梯度在 ANE 上执行dW权重梯度在 CPU 上通过 Accelerate 的cblas计算支持 Adam 优化器、梯度累积、通过exec()重启实现的 checkpoint/resume支持GQAGrouped-Query Attention含按头 tiling/reduction通过共享 IOSurface 实现 GPU↔ANE 零拷贝管线GPU prefill → ANE decode。INT8 W8A8 量化带来 1.88 倍吞吐提升M4, H16G配置FP16INT8 W8A8加速比128x conv 512ch 64x6418.6 TOPS, 14.8ms35.1 TOPS, 7.8ms1.88x64x conv 512ch 64x6418.4 TOPS, 7.5ms34.1 TOPS, 4.0ms1.85xINT8 激活通过 MIL 的quantize/dequantize算子将 tile 之间的 L2 SRAM 带宽需求减半权重则使用constexpr_affine_dequantize以 int8 存储、编译期转为 fp16。对应基准程序为 ane_int8_bench.m。架构解析动态权重流水线动态管线的核心思想是使用共享 ANE kernel将权重打包进空间spatial维度从而在权重变化时无需重新编译。MHA 模型Stories110M——每层 6 个 kernelKernel功能sdpaFwdQKV 投影 SDPA 输出投影ffnFusedSwiGLU FFNW1、W3、SiLU、W2ffnBwdW2t/ffnBwdW13tFFN 反向为节省内存而拆分sdpaBwd1/sdpaBwd2SDPA 反向GQA 模型Qwen3-0.6B——每层 10 个 kernel因 Q_DIM ≠ DIM额外拆分出woFwd、qBwd、kvBwd三个 kernel用于分组查询注意力。CPU 侧负责RMSNorm 前向/反向、残差连接DeepNet α 缩放、损失计算、dW 梯度累积cblas_sgemm、Adam 优化器更新。README 总结的关键优化手段包括Channel-first CPU 布局——与 ANE IOSurface 的[1,C,1,S]格式对齐消除全部转置开销vDSP 向量化 RMSNorm——比朴素实现快 10 倍6.7ms → 0.7msGCD 异步 cblas 重叠——dW 梯度 sgemm 在串行派发队列上与 ANE 评估并行执行延迟 cblas 等待——把等待推迟到下一步前向最大化重叠ANE RMSNorm 融合——以 MIL 算子reduce_sumpowmul折叠进前向 kernelWo^T 融合——输出投影反向并入 SDPA 反向 kernel前向 taps——通过 concat 输出暴露 Q、K、V、注意力分数、隐藏状态避免 CPU 重算exec() 重启——绕过每个进程约 119 次的 ANE 编译上限。GQA 的 tiling/reduce 在 training/training_dynamic/io.h 中有直接实现gqa_tile_kv()将 K/V 从 KV_HEADS 按GQA_RATIO复制到 HEADS 维度每个 KV head 被复制 GQA_RATIO 次gqa_reduce_kv()在反向时把共享同一 KV head 的多个 Q head 的梯度贡献求和归约回 KV_HEADS。文件结构与模块职责├── api_exploration.m # 初始 ANE API 探索 ├── inmem_basic.m # 内存内 MIL 编译的概念验证 ├── inmem_bench.m # ANE 派发延迟基准 ├── inmem_peak.m # 峰值 TFLOPS 测量2048x2048 matmul ├── ane_int8_bench.m # INT8 W8A8 与 FP16 吞吐对比基准 ├── sram_bench.m # ANE SRAM 带宽探测 ├── sram_probe.m # SRAM 大小/布局探索 ├── gpu_ane_share.m # GPU↔ANE 零拷贝 IOSurface 演示 ├── gpu_prefill_ane_decode.m # GPU prefill → ANE decode 管线 ├── bridge/ │ ├── ane_bridge.h # C 可调用的 ANE APIcompile、eval、I/O │ ├── ane_bridge.m # Bridge 实现int8 fp16 权重 blob │ └── Makefile └── training/ ├── ane_runtime.h # ANE 私有 API 封装compile、eval、IOSurface ├── ane_classifier.h # Classifier 前向32K conv、softmax、rmsnormANE ├── train_large.m # 静态管线权重作为常量需重编译 ├── training_dynamic/ │ ├── train.m # 动态训练循环模型无关 │ ├── config.h # 派生尺寸、结构体、分配辅助模型无关 │ ├── mil_dynamic.h # 动态权重 kernel 的 MIL 生成器GQA 感知 │ ├── io.h # IOSurface I/O、权重 staging、GQA tile/reduce │ ├── models/ │ │ ├── stories110m.h # Stories110M 配置12L, MHA │ │ └── qwen3_06b.h # Qwen3-0.6B 配置28L, GQA │ └── Makefile ├── dashboard.py # 实时训练仪表盘blessed TUI └── Makefile更多基准细节可查阅 benchmarks/ANE_BENCHMARK_REPORT.md 与 benchmarks/community_results.json。环境要求与构建运行环境要求macOS 15Apple Silicon已在 M4 上验证。动态管线推荐——模型在构建时选定cd training/training_dynamic make MODELstories110m # Stories110M12L, MHA, 109M 参数 make MODELqwen3_06b # Qwen3-0.6B28L, GQA, 596M 参数 ./train --scratch # 从随机初始化开始训练 ./train --resume # 从 checkpoint 恢复动态管线的构建机制在 training/training_dynamic/Makefile 中MODEL ? qwen3_06b默认选 Qwen3-0.6B通过-include $(MODEL_HDR)将对应模型头文件注入编译train.m因此做到模型无关。静态管线旧版——每步重编译权重cd training make train_large ./train_large ane_stories110M_ckpt.bin 256 100 1e-4INT8 基准xcrun clang -O2 -fobjc-arc -framework Foundation -framework IOSurface -ldl \ -o ane_int8_bench ane_int8_bench.m ./ane_int8_benchBridge 库C 可调用的 ANE APIcd bridge make无外部依赖仅使用系统框架 运行时通过objc_msgSend解析的私有 ANE API。训练数据准备训练需要预分词pretokenized的 TinyStories 数据cd training bash download_data.sh详细训练说明见 training/README.md。该脚本下载 HuggingFace 上预分词的 TinyStoriesLlama 2 BPE32K 词表产出tinystories_data00.bin约 41 MB约 2000 万 token。工作原理六步拆解README 将整个系统的工作原理归纳为六个环节结合源码可逐一对应MIL 生成——Objective-C 代码在运行时构造 MIL 程序文本指定卷积用于线性层、matmul用于注意力、softmax 以及逐元素算子。training/training_dynamic/mil_dynamic.h 中的gen_sdpa_fwd_dynamic()完整展示了如何用slice_by_sizereshapetransposematmulsoftmaxconcat拼出含 RoPE、因果掩码、GQA tiling 的 SDPA 前向 kernel。内存内编译——_ANEInMemoryModelDescriptor将 MIL 文本 权重 blob 直接编译为 ANE 程序无需磁盘上的 mlmodelc。调用链在 training/training_dynamic/io.h 的compile_kern_mil_w()modelWithMILText:weights:optionsPlist:→inMemoryModelWithDescriptor:→compileWithQoS:options:error:→loadWithQoS:options:error:。IOSurface I/O——输入/输出张量通过共享内存 IOSurface 以[1, channels, 1, spatial]格式传递fp16 或 fp32fp16 直接 I/O 约快 37%。make_surface()training/training_dynamic/io.h创建按字节计数的 IOSurface读写通过IOSurfaceLock NEON 向量化的 fp16↔fp32 转换完成。动态权重——激活与权重被打包进单一空间输入维度在 MIL kernel 内部切片分开使用。权重变化无需重编译。例如sdpaFwd的输入布局为[1, DIM, 1, SEQ Q_DIM KV_DIM KV_DIM]其中前SEQ个位置是xnorm其后依次是Wq、Wk、Wv见 training/training_dynamic/io.h 的stage_sdpa_fwd_weights()与write_sdpa_fwd_acts()。梯度流——前向 taps 暴露反向所需中间量反向 kernel 在 ANE 上计算 dx输入梯度dW权重梯度通过 CPU 的 cblas 计算。INT8 量化——int8 权重用constexpr_affine_dequantize层间用quantize/dequantize将 int8 激活缓存在 L2 SRAM带来 1.88 倍吞吐。已知限制与规避方案README 如实列出了四个关键硬件/工程限制均为实测结论SDPA 因果掩码——ANE 硬件会忽略 SDPA 算子中的attn_mask项目将因果注意力拆解为QK^TANE→ masksoftmaxCPU→scoresVANE三段执行。MIL 侧的实现也印证了这一点training/training_dynamic/mil_dynamic.h 中掩码是通过BLOBFILE常量 add手动加到分数上再走softmax而不是依赖 SDPA 的掩码参数。约 119 次编译上限——ANE 编译器存在资源泄漏通过带 checkpoint 的exec()重启绕过。动态管线因只需一次性编译 10 个 kernel天然规避了该问题。FP16 梯度下溢——反向 matmul 在 fp16 下会下溢通过全局损失缩放256 * NLAYERS修复。单输入约束——多输入 ANE 请求会触发 0x1d 错误因此将多个输入打包进空间维度这正是动态权重设计的直接动因。性能数据汇总训练吞吐M4模型参数量ms/step层数kernels/层Stories110M109M91 ms126MHAQwen3-0.6B596M412 ms2810GQAANE 峰值吞吐M4, H16G精度峰值 TOPS配置FP1618.6128x conv 512ch 64x64INT8 W8A835.1128x conv 512ch 64x64GPU↔ANE 推理管线M4, seq256模型GPU PrefillANE Decode总计Stories110M6.7ms1.9ms8.8msQwen3-0.6B9.7ms2.3ms12.0ms从源码看实现细节派生尺寸与模型接入training/training_dynamic/config.h 是理解动态管线模型无关设计的关键模型特定维度全部来自models/*.h其余结构由宏自动派生。以 training/training_dynamic/models/qwen3_06b.h 为例#define DIM 1024 // 模型隐藏维度 #define HIDDEN 3072 // FFN 中间维度 #define HEADS 16 // Query 头数 #define KV_HEADS 8 // KV 头数MHA 时 HEADS #define HD 128 // 显式 head_dim注意不等于 DIM/HEADS64 #define GQA_RATIO (HEADS / KV_HEADS) // 2 #define Q_DIM (HEADS * HD) // 2048 #define KV_DIM (KV_HEADS * HD) // 1024 #define SEQ 256 #define NLAYERS 28 #define VOCAB 151936对比 training/training_dynamic/models/stories110m.hKV_HEADS HEADSMHA、HD DIM/HEADS 64、GQA_RATIO 1。权重尺寸由此自动派生见 config.h 中的WQ_SZ、WK_SZ等宏并定义了LayerWeights、LayerAdam、LayerActs、LayerGrads等逐层结构体以及含 GQA 字段kv_heads, head_dim, q_dim的 checkpoint 头CkptHdr。新增模型的方法来自 training/README.md创建training_dynamic/models/mymodel.h只需定义MODEL_NAME、DIM、HIDDEN、HEADS、KV_HEADS、HD、SEQ、NLAYERS、VOCAB、CKPT_PATH、DEFAULT_DATA_PATH其余一切GQA_RATIO、Q_DIM、KV_DIM、权重尺寸、IOSurface 布局、MIL kernel自动派生。约束HEADS必须能被KV_HEADS整除HD显式给出Qwen3 的 HD128 而 DIM/HEADS64MHA 时设KV_HEADS HEADS。构建命令为make MODELmymodel。训练管线的三层演进training/README.md 还记录了同一目标的三种管线演进可作为理解设计取舍的背景静态基线PR#19 ANE extrasPR#19 no extras动态墙钟时间20 步10.1s11.7s10.7s~2.6sCompile7.6s (75.7%)9.6s (81.6%)7.5s (69.7%)0.4s (15%)Train2.1s (21.2%)1.8s (15.6%)2.9s (27.4%)2.2s (85%)ms/step106.791.8147.0111Kernels/restart7286609一次性ANE TFLOPS0.871.150.72—Total TFLOPS1.631.901.19—关键结论动态管线在任意实际运行长度下墙钟时间占优20 步时快 3.9 倍PR#19 单步吞吐最佳92ms但短任务下编译开销主导静态管线每 10 步重启一次动态零重编译的优势会随时间累积。训练完成后程序会打印Efficiency Report用于量化编译与训练耗时占比 Efficiency Report Total steps: 20 Wall time: 11738 ms (11.7 s) Compile time: 9583 ms (81.6%) Train time: 1835 ms (15.6%) Avg train: 91.8 ms/step ANE TFLOPS: 1.15 sustained监控方面可使用 training/dashboard.py基于blessed的 TUI展示 loss 曲线、功耗/CPU/内存图表pip install blessed psutil numpy后运行sudo python3 dashboard.py静态管线或sudo python3 dashboard.py --dynamic动态管线。免责声明与许可本项目使用了 Apple 的私有、未文档化 API_ANEClient、_ANECompiler、_ANEInMemoryModelDescriptor。这些 API 不受任何公开稳定性承诺保护可能随任何 macOS 更新而变化或失效。项目是基于运行时内省发现的 API 所进行的独立研究依据合理使用与互操作性条款参见Sega v. Accolade, 1992DMCA §1201(f)用于研究与教育目的仓库不包含任何 Apple 专有代码或二进制与 Apple Inc. 无关联或背书关系请自行承担使用风险。项目以 MIT 许可发布见 LICENSE。赞分享【免费下载链接】ANETraining neural networks on Apple Neural Engine via reverse-engineered private APIs项目地址https://gitcode.com/GitHub_Trending/ane2/ANE点击查看免费下载相关推荐抖音下载神器批量保存视频、直播回放建立你的个人内容库抖音下载神器批量保存视频、直播回放建立你的个人内容库 你是否曾经遇到过这样的情况看到抖音上一个精彩的知识分享直播想收藏起来反复学习却发现直播结束后内容OpenTracing Go API 深度实战在 Inngest 项目中接入分布式追踪插桩OpenTracing Go API 深度实战在 Inngest 项目中接入分布式追踪插桩 本篇技术指南围绕 Inngest 仓库内 vendor 依赖 giANE 跨代基准报告实战解读在 Apple Neural Engine 上训练 Stories110M 的性能实测与 MIL 兼容性分析ANE 跨代基准报告实战解读在 Apple Neural Engine 上训练 Stories110M 的性能实测与 MIL 兼容性分析 导读 本文深度解读本上一篇D2DX终极优化指南让暗黑破坏神2在现代PC上重获新生下一篇Mac菜单栏终极整理指南5步实现清爽高效工作空间创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

柑橘检测数据集实战:labelme转YOLO格式与训练避坑指南 2026/10/2 2:46:23

柑橘检测数据集实战:labelme转YOLO格式与训练避坑指南

简介:面向果园自动化与农业视觉研究的柑橘果目标检测数据集,包含579张JPG原图与580个JSON标注文件,覆盖树上柑橘(On-tree)与树下柑橘(Under-tree)两类目标,适用于果园收获系统开发、…

阅读更多 →
RIP路由协议实验全解析:从原理到配置与防环排障 2026/10/2 2:46:23

RIP路由协议实验全解析:从原理到配置与防环排障

但凡学过网络的人,第一个亲手配置的动态路由协议,大概率都是RIP。这个实验我在模拟器上做过无数次,也在真实设备上排过它的故障。说实话,RIP在现网里已经很少见了,但它的价值一点没打折——距离向量算法、水平分割、毒…

阅读更多 →
416×416脑部MRI肿瘤二分割数据集:从数据校验到可视化跑通 2026/10/2 2:46:23

416×416脑部MRI肿瘤二分割数据集:从数据校验到可视化跑通

简介:本资源面向医学图像分割方向的初学者与算法实践者,提供一套416416分辨率的人脑MRI肿瘤二分类分割数据集及配套可视化脚本,可用于训练与验证U-Net等分割网络,帮助解决医学影像中前景标注获取困难的问题。压缩包共2000个文件&a…

阅读更多 →
010editor_v11.0.1中文版:二进制逆向与文件格式分析实战指南 2026/10/2 2:46:23

010editor_v11.0.1中文版:二进制逆向与文件格式分析实战指南

简介:010Editor_v11.0.1中文版是一款面向软件开发、逆向工程与数据恢复人员的专业十六进制编辑器,提供完整中文界面,可深入分析与编辑二进制文件。其核心的二进制模板系统能自定义数据结构,解析磁盘映像、内存转储、日志等复杂格式…

阅读更多 →
基于Python的舌苔图像深度学习识别系统源码及GUI实现 2026/10/2 2:46:22

基于Python的舌苔图像深度学习识别系统源码及GUI实现

简介:这是一套面向高校计算机相关专业毕业设计与人工智能入门实践的舌苔图像深度学习识别系统源码包,围绕医学图像分类任务,提供从数据到界面的完整实现路径。包内共131个文件,以26个Python源码、20个备份文件、10个编译缓存、6个…

阅读更多 →
皮肤疾病目标检测数据集:11294张图双格式标注与训练指南 2026/10/2 2:46:16

皮肤疾病目标检测数据集:11294张图双格式标注与训练指南

简介:医学常见9种皮肤疾病检测数据集,面向医学影像AI开发与目标检测任务,涵盖Actinic Keratosis、基底细胞癌、黑素瘤、痣等9个类别,共11294张已增强的皮肤病变图片,并提供YOLO与VOC两种格式标注,适合用于皮…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉