已合并
feat(inductor): partition FA v3 TND+dropout via inductor pattern matcher #35040
feat(inductor): partition FA v3 TND+dropout via inductor pattern matcher #35040
已合并
luochao60创建于 5月8日
luochao60成员
5月8日

【合入来源】

(如有)请关联需求文档/issue链接
关联 issue: #2010 (https://gitcode.com/Ascend/pytorch/issues/2010)

【修改方案】

请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列
如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)

将 FA v3(npu_fusion_attention_v3 / npu_fusion_attention_grad_v3)在 TND 布局 + dropout (keep_prob < 1) 场景下"不可被 ACLgraph 捕获"的处理路径,由 monkey-patch inductor 内部 _fx_node_is_input_dependent_cudagraph_unsafe 的方案,重构为基于 inductor PatternMatcherPass + POST_GRAD_PATTERNS 的合入方式。

  1. 新增 torch_npu/_inductor/fx_passes/_proxy_ops.py

    • 通过 torch.library.Library("npu", "FRAGMENT") 克隆原算子 schema,注册 npu_fusion_attention_v3_unsafe / npu_fusion_attention_grad_v3_unsafe 两个代理算子,并在 schema 上挂 torch._C.Tag.cudagraph_unsafe
    • 代理算子的 CompositeExplicitAutograd 实现与 register_fake 实现都直接转发到原算子(FA v3 的输入混合 NPU q/k/v 与 CPU actual_seq_qlen/kvlen,复用原算子的 device-propagation 规则)。
    • 暴露 PROXY_TARGETS: dict[OpOverload, OpOverload] 供 pass 使用。
  2. 新增 torch_npu/_inductor/fx_passes/fav3_partition_pass.py

    • PatternMatcherPass(pass_name="fav3_partition") 注册 forward / backward 两条 CallFunctionVarArgs(target) 规则。
    • extra_check 中通过 torch.fx.operator_schemas.normalize_function 拿到归一化 kwargs,仅在 input_layout == "TND"keep_prob < 1 时命中;同时在 inductor_config.triton.cudagraphs 关闭时直接 short-circuit,避免无意义的 dispatcher 跳转。
    • handler 仅做 node.target = proxy,不引入新的 fx 节点;scheduler 之后会按 cudagraph_unsafe tag 把这些节点切出 captured graph 走 eager。
    • register_fav3_partition_pass()__init__.py 中调用一次:将 PMP 挂到 POST_GRAD_PATTERNS["fav3_partition"],并 setdefault 写入 post_grad_fusion_options
  3. 调整 torch_npu/_inductor/__init__.py

    • 移除对已废弃的 patch_fx_node_is_input_dependent_cudagraph_unsafe 的导入与调用。
    • 新增 register_fav3_partition_pass() 调用,与 register_fa_pass() 等其他 inductor 扩展挂载点放在一起。
  4. 清理 torch_npu/_inductor/utils.py

    • 删除 _fx_node_is_input_dependent_cudagraph_unsafepatch_fx_node_is_input_dependent_cudagraph_unsafe(旧 monkey-patch 实现),逻辑已由新 pass 覆盖。

【资料变更】

请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写"不涉及"

不涉及

【接口变更】

请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写"不涉及"

不涉及。新增的 npu::npu_fusion_attention_v3_unsafe / npu::npu_fusion_attention_grad_v3_unsafe 仅作为 inductor 图改写的内部代理算子,行为完全转发至原 FA v3 算子,不对外暴露给用户脚本调用;patch_fx_node_is_input_dependent_cudagraph_unsafe 是 inductor 内部的 monkey-patch 入口,非客户面接口。

【功能验证】

说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤
新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图

新增 UT:test/_inductor/test_fav3_partition_pass.py(225 行)覆盖以下场景:

  • TND + dropout 场景下 FA v3 fwd/bwd 节点的 target 被正确改写为代理算子。
  • BSND/BSH 等其他 layout、keep_prob == 1.0 等不命中场景保持原 target 不变。
  • 代理算子转发到原算子的数值一致性验证。
  • inductor_config.triton.cudagraphs 关闭时 pass 不生效的 short-circuit 行为。

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 luochao60 的贡献)
Lluochao60成员
5月8日 创建了 pull request,commit 8703ccbb
ascend-robot
ascend-robot成员
5月8日 评论:

Ascend docs pipeline is running...

likedislike
ascend-robotascend-robot成员
5月8日 添加了label:docs-ci-pipeline-running
Lluochao60成员
5月8日 预合并成功(commit_id: 278a5f2400643ae279aed51ed83ef3ab6912a02f)
Lluochao60成员
5月8日 强制推送  402 个提交:8703ccbb-401 commits from branch masterad350e3e-feat(inductor): partition FA v3 TND+dropout via inductor pattern matcher
此处折叠了203条消息 查看更多
ascend-robot
ascend-robot成员
16 天前 评论:

The MR can not be merged, because of CodeReview discussion not resolved

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
Lluochao60成员
16 天前 解决了最后一个问题
ascend-robotascend-robot成员
16 天前 合入了pull request
ascend-robot
ascend-robot成员
16 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
AtlasAccount
AtlasAccount成员
16 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#14738 [ commitID:f55781f1 ] 已完成
likedislike