CANN graph-autofusion SuperKernel 融合性能分析报告撰写指南:SK-off/SK-on 对比口径、分类规则与固定交付物
2026/9/18 7:36:59 网站建设 项目流程

CANN graph-autofusion SuperKernel 融合性能分析报告撰写指南:SK-off/SK-on 对比口径、分类规则与固定交付物

【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾(Ascend)芯片的轻量级、解耦式组件集合,旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件,未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion

本篇指南围绕 CANN graph-autofusion 仓库中 SuperKernel 融合性能分析技能所定义的「中文性能分析报告模板」展开,系统讲解同一 workload 下SK-off(S0 基线)与SK-on(Sx 候选)profile 对比的标准统计口径、逐 SK 分类规则、层级融合覆盖、Fusion Family 跨层诊断以及固定交付物规范。读者读完后,可以按模板产出结构合规、结论边界清晰、机器可校验的性能分析报告,并理解其背后的kernel_projection_trace_v2映射、source_scope_map_v2源码归属与动态噪声阈值等实现机制。

1. 模板定位:它只回答两个问题

该模板(chinese-performance-analysis-report-template.md)并非通用的 SuperKernel 报告格式,它只用于同一 workload 下SK-off(S0)与SK-on(Sx)的 profile 对比,回答两个不同的问题:

  1. 一个融合 SK 相比其在 S0 中对应的原始子算子集合,端到端设备区间是否变快;
  2. 若融合 SK 的表现异常,哪个 S0 child 或融合内 child 是主要审阅对象。

1.1 主比较口径

主比较口径始终是S0 child interval P50 对 Sx parent SK duration P50。其中:

  • S0 duration_sumunion_duration只用于解释串并行和累计工作量,不能替代 interval 作为 keep/prune 或收益结论的依据
  • Sx 融合内 child 时间仅在完整、可归属的sk_prof下作为补充诊断,不能与 S0 的 host 时钟做绝对时间偏移比较

模板本身不包含任何特定模型、算子序列、raw SK ID、step ID 或性能数值——真实采集数据只能出现在独立的性能分析报告中;模板只定义报告字段、统计口径和结论边界。

1.2 适用范围(硬边界)

模板用于普通S0 SK-offSx SK-on的融合性能对比,且两侧必须满足 skill 的 profile、结构映射和统计门禁。不得用于以下场景:

  • 两个 SK-on 候选之间的源码调序、多流或 source-reorder 对比;
  • Stage O 的 O0/O1 DCCI option 对比(该场景有独立协议 dcci-option-tuning.md);
  • correctness、clean 性能、编译性能或其他非 profile-vs-baseline 对比。

这些场景必须使用各自的实验/诊断报告格式和原生统计口径,不得复用本模板的 S0 interval、Sx parent、逐 SK classification、层级 family 或 scope-action 展示结构。完整的使用边界与可读性约束同时定义在 SKILL.md 的Chinese Human-Facing Report一节。

2. 分析前的证据链:采集门禁、结构映射与源码归属

报告模板是分析流程的「出口」;在填写模板之前,skill 强制要求先通过三层证据门禁,模板中大量字段(映射覆盖、blocker、source-layer mapping)直接来源于此。

2.1 采集门禁(Entry Gate)

需要两份新鲜、不可变、相互独立的采集根目录及其 manifest:

  • baseline_profile:归档kernel_detailstask_timetrace_view
  • candidate_profile:归档kernel_detailstask_timetrace_view,以及 profile 进程自身的sk_graph_originsk_graph_updatedsk_fused_nodessk_scope_splitsuper_kernelsk_proftrace 为可选项,仅用于映射后的调度诊断。

使用 artifact_contract.py 的validate-set校验;缺失或无效的 manifest 是采集 blocker,必须重新采集,不得用事后拼装的 manifest 补洞。collection manifest 的字段结构(capture_roleconfig/controlfingerprint、workload_fingerprintfilesmanifest_fingerprint等)可参见 collection-manifest-schema.json。

2.2 结构映射:kernel_projection_trace_v2

