CANN graph-autofusion 自动融合精度测试报告:八项任务实战指南 📅 发布时间:2026/9/19 13:30:13 👁 浏览次数: CANN graph-autofusion 自动融合精度测试报告八项任务实战指南【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion关联文档自动融合精度一致性说明本篇技术指南以 CANN graph-autofusion 开源仓库中《Automatic Fusion Precision Test Report》自动融合精度测试报告为骨架系统拆解自动融合AutoFuse在昇腾Ascend芯片上的精度验证体系报告将自动融合与 Eager 模式二进制一致性这一原则级问题落地为 8 个可并行、可独立交付的测试任务含 1 项共享基础设施。读者将掌握精度测试工具包bit-diff / ULP / fp64 reference的设计、自动融合自身二进制确定性与自洽性验证、指令选择/累加顺序/迭代算法三类末位差异的可复现实验方法以及端到端训练指标对齐的实验框架每个任务都附带预期结果、可行性风险与仓库源码证据可直接照单执行。1. 报告定位与任务全景本报告的核心目标是为主文档 自动融合精度一致性说明 的四项核心论点提供实测数据支撑。主文档给出结论自动融合无法保证与 Eager 模式手写算子输出在二进制层面完全一致但通过保守精度策略可以保证精度不低于 Eager 模式。本报告即是为该结论设计的一套可执行、可并行、可追溯的实证方案测试结果将回流至主文档 §3自动融合提供的保证与 §6.1需要按算子类型关闭融合的开关列表。报告将验证工作拆分为 8 个独立任务每个任务自包含目的、配置、步骤、预期结果与产出物可独立分配给不同负责人并行推进。任务分工表ID测试名称对应论点负责人工作量优先级前置依赖状态S精度测试工具包bit-diff / ULP / fp64 reference共享基础设施TODO1dP0阻塞项无待开始A自动融合自身的二进制确定性主文档 §3.3TODO0.5dP0无待开始C1Tensor × Scalar 指令选择差异主文档 §1.2 (2)TODO0.5dP0无待开始C2Reduction 累加顺序差异主文档 §1.2 (3)TODO0.5dP0切块控制接口待开始C3rsqrt 算法迭代差异主文档 §1.2 (4)TODO0.5dP0迭代次数控制接口待开始D纯搬运类算子一致性主文档 §二TODO0.5dP1S 完成待开始BEager vs AutoFuse 累积误差主文档 §3.2TODO2–3dP1S 完成待开始E端到端训练指标对齐主文档 §3.2 现实投射TODO5–7dP2S 完成、NPU 资源待开始并行推进建议Day 0 单独启动S基础设施1 天阻塞其他依赖它的任务。Day 0 起并行启动A、C1、C2、C3 均不依赖 S可与 S 同步开始。Day 1 起并行启动B、D、E 在 S 完成后切入。最小人力配置2 人 ≈ 1 周建议 4–5 人 ≈ 3–4 天。最短路径P0 全部完成后主文档已可补充关键数据。P1/P2 结果用于强化 §6.1 与端到端说服力。2. 任务 S — 精度测试工具包共享基础设施目的为 A / B / D / E 提供共享的数值比较工具避免重复造轮子。工具包本身不产出论据但它是其他任务的前置依赖——所有任务最终都要回答输出差了多少而差多少的统一度量标准由本任务定义。交付清单工具包由四个核心函数构成bit_equal(a, b) - bool逐元素 bit-wise 比较返回是否完全一致。这是二进制一致性判定的最终裁决标准用于任务 A / D 的全一致断言。ulp_diff(a, b) - ndarray逐元素 ULP 差。ULPUnit in the Last Place末位单位是衡量浮点误差的黄金标尺两个浮点数相差 1 ULP 意味着它们的二进制表示只在最低位不同。相比绝对误差/相对误差ULP 不受数值量级干扰能精确刻画末位差异。error_stats(a, ref) - dict统计 max / mean / P50 / P99 的绝对误差、相对误差、ULP 误差。P50 / P99 分位数用于刻画误差分布的整体形态max 用于捕捉极端偏差。fp64_reference(graph, inputs) - tensor把子图用 numpy / torch CPU fp64 重算作为真值基准ground truth。fp64 精度远高于被测的 fp16 / bf16 / fp32其计算结果可视为数学上正确的参考值用于衡量各条路径偏离真实值的程度。打包形式内部 pip 包 pytest fixture 入口。pytest fixture 保证了测试环境的一致性和可复用性。步骤拉群对齐工具包接口与仓库位置统一命名与返回类型约定。先出bit_equal与ulp_diff满足 A / D 立即可用其他功能两天内补齐。单测覆盖fp16 / bf16 / fp32 三档正常值、非规范数subnormal、inf / nan 全覆盖。非规范数与 inf / nan 是浮点比较最容易翻车的场景必须显式覆盖。发布到内部 pypi 或以源码形式集成。产出物工具包仓库链接、接口文档、单测报告。仓库佐证精度与误差度量的实际用武之地从源码结构看graph-autofusion 的精度相关设计与本报告的工具包设计意图完全吻合fp32 内部累加的真实实现自动融合默认在融合 kernel 内部将所有中间计算提升到 fp32仅在融合块输入/输出边界保留原始 dtype见 自动融合精度一致性说明 §3.1。这正是任务 B 中自动融合累积误差 ≤ Eager论断的机制根源——Eager 模式在每个算子边界都发生 fp16/bf16 截断而融合块只在边界截断一次。可观测的切块/求解参数auto_fuse_config.h 中定义了AttStrategyConfigATT tiling 求解配置其中tiling_algorithm范围AxesReorder/HighPerf/Golden、max_iter_numtiling 求解最大迭代次数范围 1–2000、solution_accuracy_level求解精度级别范围 0–1等参数直接决定 reduction 的切块与累加顺序是任务 C2 需要框架团队配合暴露的控制面FusionStrategySolverConfig中的max_fuse_rounds最大融合轮数默认 10、max_proximity融合节点最小/最大排序差值默认 64、max_fusion_size融合节点最大原始节点个数默认 64则刻画了融合策略求解器的行为边界。3. 任务 A — 自动融合自身的二进制确定性目的验证主文档 §3.3 的核心论断编译期输入与运行期输入不变时多次运行输出二进制一致且编译产物本身 hash 稳定。注意本任务只关注自动融合自身的可复现性不涉及与 Eager 模式的对比。主文档 §3.3 将确定性拆为两层编译确定性相同编译期输入模型结构、shape、dtype、自动融合版本、编译选项→ 相同 kernel 二进制执行确定性相同 kernel 二进制 相同运行期输入tensor 值、芯片型号等→ 相同输出。两层叠加即得端到端保证编译期输入与运行期输入均不变时多次运行输出在二进制层面完全一致。测试配置子图matmul → add → layernorm → geluTransformer FFN 前半段。输入 shape[8, 2048, 4096]fp16。硬件单卡固定型号。步骤构建子图开启自动融合采集融合 kernel 的二进制 hash记为H_k0。用固定种子生成一组输入 tensor保存到磁盘保证两次进程的输入逐 bit 相同。同一进程内连续执行 1000 次保存每次输出的 MD5。清空 JIT 缓存冷启动新进程重新编译再执行 1000 次。汇总第一轮 1000 次输出 MD5 集合大小应为 1第二轮 kernel hash 应等于H_k0输出 MD5 应与第一轮相等。预期结果运行输出 hash全部一致。编译产物 hash冷启动后不变。若出现不一致定位来源随机 dropout、非确定性 reduce、NUMA 飘移等记录并反馈框架团队。产出物表格运行次数 / 唯一 hash 数 / 最大 ULP 差期望1000 / 1 / 0。4. 任务 C1 — Tensor × Scalar 指令选择差异目的验证主文档 §1.2 (2)同一数学语义走不同硬件指令会产生末位差异。Tensor * Scalar是一个典型例子先将标量 broadcast 成 tensor再走标准向量乘指令直接走muls类标量乘指令。两者数学上等价但使用的乘法单元不同舍入行为不完全一致。测试配置输入 Afp16 tensor shape[1024, 1024]固定种子生成U(-1, 1)。标量0.7。路径 A走标量乘指令muls或等效 Python 写法x * 0.7让框架自动降为 muls。路径 B先将标量 broadcast 为[1024, 1024]的 tensor再走向量乘指令x * scalar_tensor.expand_as(x)。步骤编写两个最小复现脚本。用 profiler / op trace 验证两条路径实际生成的指令不同——这是本任务有效性的前提。两条路径同一输入各执行 1 次保存输出。用工具 S 统计两者 ULP 差分布。汇报ULP 0 / ULP 1 / ULP ≥ 2 各占比。预期结果两条路径输出不完全一致大多数元素 ULP ≤ 1极少量更高。数据本身就是指令选择引入末位差异的证据。可行性风险框架可能自动选择指令需要 profiler 确认两条路径实际生成了不同指令否则测试意义丧失。若无法控制改为观察一条路径的指令变化并如实披露。产出物脚本 profiler 截图 ULP 差直方图。仓库佐证指令映射与类型提升的实现线索从源码结构看graph-autofusion 的代码生成层存在与 C1 直接相关的处理逻辑codegen_kernel.cpp 及其配套的 api_call/elewise 目录18 个 .h / 18 个 .cpp 的逐算子 API 映射负责把融合图翻译为昇腾向量指令序列其中标量乘与向量乘对应不同的硬件指令选择路径主文档 §1.2 (1) 提到的精度提升策略fp16 中间计算提升到 fp32 的时机与降回时机在融合 kernel 的生成代码中体现为类型提升/降级指令的插入位置这同样是同语义不同实现的末位差异来源。5. 任务 C2 — Reduction 累加顺序差异目的验证主文档 §1.2 (3)浮点加法不满足结合律(ab)c与a(bc)的结果通常在末位不同。reduce、matmul、layernorm等计算的累加顺序由切块tiling策略与并行度决定而自动融合与手写算子的切块策略不可能从硬件资源约束上保持一致——融合 kernel 内部承担多个算子的中间计算单步 UB 占用高于单算子 kernel手写算子为减少搬运开销往往尽量用满 UB 的切块大小在融合场景下可能放不下。测试配置输入fp16 tensor shape[1, 16384]固定种子。操作sum(dim-1)。路径 A切块 512。路径 B切块 1024。路径 C切块 2048。参考fp64 CPU 精算。步骤通过框架的切块配置编译 flag 或 kernel 级 hint生成三个切块版本。每个版本用同一输入跑 1000 次校验自身确定性工具 S 的bit_equal。三版本之间两两比较 ULP 差。每个版本与 fp64 参考比较看哪个更接近。预期结果每个版本自身 1000 次完全一致自身确定性不同切块版本之间存在 ULP ≥ 1 的差三者都落在 fp64 基准的随机误差范围内。可行性风险框架不对外暴露切块控制时需要框架团队配合出一个调试 flag。无此接口时该测试需搁置或改为观测不同 shape 下框架自选切块策略与输出的关系。产出物三版输出的 ULP 差矩阵、与 fp64 的对比表。仓库佐证切块控制的真实接口任务 C2 的可行性取决于框架是否暴露切块控制仓库中存在明确的候选接口auto_fuse_config.h 中AttStrategyConfig的force_tiling_case与force_schedule_result字段注释明确标注用于强制模板选择不对外开放即当前为内部调试手段正是 C2 需要框架团队配合出一个调试 flag的落点同一文件的solution_accuracy_level求解精度级别与ub_thresholdUB 利用率阈值百分比范围 0–100超过则考虑多核与 UB 平衡、corenum_threshold核数利用率阈值范围 0–100等参数从侧面影响切块策略的求解结果。6. 任务 C3 — rsqrt 算法迭代差异目的验证主文档 §1.2 (4)迭代逼近类算子的实现差异直接反映为末位精度差。rsqrt和div等算子常采用多轮迭代逼近实现不同的迭代轮数与初值选择会带来不同的末位误差。测试配置输入fp16 tensor shape[1024, 1024]值域U(0.01, 100)固定种子。操作rsqrt。路径 A框架默认实现。路径 B同一框架下调整迭代次数例如 2 轮 vs 3 轮牛顿迭代。参考fp64 精算。步骤联系框架团队获取迭代次数配置接口环境变量或编译开关。两路径同输入各跑 1 次保存输出。用工具 S 统计 A / B 两者与 fp64 参考的 ULP 差分布。若顺畅可再补一个例子div(x, y)机理相同。预期结果A 与 B 输出不完全一致迭代次数更多的路径 ULP 差更小。可行性风险与 C2 相同若无法控制迭代次数改为框架实现 A vs 同语义的 numpy fp32 实现对比说服力略降但仍能展示算法层差异。产出物两路径 ULP 差直方图 迭代次数与末位差的关系表。仓库佐证rsqrt 的实现形态仓库中有与 rsqrt 相关的独立 API 声明与注册实现说明该算子以独立算子形态存在并被注册进融合体系API 头文件autofuse/ascendc/api/rsqrt.h注册函数autofuse/ascir/reg_func/rsqrt.cpp。这为 C3 提供了同一框架下调整迭代次数的实验载体——迭代逼近类的具体迭代轮数由 kernel 实现决定通过环境变量或编译开关控制后即可对比不同轮数下的 ULP 差异。7. 任务 D — 纯搬运类算子一致性目的验证主文档 §二不做数学运算的搬运类算子自动融合与 Eager 可以二进制一致。精度差异源于计算对于broadcast/concat/split/transpose/reshape/slice这类纯数据重排算子理论上可实现二进制一致。但主文档同时指出此类场景的融合收益通常很小。自动融合收益主要来自计算类算子融合消除中间结果读写与多计算 单搬运融合计算与访存重叠。纯搬运融合在真实业务中占比低因此能保证一致的场景与值得融合的场景交集很窄——本任务的意义在于划清这条边界。测试配置算子清单transpose/reshape/slice/concat/split/broadcast。组合子图需要触发融合transpose → concatslice → broadcast → concatsplit → transpose → concat输入fp16 / bf16 / fp32 各一套shape 覆盖典型业务值。步骤对每个子图分别跑 Eager 与 AutoFuse。用工具 S 的bit_equal校验。枚举 dtype × shape 组合填充勾选表。出现反例时例如 broadcast 伴随隐式类型提升记录并说明原因。预期结果所有纯搬运子图 bit-wise 一致带隐式计算的 broadcast 可能有差异单独标注。产出物勾选表 反例清单。仓库佐证融合类型枚举与默认开关主文档 §6.2 的 TensorFlow 场景表格elemwise 默认开启、reduce/concat/slice/gather/transpose 默认关闭且可配置在仓库源码中有精确对应fuse_type.h 定义了完整的融合类型枚举FuseTypekDefault/kPointwise/kReduction/kConcat/kSplit/kSliceSplit/kGather/kTranspose/kCube/kReshape/kExtern以及FuseTypeToString的字符串映射——concat、slice、gather、transpose、reduce 均有独立类型与配置开关一一对应auto_fuse_config_parser.h 中AutoFuseEnvConfigParser负责解析AUTOFUSE_FLAGS环境变量将--enable_autofusetrue;--autofuse_enable_passconcat形式的字符串解析为融合配置验证了主文档给出的环境变量用法在代码层面的真实性。实际可运行的端到端样例见 af_tf_eleandreduce 样例其明确说明Reduce 融合默认不使能需先设置export AUTOFUSE_FLAGS--enable_autofusetrue;--autofuse_enable_passreduce再执行脚本执行后可在./profiling/PROF_*/mindstudio_profiler_output/op_summary_*.csv中观察到autofuse_reduce_前缀的融合 Kernel 出现、独立的Abs/ReduceSumKernel 消失。8. 任务 B — Eager vs AutoFuse 累积误差对比目的支撑主文档 §3.2 最核心的定量结论自动融合累积误差 ≤ Eager 模式。其机制为Eager 模式各算子独立执行算子间中间结果必须按原始 dtypefp16/bf16落盘再被下一算子读取每个算子边界都发生一次 fp16/bf16 截断自动融合将算子链合并为一个 kernel只在融合块边界截断块内全程 fp32。因此自动融合的累积舍入误差上界 ≤ Eager 模式对应算子链的累积误差即精度不低于 Eager。测试配置算子链覆盖不同计算模式纯 elementwisemul → add → gelu → mul含 reductionlayernorm、softmax含 matmulmatmul → add → layernormFFN 前半段可选attention的qk → softmax → pv片段输入每条链 1000 组随机输入固定种子池。三路执行fp64 CPU 参考真值fp16 Eager逐算子执行边界落盘fp16 AutoFuse。步骤用工具 S 的fp64_reference生成真值。分别跑 Eager 与 AutoFuse收集输出。对两路径各计算最大绝对误差、相对误差、ULP 误差的 P50 / P99 / Max。画 1000 组误差的直方图与 CDF。逐算子链对比AutoFuse 的 P99 / Max 是否 ≤ Eager 的 P99 / Max。出现反例时定位具体算子与输入分布结果回流主文档 §6.1作为需要按算子类型关闭融合的实证依据。预期结果绝大多数算子链 AutoFuse 的 P99 / Max 误差 ≤ Eager个别反例需单独落到主文档 §6.1。产出物每条算子链一张误差分布对比图 一行汇总表反例清单直接交给 §6.1 作者。9. 任务 E — 端到端训练指标对齐目的支撑主文档 §六开头关注数值正确性可直接启用的建议用下游模型实验回应训练稳定性担忧如果两条训练曲线在正常随机波动内重合说明自动融合对训练收敛无实质影响可直接启用。测试配置模型候选按成本升序GPT-2 small124M——最小成本1k step 约数小时。LLaMA-7B 的 LoRA 微调——中等成本。小规模 pretrain如 300M 模型 5k step——最有说服力但最贵。起步建议先跑候选 1结论明确可跳过后续。每个模型固定种子、数据集、batch、lr schedule、optimizer。步骤搭建可复现训练脚本Eager 与 AutoFuse 两个开关。同一脚本两套开关各跑一次采样间隔 50 step。对比指标loss 曲线train / evalgrad norm若为 LMPPL。两条曲线应在正常随机波动内重合。如显著偏离记录偏离点、偏离量回流主文档 §6.1。预期结果候选 1 跑完即能得到初步结论。两条曲线应基本重合。可行性风险需要 NPU / GPU 资源和数据集配合。若资源紧张至少先做候选 1。产出物loss / eval 指标对比曲线图 最终指标差异表。仓库佐证图构建与融合的工程基础仓库中已有支撑端到端实验的图构建与融合基础设施Eager 风格图构建测试框架见 tests/framework/eager_style_graph_builder可用于构造 Eager 对照实验融合图改写与展开逻辑见 optimize/fused_graphfused_graph_modifier/fused_graph_unfolder端到端样例集中在 examples/tensorfloweleandbroadcast / eleandele / eleandreduce 三类融合样例与 examples/pytorchaf_pointwise / af_reduce / af_gather它们展示了如何在真实框架接入点上开启自动融合可作为任务 E 训练脚本的接入参照。10. 完成后的回流动作测试执行完成后将 A / B 两张关键结论表以链接形式反向嵌入主文档 §三。若 B / E 出现反例驱动主文档 §6.1wangxiaotian落地具体开关列表。工具 S 作为后续精度回归基准设施长期保留。11. 总结从报告到可执行的精度验证闭环本报告给出了一个完整的论点 → 实验 → 证据回流闭环原则层主文档 §1不同源码是数值差异的起点精度提升策略、指令选择、累加顺序、算法实现四个维度都会引入末位差异这是原理级限制而非可修复的 bug保证层主文档 §3融合块内强制 fp32、累积误差上界 ≤ Eager、自身编译与执行双重确定性实证层本报告 8 任务工具包统一度量S→ 自身确定性A→ 三类差异机理C1/C2/C3→ 搬运算子一致性边界D→ 累积误差定量对比B→ 端到端训练稳定性E回流层P0 任务产出嵌入主文档 §3反例驱动 §6.1 的按类型关闭开关列表工具包长期保留为精度回归基线。执行上P0 任务S/A/C1/C2/C3无相互依赖可同步启动S 完成后 P1B/D与 P2E切入2 人约 1 周即可拿到支撑主文档结论的关键数据。整个流程与 自动融合精度一致性说明 一脉相承自动融合以精度不劣于 Eager换取显著的性能收益而本报告的任务体系正是将这一承诺转化为可量化、可追溯、可复现的工程证据。【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考