Pull Request已成功合入, 合并人@ascend-robot
(感谢 SorryNaCN 的贡献)变更摘要
此 PR 为 DVM(Ascend MLIR 后端)引入 matmul template 融合能力,通过新增 enable_matmul_fusion 配置开关(默认关闭,由环境变量 INDUCTOR_DVM_ENABLE_MATMUL_FUSION=1 控制),为 aten.mm、aten.bmm、aten.addmm 和 aten.baddbmm 注册 DVM template lowering。新增 DvmTemplateBuffer 保存 matmul template FX 图及逻辑 placeholder 到实际 IR 输入的绑定关系,支持合法的 pointwise epilogue 纵向融合,并处理 K=1 时的下沉优化和 alpha/beta 语义保持。
主要改动
-
新增
template.py模块:引入DvmTemplateBuffer类(继承ir.TemplateBuffer)及patch_dvm_matmul_template_fusion()入口函数,为四种 matmul 算子注册 DVM template lowering;K=1 时mm/bmm下沉为mul,addmm下沉为mul+add组合;同时实现can_fuse_dvm_epilogue()控制仅允许合法 pointwise epilogue 的纵向融合。 -
mlir_fusion.py调度器扩展:NpuDvmScheduling新增codegen_template()方法,在 codegen 阶段恢复DvmTemplateBuffer.input_bindings中的真实参数;can_fuse_vertical()与can_fuse_horizontal()分别处理 template 节点的融合规则(仅允许 epilogue 纵向融合,禁止 template 间及 horizontal 融合);条件启用由enable_matmul_fusion控制。 -
op_emitter.py规则与代码生成调整:mm_rule扩展以支持aten.baddbmm.default,并移除原有的小输出尺寸(SMALL_OUTPUT_MAX)拒绝逻辑;matmul_bias签名简化,addmm函数参数统一为inp/mat1/mat2并同时注册到aten.baddbmm.default,确保alpha/beta语义在 template 路径中正确保留。 -
graph_build.py与fx_pass.py补充:DvmCodegenInterpreter将ktype初始化逻辑抽取为set_kernel_ktype()方法,mixkernel 类型判断与spec回退逻辑明晰化;annotate_mm_transpose_flags将aten.baddbmm.default纳入转置标注范围,使其与addmm共享统一的 bias/转置处理路径。 -
config.py新增配置项:添加enable_matmul_fusion布尔开关,由环境变量INDUCTOR_DVM_ENABLE_MATMUL_FUSION控制,默认关闭,仅在显式设置时启用 DVM matmul template 路径。


代码审查
审查总结
审查了全部 7 个变更文件:
| 文件 | 审查结果 |
|---|---|
test/_inductor/test_dvm_mlir_fusion.py |
2 个问题:环境变量清理回退 (P2),断言弱化 (P2) |
torch_npu/_inductor/dvm/config.py |
无问题 |
torch_npu/_inductor/dvm/fx_pass.py |
无问题 |
torch_npu/_inductor/dvm/graph_build.py |
1 个问题:set_kernel_ktype 优先级变更 (P2) |
torch_npu/_inductor/dvm/mlir_fusion.py |
无问题 |
torch_npu/_inductor/dvm/op_emitter.py |
1 个问题:移除 check_output 保护 (P3) |
torch_npu/_inductor/dvm/template.py |
1 个问题:_DvmTemplateGraph 跳过 super().__init__() (P3) |
问题统计:
- P2: 3 个
- P3: 2 个
- P0/P1: 0 个
整体风险评估:中等偏低。 主要风险集中在:
- 测试代码中环境变量清理缺少异常保护,可能在测试失败时污染后续测试环境;
set_kernel_ktype中 "mix" 和 "spec" 的优先级变更可能与 DVM runtime 的 kernel 类型能力不完全匹配;- 测试断言从精确计数弱化为存在性检查,降低了回归检测能力。
核心逻辑(template fusion、codegen、lowering)无明显正确性问题,参数传递和语义保持正确。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 2 |
💬 仅评论


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.




【合入来源】
关联图模式 Issue:https://gitcode.com/Ascend/pytorch/issues/1978
移植来源:https://gitcode.com/Ascend/pytorch/merge_requests/40027
【修改方案】
在
torch_npu._inductor.dvm.config中增加enable_matmul_fusion。该开关默认关闭,仅在设置INDUCTOR_DVM_ENABLE_MATMUL_FUSION=1时注册 DVM matmul template lowering,未启用时保持原有 DVM/Inductor 路径不变。为
aten.mm、aten.bmm、aten.addmm与aten.baddbmm注册 DVM template lowering,并新增DvmTemplateBuffer保存 matmul template FX 图及逻辑 placeholder 到实际 IR 输入的绑定关系。生成 wrapper 调用前恢复真实参数;不满足 DVM shape/type 规则的场景继续走原有 fallback。保留
addmm的原始算子形态以进入 template lowering,补齐baddbmm的转置标注、图构建参数透传和 DVM codegen;保持addmm/baddbmm的alpha、beta语义。K=1 的mm、bmm下沉为逐元素mul,K=1 的addmm下沉为mul与add组合。在
NpuDvmScheduling的 template codegen 中复用NpuMetaScheduling的 traced-graph 构图与回退能力。DVM matmul template 仅支持合法 pointwise epilogue 的纵向融合;prologue、horizontal fusion、reduction、template-to-template、group/numel 不一致及不支持的 broadcast 场景均不融合。移除
_is_view_only_graph对纯view、reshape、_unsafe_viewepilogue 的额外拒绝逻辑,统一由既有 pointwise、shape、依赖和广播合法性检查决定是否进入 DVM template 融合路径。补充
mm、bmm、addmm、baddbmm的 template fusion 回归覆盖,并覆盖 K=1、multi-user 输出、view/view+pointwise epilogue、view 输入及同一 buffer 多 view 场景。【资料变更】
不涉及。
【接口变更】
不涉及客户可见接口变更。
【功能验证】
python3 -m py_compile,通过。git diff --check,通过。性能收益
该优化将 matmul 与下游 pointwise/view 融合为单个 DVM mix kernel,减少中间张量读写和 kernel launch。以下为 v2.9.0 同功能实测(端到端统计已排除首次编译与 warm-up):
GLM-4-9B Chat 对应吞吐约提升 9.34%。GPT-OSS-20B 的 device kernel duration 为 -0.62%,当前不作为性能收益结论。
详细测试配置与完整数据见:https://gitcode.com/Ascend/pytorch/merge_requests/40027
【CheckList】