每个融合 SK 在做性能分析前都必须应用 projected_trace_mapping.py 完成kernel_projection_trace_v2:把 profile 进程的sk_graph_origin投影到可观测 kernel 节点,将每个完整 per-stream kernel 序列对齐到 baseline 的Step Id,按(stream role, kernel ordinal)物化融合 child。完整协议见 structural-association.md。

只有 stream-role 注入唯一、所有 step 全量一致、每个 child 唯一落点、候选父 SK 在至少三个 step 中均存在时,才输出kernel_projection_structural + exact_projected_trace;任一门禁失败都返回diagnostic_only + insufficient_evidence

2.3 源码归属:source_scope_map_v2

exact_projected_trace只证明measured graph occurrence,不证明任何源码区间。模板中「逐层融合清单 / exact source-layer mapping」字段只有source_scope_map_v2 + exact才可填写,其证据链为「original business graph → 唯一 labeled 多图同构 → calibration occurrence → archived source bytes + [start_offset, end_offset)」,详见 source-calibration-mapping.md。raw task/node/stream/SK ID、生成名称、层号、重复 op signature、局部 op window 和跨进程时间戳都不能产生源码 exact。

3. 一页结论(必填)

报告第一节必须是决策者可直接阅读的一页结论表,字段固定:

项目固定输出
对比对象S0 SK-off vs Sx SK-on;模型、device、workload、轮次
采集有效性manifest-set、profile/process ownership、配置和 workload 一致性、声明变更
映射覆盖SK 总数、精确映射数、阻塞数、每项配对样本数
分类汇总beneficial / neutral / regressed / insufficient_evidence 的实例数
主要收益 family以主口径列出 family、实例数、P50 收益和离散度
主要劣化 family列出所有实际 regressed 实例,不以 family 平均值掩盖
行动边界可测量结论、待 reprofile 项、是否具备源码动作证据

注意「主要劣化 family」要求列出所有实际 regressed 实例,禁止用 family 平均值稀释劣化信号;「行动边界」需明确结论属于可测量结论、待 reprofile 项,还是已具备源码动作证据。

4. 指标定义与符号(必填)

对 S0 中同一 SK 的一个 child occurrence 集合,模板定义如下指标:

child_end = child_start + child_duration S0 interval = max(child_end) - min(child_start) S0 duration_sum = sum(child_duration) S0 union = child 区间并集长度 Sx parent duration = Sx kernel_details 中该 SuperKernel 的 Duration(us) improvement_us = P50(S0 interval) - P50(Sx parent duration) improvement_pct = improvement_us / P50(S0 interval) * 100 noise_pct = max(3.0, 2*S0_interval_MAD/S0_interval_P50*100, 2*Sx_parent_MAD/Sx_parent_P50*100)

三个统计量的含义与用途如下表:

统计量含义在报告中的用途
P50第 50 百分位数,即中位数;50% 的样本不大于该值作为 S0 interval 与 Sx parent 的主比较值,计算收益或劣化
P90第 90 百分位数;90% 的样本不大于该值观察慢尾与波动上界,不单独决定 classification
MADmedian(\|x_i - P50\|),样本相对中位数的中位绝对偏差稳健衡量离散度,参与noise_pct计算;不易被单个异常值主导

所有时间统计量以us记录。P50 表示典型耗时,P90 用于发现尾部变慢,MAD 用于判断观测到的差异是否大于重复采样波动;三者必须同时随逐 SK 比较输出

需要特别强调:S0 interval = max(child_end) - min(child_start)保留了不同 stream 的并行关系,是性能分类的主判据;duration_sum(累计设备工作时间)与union(去除重叠后的设备忙碌区间)仅用于诊断并行串行化、额外同步、资源开销和调度行为。这正是 performance-classification.md 中「baseline_interval保留不同 stream 的并行关系,是性能分类的主判据」的落地形式。

4.1 网络层数与层级融合覆盖(条件必填)

