融合范围与收益分析
判定融合单元:哪些计算该被融进同一个 kernel、边界画在哪、这样融值不值。本技能只出判定与建议,
不动实现——实现侧(写 pattern / 写 kernel)与选点派活分别由上游调度与实现技能承接。
输入
| 输入 | 内容 | 用途 |
|---|
| 模型代码 | forward / 模块定义(含被封装成同一函数的算子) | 规则 1:函数边界即候选组 |
| 算子执行序 | kernel_details.csv:Name、Start Time(us)、Duration(us)、Task Type | 邻接链、区域切分、Σ 耗时核算 |
| 计算单元利用率 | 同目录含 PipeUtilization 列的文件(op_summary_*.csv 为权威来源):*_vec_ratio、*_mac_ratio、*_mte2_ratio、*_mte3_ratio、cube_utilization(%)(判型所需的四族 ratio 缺列或全 N/A 即判采集不合格,先补采:先用 ../profiling-collect/scripts/check_output.py 判该次采集不合格,再按其提示带 --task-time=l1 --aic-mode=task-based --aic-metrics=PipeUtilization 重采);memory_bound 是可算字段(按下方公式现算),不是必备列——真实 CANN 导出常不含该列 | 判型:这条链的收益来自哪一类 |
判定链
1 切边界:按融合单元构造规则(函数边界 → 锚点分区 → Cube 首算子包裹 → 迭代)
2 判型 :用单元利用率判「收益来自哪一类」——向量饱和 / MTE 饱和 / 向量约束单 pass
3 估收益:带宽下限 → 区域占比 → 天花板法 → 与本地板比 → Amdahl 传导校验
4 出结论:融合机会点清单(含否决理由)+ 收益量级 + 交付输入
融合单元构造规则(结构侧)
| # | 规则 | 终止 / 否决 |
|---|
| 1 | 函数边界即候选组:模型代码里定义在同一函数内的算子一般可融(norm、rope) | 跨函数默认不同组,除非执行序证明邻接 |
| 2 | 注意力族禁融:注意力算子族及其全部变体(稀疏 / 量化 / 分块…,如 FA 及其变种)既不能被吸收,也不能被跨越 | 硬锚点 |
| 2b | 通信不是硬锚点:先按 Task Type == COMMUNICATION 认出通信算子,再按通信与计算的重叠率、launch 前后依赖判「是否真把计算序切断」;并发则不构成边界(Stream ID 为 N/A 时该判据不适用,不得据此下结论) | 串行依赖(重叠≈0 且有依赖)才是边界 |
| 3 | 锚点分区:以 norm / rope / FA 为分界把执行序切区;区域内全为 Vec 时优先试融 | 区内出现 Cube ⇒ 转规则 4 |
| 4a | 隐藏型:Vec 总量 < Cube 时,Cube 作首算子向后包裹 Vec | ① Σvec ≥ Cube ② 遇到下一个 Cube |
| 4b | 搬运消除型:小 Cube + 大 Vec(Σvec ≥ Cube)仍可融——只要代码或 profiling 证明输入输出关联(shape+dtype 接得上),收益即来自减少中间态 GM 往返;不得用"cube 小"一票否决 | 无邻接证据(I/O 接不上)才是否决理由 |
| 4c | 不做跨双 Cube 的复杂融合:cube+vec+vec+cube 且中间 Vec 段 < 两侧 Cube 时,按 4a/4b 分别处理两侧或不动 | 结构复杂度判据 |
| 5 | 迭代融合:一轮之后,纯 vector 的融合单元之间再走一次规则 3/4 | 收敛接收益侧(地板先行 / 0.5% 阈值 / 与图开销对抵) |
| MLP / MoE | 以矩阵乘族(MatMul / BatchMatMul / GroupedMatmul)为界分区,Cube 作首算子 | 该段已由单个融合算子承载时,按规则 6 先确认其是否生效 |
规则 4 的判读口径:事前用执行序各算子 Duration 求和判定,事后用 *_mac_ratio vs *_vec_ratio 复核。
详细判据、失效信号与已证伪对照见 references/fusion-unit-method.md。
判型与收益(收益侧)
判型主指标是官方公式定义的 memory_bound = mte2_ratio / max(mac_ratio, vec_ratio)(可算字段,
真实导出常不含该列,按四族 ratio 现算即可;<1 无内存瓶颈;>1 内存受限):
| 判型 | 观测量 | 融合是否值得 |
|---|
| MTE 饱和 | memory_bound > 1、*_mte2/mte3_ratio 高、vec_ratio ≈ 0 | 值得——融合的价值就是减少/合并搬运 |
| 向量饱和 | vec_ratio 高、mte2_ratio ≈ 0、memory_bound < 1 | 不值得——"喂更少数据 / 融更多东西"不会移动它 |
| 向量约束的单 pass | vec_ratio 高但内存余量充足 | 值得,但收益上限在向量侧 |
方法单点在 references/fusion-benefit-method.md(两级口径:L0 搬运消除上界(初筛)/ L1 理论锚定(下结论));
L1 的理论列由本技能自产的 scripts/theory_columns.py 计算(逐算子「字节 ÷ 实测有效带宽、FLOPs ÷ 实测峰值算力」,
峰值参数由使用者给出、缺参数拒算;峰值可用 scripts/perf_probe.py 实测,其口径自检不通过即 fail-closed 拒出),
只在关键流(critical stream)上核算,且 duration_over_theoretical ≈ 1 的成员不计入可回收量。
阈值与噪声地板只引用 ../perf-gate/SKILL.md,本技能不另立一套。
事后复核(实测收益打平或为负):本技能的另一半职责,方法在
references/fusion-benefit-method.md §10(关键流核对 → 等功忙计数对照 → 判决 → 升级)。
总纪律:在完成等功对照之前,"融合打平/为负"不是结论,不得据此关闭该项。
判决落在"缺陷在融合核自身"(等功下核芯忙计数高于被替换算子)或"epilogue 写法缺陷"时,
必须升级 ../operator-dev/SKILL.md 深入分析,并一并给出重算后的可操作上界。
与相邻技能的关系
| 方向 | 技能 | 接口 |
|---|
| 上游(候选与数据) | ../profiling-analyze/SKILL.md | 它在 Layer 3c 出融合机会候选,本技能接候选做结构侧边界与收益判定(辅助关系) |
| 可选调用方(实现前评估,非门禁) | ../operator-dev/SKILL.md | 它可在用户输入下直接实现算子;需要收益评估时可选调用本技能(不强制、不设编号门槛) |
| 阶段编排(L2) | ../model-auto-optimization/workflows/optimization-flow.md | 其 S1 在「识别机会点」后、「收益分析」前调用本技能;未登记进交付件的机会点不得进入收益分析与迭代表 |
| 可行性快验(上游) | ../dummy-run/SKILL.md | 它把「融合可行性结论(可行/不可行 + 原因)」交本技能做范围与收益判定 |
| 选点与派活 | ../dit-perf-opt/SKILL.md | 本技能只给机会点与收益结论;是否纳入、排 top、派给谁由它决定 |
| 下发削减的分工 | ../dit-perf-opt/SKILL.md | 融合 kernel 是减少下发次数的手段之一,归本技能(规则 5 迭代融合即此意);非融合的下发削减(减少 program 数、上提重复 host 准备、消除动态形状回读)归它,见其 references/host-dispatch-dimension.md |
不做什么
- 不做采纳与选点(不排序、不裁决、不派活);
- 不做采集与瓶颈定位(这两步属 profiling 采集与分析管道);
- 不写 kernel、不写 pattern、不做使能与并行选型;
- 不定义验收标准(等价性引
../accuracy-gate/SKILL.md,性能入库引 ../perf-gate/SKILL.md)。
交付件(强制)
本技能必须交付一张表,且交付前必须过门禁;未交付 = 本环节未完成。
- 路径:
{run_results_dir}/fusion_scope.md(会话产物,不入库)
- 结构:口径声明(数据 / 规则版本 / 收益模型 /
[探索] 或验收态)→ 汇总(每个 block 融合前后算子数、降幅、块内收益合计)→ 表 1 融合单元与收益 → 表 2 递进融合建议
- 列(顺序固定,两表一致):
序号 | 融合kernel名 | 融合kernel明细 | 次数 | 收益预期 | 是否建议融合 | 说明
- 明细 = 成员算子名(取列表中的
_ 尾段)以 k1+k2+… 连接,每 5 个换行;
- 次数 = 该形态在块内出现次数;收益预期 = 块内总收益(表 2 为增量),形如
a%-b% 或 0%;
- 列内容只放该列内容:括号说明、"须按…确认"、规则名、成员数等一律写进「说明」列;
- 建议列只表达是否建议融合;递进/迭代融合放表 2,不塞进表 1。
- 只列「建议融合」行(不建议项不展示,避免噪声);超长单元(>5 成员)在说明列标「建议分阶段融合」。
- 门禁:
python scripts/check_fusion_scope.py --file {run_results_dir}/fusion_scope.md
(逐列校验列内容洁净;退出码 0/1/2;自带 --selftest 负样本回归,pre-commit 已挂钩)
- 调用方检测(只落在编排与选点链):
profiling-analyze 交棒须带候选清单;dit-perf-opt 未在交付表登记的机会点不得选点;
实现类技能(如 operator-dev)在用户输入下可直接实现算子,不受本交付件门禁约束——本技能对它们只是可选的收益评估来源。
Reference Files
references/fusion-unit-method.md — 加载时机: 要判定融合单元的边界(候选分组、锚点、Cube 首算子、迭代再融、MLP/MoE 分区)时
references/fusion-benefit-method.md — 加载时机: 要判定某条链或某个融合单元值不值得做(判型、收益上界、地板先行、传导校验)时
references/fusion-candidate-identification.md — 加载时机: 开始找融合点之前(候选来源、两个候选是否争同一 seam、profile 三类误判的排除、候选的预注册与 L1/L2 分级、绕行的可删除性)与 profile 归因出现「看不到的成本」时(逐算子视图里为零、wall 却明显)读它
路由判据(何时读候选识别文件):① 在动手找融合点、或接收上游候选清单之前——先用它筛掉"争同一处 seam"的候选(竞争者的收益不可相加),再进 fusion-unit-method.md 定边界;
② profile 归因出现"看不到的成本"或"名字还在但不像被调用"时——先按它的三类误判排除法判真假,再决定是否立单元;
③ 给候选排收益 / 写交付表之前——按其判定法做站点重叠分析,并把旁路型闸门"是否静默丢功能"用 OFF/ON 逐位对比收口。
候选争用同一站点:禁止把单项收益相加
规则:若候选 A 的融合会"吃掉"候选 B 所优化的算子,则 B 在 A 打开后只剩残余价值——必须按组合实测,
不允许把各项的独立测量值相加。
实测(单卡、生产形状、ABBA):收益不可按各项独立值外推。
机理:某候选合并了层间边界后,直接删掉了其余候选的绝大多数目标站点 ⇒ 后者只剩独立价值的
个位数百分点(本组合观测,须本地重测;读数见会话产物归档 {run_results_dir}/archive/)。
执行:候选清单先做站点重叠分析(谁删掉谁的目标算子);重叠者必须按组合测量,并在表里写清
"该项在组合 X 下的残值",而不是并列各自的独立值。
维护与更新
判型字段与采集前置变化、出现新的锚点(新算子族/新框架结构)、或上游序列变化(量化/并行后重审)时,
更新本节与两份 references 并复核失效信号;外部事实(框架 / 版本专有的算子名与前提)须标注来源,
仓内无证据的不得写成已验证结论。本技能只承载可迁移的判据与辨识方法:设备 / 模型 / 版本的实测读数、
代际常量与个案细节留在会话产物与对应 case 记录,不写进 skill,也不内置任何设备代际的绝对阈值。