已合并
feat(inductor): support dynamic shapes in ascend custom graph passes #42443
feat(inductor): support dynamic shapes in ascend custom graph passes #42443
已合并
dezheng889创建于 7月22日
dezheng889成员
7月22日

【合入来源】

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

【修改方案】

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

【资料变更】

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

【接口变更】

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

【功能验证】

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

【CheckList】

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

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

变更摘要

此 PR 为 Ascend 自定义图优化遍(ascend_custom_passes)引入动态形状支持:新增 symbolic_shape_util 工具模块提供三值逻辑(静态真/静态假/不可判定)的符号维度推理能力,并将原有各图优化遍中基于纯 int 的形状比较、范围检查和维度物化逻辑替换为基于该模块的符号感知版本,同时通过环境变量 NPU_INDUCTOR_DYNAMIC_FX_PASS 提供总开关以支持降级回静态行为。配套新增了设备无关的单元测试覆盖符号工具函数和各优化遍的动态/静态/开关边界场景。

主要改动

  • 新增 symbolic_shape_util 模块:提供 statically_known_eq/statically_known_geq/statically_known_leq/is_statically_one 等三值逻辑谓词,resolve_size_arg/resolve_size_list 大小参数归一化,materialize_shape 符号形状物化(将 SymInt 转为 aten.sym_size.int 节点),statically_fits_int32 值范围判定,refresh_fake_meta 假量元数据刷新,以及 dynamic_fx_pass_enabled 总开关函数。

  • 各图优化遍全面适配符号维度:在 ascend_graph_pass.py 中,fold_expandview_fold_passfold_reducecat_to_view_passrepeat_to_expand_passdtype_optimal_passfold_iota_arithmetic_passpad_slice_foldcat_slice_cat_fold_passfold_sink_view 等遍均将原有的 int 直接比较改为 shapes_statically_equal / statically_known_eq 等三值谓词调用,get_node_shape 调用统一传递 allow_symbolic=True

  • get_binary_fold_result.py 符号化改造get_node_shape 新增 allow_symbolic 参数控制是否允许返回含 SymInt 的形状;_fold_slice_fold_slice_scatter 使用 resolve_size_arg 和静态比较谓词替代 isinstance(…, int) 检查;get_pad_dim_and_size 使用 statically_known_eq/statically_known_gt 处理填充参数中的符号边界。

  • 移除本地重复的静态/假量工具:从 ascend_graph_pass.py 中移除了本地的 _refresh_fake_meta_INT32_MIN/_INT32_MAX_prims_iota_value_range(替换为 _prims_iota_endpoints)以及 import math,统一收敛到 symbolic_shape_util 模块。

  • 新增设备无关单元测试test_dynamic_shape_fx_passes.py 提供 TestSymbolicShapeUtilTestDynamicShapePassesTestSwitchAndStaticRegression 三个测试类,覆盖三值逻辑正确性、各优化遍在动态形状下的折叠与不折叠边界、开关关闭后的降级行为以及静态形状回归验证。

likedislike
atomgit-bot
atomgit-bot
7月22日 评论:

代码审查

审查总结

我对全部 4 个变更文件逐一进行了审查:

文件 审查结果
torch_npu/_inductor/fx_passes/utils/symbolic_shape_util.py 无问题 — 三值逻辑、归一化、物化、值域分析均正确实现,降级路径(switch-off)安全
torch_npu/_inductor/fx_passes/utils/get_binary_fold_result.py 无问题get_node_shape 双轨模式正确;_fold_slice / _fold_slice_scatter / get_pad_dim_and_size 符号化改造逻辑等价且更安全
torch_npu/_inductor/fx_passes/ascend_custom_passes/ascend_graph_pass.py 1 个 P3 低置信度发现_prims_iota_endpoints 对符号化零长度序列的处理存在语义缺口(无实际危害)
test/_inductor/test_dynamic_shape_fx_passes.py 无问题 — 测试覆盖三值逻辑、pass 行为、边界保护、开关退化,结构清晰

发现统计

  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 1(低置信度,极难触发,无实际危害)

整体风险评估:此变更质量较高。核心改造路径(从静态 int 比较迁移到三值符号判定)在每一处都保持了保守性——不可判定时拒绝优化而非误折叠。NPU_INDUCTOR_DYNAMIC_FX_PASS 开关提供了完整的回退路径。cat_slice_cat_fold_pass 中补充的末端完整覆盖证明还修复了原静态实现的一个潜在漏判。未发现 P0–P2 级别的正确性、安全性或可靠性问题。

类型 数量
🔴 阻塞 1
🟡 建议 0

⛔ 需要修改

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

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月23日 评论:
流水线 pytorch_gitcode_PR_multiVersion#13057 [ commitID:9599fe0e ] 已完成
likedislike