从当前模型配置读取num_hidden_layers,并以配置中的一基 layer index 报告网络层数与层类型。逐层融合表必须区分「配置层信息」和「已证明的 SK-to-source-layer 映射」:只有source_scope_map_v2 + exact可以把一个 profile SK 写入具体源码层;graph occurrence ordinal、raw SK ID 或 family occurrence 数都不能替代层映射。下表中的<family_label>必须与第 7 节的 family 标签完全一致,以便从某层的融合清单直接跳转到该 family 的性能结论。

字段固定输出
总层数<num_hidden_layers>
层类型分布<layer_type>、一基 layer index 列表及计数
每层融合清单每一个一基<layer_index><family_label>列表;没有融合时显式写"无"
family 层覆盖汇总<family_label> / <covered_layer_count> / <covered_layer_ranges> / <appears_in_all_layers>
映射边界<exact source layer mapping \| unproven>

有 exact source-layer mapping 时,正文按下表展示。逐层表可以按连续、且融合 family 列表完全相同的层范围折叠,但必须保留所有层号;family 汇总中的covered_layer_ranges必须由逐层表可逆展开。appears_in_all_layers=是仅当该 family 覆盖1..num_hidden_layers的每一层时成立。

层号或连续层范围配置层类型融合 family(与第 7 节同标签)映射状态
<layer_index_or_range><configured_layer_type><family_label_0><family_label_1>、... / 无source_scope_map_v2 + exact
family(与第 7 节同标签)覆盖层数 / 总层数覆盖层号或范围是否覆盖全部层映射状态
<family_label><covered_layer_count> / <num_hidden_layers><covered_layer_ranges><是 / 否>source_scope_map_v2 + exact

没有 exact source-layer mapping 时,报告必须写明「当前 profile 不能证明每一个 SK 属于哪一层」,不得输出或推测逐层融合清单、覆盖层号、覆盖比例或"全部层出现";此时仅可列出 profile family 及其 occurrence 数,并将层覆盖标记为unproven

4.2 分类规则

分类条件固定行动语义
beneficialimprovement_us >= 1usimprovement_pct >= noise_pct性能上建议 keep;非源码 action
regressedimprovement_us <= -1usimprovement_pct <= -noise_pct优先审阅;无 source map 不做源码 prune
neutral数据充分但未达到上两类无明确收益;不代表错误
insufficient_evidence映射、样本、尾部、fingerprint 或 metadata 门禁失败记录 blocker 并 reprofile/block

分类对应的 scope action 固定映射为beneficial -> keepregressed -> pruneneutral -> pruneinsufficient_evidence -> reprofile(详见 regression-diagnosis.md);action 仅描述只读分析结果,skill 本身不得直接修改 scope。

实现佐证:分类器核心实现在 analyze_fusion_performance.py 的classify_performance()(约 L1920 起)。从源码可见:required_occurrences = max(HARD_MIN_OCCURRENCES, min_occurrences),即min_occurrences=3是自动 keep/prune 的硬下限,不能被 CLI 降低;当两侧 count 不足或统计量非有限值(non_finite_performance_statistics)时直接返回insufficient_evidence;当 baseline 或 candidate 恰好只有最低 3 个 occurrence 时,还会校验 P50 两侧最大距离是否超过max(3*MAD, P50*min_relative_change_pct, min_absolute_change_us),若单侧长尾未被 MAD 噪声带覆盖则追加minimum_sample_unrepresented_tail错误并强制insufficient_evidence/reprofile——这对应模板中「数据充分但未达到上两类」之外的证据不足边界。

5. 逐 SK 性能结论(摘要 + 全量明细)

本章面向阅读设计:先展示四类结论的数量,再定位需要审阅的实例。每一个精确 graph occurrence 的完整行记录保存在机器可读 JSON/CSV 中;Markdown 不直接铺开全量 SK 表,避免 100+ 行表格掩盖实际 regression 和证据不足项。

5.1 分类概览(必填)

classification实例数占比阅读动作
beneficial<count><pct>在 family 表中确认是否一致;不等同于端到端晋级
neutral<count><pct>只在有明确优化假设时抽样审阅
regressed<count><pct>全部进入"明确劣化实例"表
insufficient_evidence<count><pct>按 blocker 汇总,列出重采条件

5.2 阅读路径与全量明细(必填)

