Pull Request已成功合入, 合并人@ascend-robot
(感谢 dezheng889 的贡献)变更摘要
此 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_expand、view_fold_pass、fold_reduce、cat_to_view_pass、repeat_to_expand_pass、dtype_optimal_pass、fold_iota_arithmetic_pass、pad_slice_fold、cat_slice_cat_fold_pass、fold_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提供TestSymbolicShapeUtil、TestDynamicShapePasses、TestSwitchAndStaticRegression三个测试类,覆盖三值逻辑正确性、各优化遍在动态形状下的折叠与不折叠边界、开关关闭后的降级行为以及静态形状回归验证。


代码审查
审查总结
我对全部 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 |
⛔ 需要修改


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




【合入来源】
【修改方案】
【资料变更】
【接口变更】
【功能验证】
【CheckList】