已合并
[Inductor] Symbolic dynamic-shape grouping for reductions #42292
[Inductor] Symbolic dynamic-shape grouping for reductions #42292
已合并
dezheng889创建于 7月21日
dezheng889成员
7月21日

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)

【修改方案】

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

【资料变更】

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

【接口变更】

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

【功能验证】

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

【CheckList】

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

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 dezheng889 的贡献)
Ddezheng889成员
7月21日 创建了 pull request,commit b04c8c22
atomgit-bot
atomgit-bot
7月21日 评论:

变更摘要

此 PR 为昇腾 NPU Inductor 后端的 reduction 算子引入了符号动态形状的分组(grouping)支持。核心思路是:当 reduction 轴为动态(符号)维度时,将其保持为纯循环/分块轴(grid=1),而非拆分为跨程序 grid 轴,从而避免缺少跨核 combine 导致的结果覆盖问题;同时按运行时 reduction 大小进行分桶(bucketing),并为每个桶调优 R0BLOCK_SUB。这一改动使单 kernel 通过 tail mask 循环处理运行时 numel,匹配 CUDA 的 single-kernel 路径,并减少了不必要的回退到 community simt 路径。

主要改动

  • 1D 动态 reduction 保持 split=1(torch_npu/_inductor/ir.py:在 num_splits 中新增对 1D 符号 reduction 轴的特殊判断,当 reduction_ranges 仅有一个符号维度时返回 split=1,使该 reduction 保持单一 Reduction 节点而非退化出多层 split。
  • split_axis 决策中排除 1D 动态 reduction 轴(torch_npu/_inductor/codegen/split_tiling.py:在 select_split_axis 末尾增加 is_1d_dynamic_reduction 检测,对于单一符号 reduction 轴、标量输出的情况,不再将其加入 split_axis,确保 grid=1 从而避免部分结果覆盖标量输出。
  • 新增 _dynamic_reduction_tiling_axis 与分组特征构建重构(split_tiling.py:新增方法识别无 grid split 轴的单一动态 reduction 分块轴;_build_group_features 中仅对实际包含动态轴的组生成分桶特征(_REDUCTION_BUCKETS / _OUTER_BUCKETS),避免全静态组产生不可达的 group id。_build_grouped_meta 重构为处理两种场景:有动态 split 轴的常规路径,以及无动态 split 轴时按 reduction 分块轴分桶的路径。
  • 动态 reduction 线性化路径优化(torch_npu/_inductor/codegen/ir.py:新增 is_linear_dynamic_reduction 函数,检查 indexing 中是否存在符号边界的 ModularIndexing/FloorDiv;在 transform_dims_in_indexing 中,对 A5 平台的动态形状不再一律回退到 community simt,而是先判断是否可线性化——若线性化可行则继续走 simt_template 路径,仅不可线性化时才回退。
  • 新增动态形状 1D sum 测试(test/_inductor/test_sum.py:添加 test_sum_1d_dynamic_shapetest_sum_1d_dynamic_shape_group_autotune 两个测试用例,覆盖跨分桶边界的多种动态尺寸,验证单 kernel 在 dynamic=True 及开启 enable_symbolic_shape_group_autotune 下的正确性。
likedislike
atomgit-bot
atomgit-bot
7月21日 评论:

代码审查

审查总结

本次 diff 共审查 4 个文件,以下是审查结论:

文件 结果
test/_inductor/test_sum.py 发现 1 个 P3 建议
torch_npu/_inductor/codegen/ir.py 无问题
torch_npu/_inductor/codegen/split_tiling.py 发现 2 个 P3 建议
torch_npu/_inductor/ir.py 无问题

按优先级统计:

  • P0:0
  • P1:0
  • P2:0
  • P3:3

总体风险评估:低。 该变更逻辑设计合理、边界条件处理周全。核心流程(num_splitsselect_split_axis_build_grouped_meta_build_group_features)对 1D 动态 shape reduction 的处理一致且正确:split 被抑制(num_splits 返回 split=1)、reduction 轴不被设为 grid split 轴(grid==1),reduction tiling 轴通过 bucketed autotune 按运行时大小调整 R0BLOCK_SUBis_linear_dynamic_reduction 作为乐观守卫与 Step 3 的 can_split_all 最终安全检查形成双层防护。3 个 P3 建议均为次要改进(未使用参数、类型检查一致性、测试容差),不影响正确性或安全性。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
ascend-robotascend-robot成员
7月21日 添加了label:ascend-cla/yes
此处折叠了111条消息 查看更多
ascend-robotascend-robot成员
7月24日 添加了label:approved
ascend-robotascend-robot成员
7月24日 关闭了关联的issue
ascend-robotascend-robot成员
7月24日 合入了pull request
ascend-robot
ascend-robot成员
7月24日 评论:

Pull Request 已合并或已关闭。

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

likedislike
ascend-robot
ascend-robot成员
7月24日 评论:
流水线 pytorch_gitcode_PR_multiVersion#13119 [ commitID:ecd51d93 ] 已完成
likedislike