读者问题Markdown 展示机器可读全量数据
是否存在明确劣化列出全部regressed实例及其主指标profiling-analysis-result.json
哪些融合 family 值得关注family 汇总及 split / weak-benefitfusion-family-summary.csv
某一个 SK 的全部统计和 identity正文只展示代表性或异常实例profiling-analysis-result.jsonfusion-family-layer-comparison.csv

每个全量逐 SK 记录必须包含:稳定报告身份、ordered child sequence、stream/core topology、对齐 occurrence、S0 interval/duration_sum/union、Sx parent P50/P90/MAD、收益、noise threshold、classification、blocker 和 scope action。它是自动判定的权威数据,不以 op 名称或 raw SK ID 聚合

5.3 代表性多 child SK(条件展示)

正文针对多 child、明确劣化或需解释的 SK,使用下面的紧凑卡片;不把该实例外推为同 family 的所有实例。

项目数值
child topology<child_0>(<core_0>) -> <child_1>(<core_1>) -> ... -> <child_n>(<core_n>)
S0 interval P50<s0_interval_p50_us> us
S0 union P50<s0_union_p50_us> us
Sx parent P50 / P90 / MAD<sx_parent_p50> / <sx_parent_p90> / <sx_parent_mad> us
improvement / noise<improvement_us> us / <improvement_pct>% / <noise_pct>%
classification<beneficial \| neutral \| regressed \| insufficient_evidence>

模板明确要求:不能用 child duration 的加和替代 S0 interval,也不能用单个实例替代同 family 的其他实例child_count仅是描述性字段,不参与 profiling 门禁、动态阈值或分类——单子算子可以是 beneficial,多子算子也可以是 neutral 或 regressed,不得以child_count >= 5作为 profiling 条件,也不得以child_count == 1自动生成排除决定。

6. 融合内 child 与调度诊断(条件必填)

仅当 Sxsk_prof完整、无 buffer-full、且 parent occurrence 与 child/lane 可按device_id + model_id + sk_id + step_id绑定时,才追加下表。否则固定输出一句:sk_prof不完整或不可归属,融合内 child/lane 诊断未执行;不得推断 Cube/Vector 串行、DCCI 状态或根因。」

parent identitychild position/symbollane 类型Sx child wall/max-lane P50/P90/MAD对应 S0 child P50观察置信度
<填充><填充>CUBE / VECTOR / MIX<填充><填充>仅事实与可检验假设high / low / insufficient

允许写"调度假设",禁止把没有 A/B 验证的结论写成根因。若有 DCCI disable-all 数据,另用 Stage O 专用表比较 O0/O1 和逐 child,不与普通 S0/Sx 表混用

两点实现侧的硬约束值得报告作者注意:

  • 时钟域隔离kernel_details使用 host 域时间戳,而sk_prof可能使用设备计数器,二者之间不要求绝对时钟偏移;重复 parent occurrence 必须用显式(device_id, model_id, sk_id, step_id)域绑定(见 structural-association.md)。
  • buffer-full 即 blocker:若super_kernel.log报告buffer is full, stop dump the time of nodes,lane 集合不完整,无法证明 Cube/Vector 或 DCCI 行为,必须拒绝该诊断(但不会使已证明的 projected baseline mapping 或其 interval 分类失效)。运行时侧sk_prof相关实现可参考 sk_event_recorder.cpp 及其测试 test_profiling_st.cpp。

7. Fusion Family 与跨层/重复实例比较(至少三个重复实例时必填)

对重复 block 模型(如多层 Transformer),逐 SK 分类完成后必须追加跨层 family 诊断(companion 规范见 cross-layer-family-analysis.md)。family identity 固定为:

ordered canonical child op sequence + ordered child source-stream-role pattern + ordered child core-family pattern + fusion boundary + stable dtype/shape/port signature(若可得)

不能用 layer index、raw SK ID、task ID 或生成名称定义 family;若 dtype、shape、port、core family 或流拓扑不同,即使 op 名称序列相同也必须拆为不同 family。若没有 exact source mapping,仅称"graph occurrence",不可称"源码层"。

familytopologyinstancesB/N/R/IS0 interval P50 min/median/max/MADSx parent P50 min/median/max/MAD收益 P50splitweak benefit / outlier
<family_id><child_0> -> <child_1> -> ... -> <child_n><count><B/N/R/I><min / median / max / MAD><min / median / max / MAD><pct><是 / 否><count / count>

family 表是阅读性诊断,不能改变逐 SK classification,也不能用 beneficial 实例覆盖同 family 的 regressed/insufficient 实例。family 同时出现 beneficial 与 regressed 时标记family_classification_split,所有实际 regressed 实例另列优先审阅表。对 child 较多而正收益很小的融合,按family_gain_median - max(3 * family_gain_MAD, 3 percentage points)标记weak_relative_benefit复核队列——它是审阅优先级信号而非 regressed,不改变既有 classification/action,也不能直接触发 scope prune、option trial 或源码重排。

8. 结论、优先级与后续动作(必填)

结论必须分为三层,避免越权:

层级允许结论禁止结论
逐 SK 性能beneficial / neutral / regressed / insufficient_evidence用家族平均值取代逐实例结论
调度诊断有证据时提出可检验假设从不完整sk_prof宣称 root cause
源码行动仅 source scope map exact 时提出范围动作从 raw ID、graph ordinal 或 op 名称反推源码行号

固定排序:先列所有regressed,再列insufficient_evidence,再列多 child 的weak_relative_benefit,最后列neutral。每个条目必须有:报告 identity、数据事实、门禁状态、可执行的下一步及其前置采集条件。

报告结论必须同时写明:逐 SK 分类是否可用、收益或劣化的 family 分布、不能由 family 覆盖的异常实例、是否具备源码 action 证据,以及未执行的融合内诊断及其原因。诊断假设只能写入diagnostic_hypotheses(含kindconfidence、单个range_idevidenceexplanation_zhrequires_ab_test=true),永远不写root_cause;只有后续单变量 A/B 稳定复现后才能形成根因证据(见 regression-diagnosis.md 的证据等级定义:high 仅限直接 config 或可可靠归属的 trace 证据,medium 仅限 counter/统计相关证据,low 仅为待验证假设且必须附带 blocker)。

9. 固定交付物与机器可读约束

每次普通 S0/Sx 性能对比拟固定生成:

  1. PROFILING_ANALYSIS.md:一页结论、全量逐 SK 主比较和结论边界;
  2. profiling-analysis-result.json:逐 SK 机器结果、fingerprint、统计、分类和 blocker;
  3. PROJECTED_TRACE_MAPPING.md/projected-trace-mapping.json:S0 child 与 Sx SK 的精确映射;
  4. FUSION_FAMILY_LAYER_ANALYSIS.mdfusion-family-summary.csvfusion-family-layer-comparison.csv:重复实例/跨层诊断;
  5. 仅在 lane 采集完整时增加SK_CHILD_SCHEDULING_ANALYSIS.md与对应 JSON;
  6. 仅在 Stage O DCCI 模式时增加DCCI_REGRESSION_ANALYSIS.mddcci-regression-analysis.json,不混入 schema 1.2 结果。

9.1 推荐命令行执行流

先在 superkernel-fusion-performance-analysis skill 目录下运行完整的 analyzer,先产生权威的融合 child 映射:

python3 scripts/projected_trace_mapping.py \ --baseline-kernel-details artifacts/S0/profile/profiler/kernel_details.csv \ --profile-collection-manifest artifacts/S1/profile/association-artifact-manifest.json \ --device-id 0 --model-id 48 \ --json-out output/projected-trace-mapping.json \ --markdown-out output/PROJECTED_TRACE_MAPPING.md

要求满足source_kernel_nodes == baseline_rows_per_step[step]、零替代 stream-role 解、至少三个 step 且exact_projected_trace后,才可使用该 SK 的 baseline interval。随后运行性能分类器:

python3 scripts/analyze_fusion_performance.py \ --baseline-profile artifacts/S0/profile/profiler/kernel_details.csv \ --candidate-profile artifacts/S1/profile/profiler/kernel_details.csv \ --sk-meta artifacts/S1/sk_meta \ --baseline-config artifacts/S0/config.json \ --candidate-config artifacts/S1/config.json \ --baseline-workload artifacts/S0/workload.json \ --candidate-workload artifacts/S1/workload.json \ --declared-change-set artifacts/S1/declared-change.json \ --candidate-name S1 --experiment-id exp-1 --round-id S1-BASE \ --analysis-agent-id analysis-agent-1 --source-revision REVISION \ --sk-prof artifacts/S1/profile/profiler/sk_prof_device_0.json \ --environment-evidence artifacts/environment.json \ --source-scope-map artifacts/source-mapping/source-scope-map-v2.json \ --source-root worktrees/stable-marker \ --baseline-collection-manifest artifacts/S0/profile/association-artifact-manifest.json \ --profile-collection-manifest artifacts/S1/profile/association-artifact-manifest.json \ --json-out output/profiling-analysis-result.json \ --markdown-out output/PROFILING_ANALYSIS.md

可选参数--sk-prof只是诊断用 child-scheduling trace,不是 baseline child mapping 的输入,也不要求与kernel_details有绝对时钟偏移。若需要从既有结果确定性重生成 Markdown:

python3 scripts/render_fusion_performance_report.py \ --json-in output/profiling-analysis-result.json \ --markdown-out output/PROFILING_ANALYSIS.md

9.2 机器可读约束

  • 所有 analyzer 输入输出必须使用相对于结果文件目录的路径;两条 manifest 不放松任何已有 config、workload、declared-change、profile、environment 或 source-map 门禁;
  • schema 1.2 的 renderer 只接受完整 producer report:identity、所有两侧 fingerprint、inputs、thresholds、四个列表、blockers、next_agent_guidance_zhanalysis_content_fingerprint均必需;renderer 会从 identity 字段重算analysis_id、核验round_id属于 candidate 的BASE/Pn/FINAL家族,并重算 content fingerprint,缺失或冲突即拒绝;
  • 逐 SK decision 的 classification/action 只能是beneficial/keepneutral/pruneregressed/pruneinsufficient_evidence/reprofile|block,且scope_actions必须按唯一(sk_id, range_id)与 decisions 一一对应、字段完全一致;
  • interval_unproven=true时,下游 strategy 必须逐 range 生成 P,不得根据 op 名称顺序猜测 source 区间不重叠;
  • 本分析为只读流程:analyzer 与 renderer 只读输入 artifact 并写出结果文件,不运行推理、不编辑 scope、不应用 option、不声明 promotion(详见 SKILL.md 的Read-Only BoundaryDiagnostic Contract)。

10. 常见误用与红线总结

红线正确做法
duration_sumunion替代 interval 作收益结论主口径只能是 S0 interval P50 vs Sx parent duration P50
用 child duration 加和替代 S0 interval始终用max(child_end) - min(child_start)保留流并行关系
用 raw SK ID / graph ordinal / op 名称反推源码行号只有source_scope_map_v2 + exact且 boundary 证明 source offset 才可做源码动作
把单次 profiling 或 interval 相关性写成已证明根因只写事实与可检验假设,根因需单变量 A/B 稳定复现
从不完整sk_prof(含 buffer-full)推断 Cube/Vector 串行、DCCI 状态固定输出"融合内诊断未执行";DCCI 状态必须来自显式 config/environment 证据
用 family 平均值掩盖实际 regressed 实例所有 regressed 实例单独列出,family_classification_split时优先审阅
把本模板用于 SK-on 源码调序、Stage O DCCI O0/O1、correctness 等场景这些场景使用各自的实验/诊断报告格式与原生统计口径

按此模板产出的报告,配合profiling-analysis-result.json等机器可读交付物,可以在「逐 SK 结论不被 family 平均稀释、源码动作不被 raw ID 僭越、调度诊断不越权宣告根因」的边界内,为 SuperKernel 融合的 keep/prune、跨层一致性审阅与后续单变量实验提供可追溯、可复现的证据闭环。

【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾(Ascend)芯片的轻量级、解耦式组件集合,旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件,未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询