已合并
[test] ShapeEnv APIs NPU兼容性验证与资料更新 #36204
Yhw050920创建于 5月20日
[test] ShapeEnv APIs NPU兼容性验证与资料更新 #36204
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Yhw050920 的贡献)5月20日 关联了issue:【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(21)
ascend-robot
5月20日 评论:
5月20日 评论:
ascend-robot
5月20日 评论:
5月20日 评论:
Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| test | ✅ 李伟, sunyu-xuan (2/2) | ✅ 李伟 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
hongwei-2026, thanks for your pull request. All authors of the commits have signed the CLA. 👍


5月20日 添加了label:ascend-cla/no
此处折叠了227条消息 查看更多
sunyu-xuan
5月30日 评论:
5月30日 评论:
/lgtm


6月1日 添加了label:approvedlgtm
6月1日 合入了pull request
ascend-robot
6月1日 评论:
6月1日 评论:
流水线 pytorch_gitcode_PR_multiVersion#9777 [ commitID:651e0005 ] 已完成


【合入来源】
【修改方案】
本 PR 在仓库已有
test/fx/test_symbolic_shapes.py(torch.fx.experimental.symbolic_shapes模块测试)中增补TestShapeEnvNPU,对 issue #1627 要求的 ShapeEnv 守卫与符号表 API 在 Ascend NPU(v2.12.0) 上做单元验证,写法与文件内现有TestSymbolicShapes一致(TestCase+run_tests())。合入目标分支:
v2.12.0(MR 36204)1. 上游社区与仓库现有测试情况
test/fx/test_symbolic_shapes.pyis_accessor_node、is_concrete_*、is_symbolic;已使用ShapeEnvtest/fx/test_symbolic_shapes_api.pydefinitely_true、DimConstraints等其它 symbolic_shapes APItest/dynamo/test_export.py、test/dynamo/test_misc.pyShapeEnvtest/fx/test_fx_passes.py等结论:需在
test_symbolic_shapes.py中补齐 ShapeEnv 守卫类 API 在 NPU 上的直接单测;不新增test_cases.py(文件名无法体现测试模块,评审已明确要求合并至本文件)。实现方式与已通过评审修订的 MR 36139、MR 36201、MR 36202、MR 36203 保持一致。2. 目标 API 功能说明(全称,v2.12.0 测试范围)
torch.fx.experimental.symbolic_shapes.ShapeEnv.produce_guards_expressiontorch.fx.experimental.symbolic_shapes.ShapeEnv.produce_guards_verboseSource生成更详细的守卫信息_produce_guards_verbose_works()端到端探测,不可用时skip)torch.fx.experimental.symbolic_shapes.ShapeEnv.replacetorch.fx.experimental.symbolic_shapes.ShapeEnv.add_backed_var_to_val_shape_env_has()检测)torch.fx.experimental.symbolic_shapes.ShapeEnv.set_unbacked_var_to_val_shape_env_set_unbacked_var_to_val_works()探测,不可用时skip)torch.fx.experimental.symbolic_shapes.ShapeEnv.simplify3. 用例设计与开发思路
3.1 总体原则
torch.fx.experimental.symbolic_shapes,仓库中test/fx/test_symbolic_shapes.py已是该模块的 NPU 测试入口(现有TestSymbolicShapes测谓词与 accessor)。本 PR 在同一文件新增TestShapeEnvNPU,与现有类并列,避免另起test_cases.py导致模块不可见。test_torch_fx_experimental_symbolic_shapes_ShapeEnv_<api>,与 API 全称一一对应,便于 CI 报告、issue 追溯与后续扩展。@unittest.skipUnless(torch.npu.is_available(), "requires npu"),与仓库内其它 FX NPU 测试一致,确保仅在 Ascend 环境执行。@unittest.skipUnless+ 模块级探测函数 在收集阶段决定 SKIP。3.2 公共辅助逻辑
_shape_env_with_fake_placeholders(shape=(3, 4))ShapeEnv(),绑定FakeTensorMode(shape_env=env),在 NPU 上from_tensor得到占位 FakeTensor,返回(env, [fake_tensor])。模拟 dynamo/FX 导出中最常见的「带符号形状的 NPU 占位输入」路径。_shape_env_has(name)ShapeEnv是否导出可调用方法;用于add_backed_var_to_val等 2.11.0+ 新增 API 的存在性检查。_produce_guards_verbose_works()Source()试调produce_guards_verbose;若抛NotImplementedError/TypeError(2.12.0 CI wheel 实测 bareSource()无法满足name),则整用例 SKIP。_shape_env_set_unbacked_var_to_val_works()set_unbacked_var_to_val(create_unbacked_symint(), 4);若触发TypeError: non-nested SymInt,则 SKIP。3.3 分 API 用例设计
(1)
produce_guards_expressionenv, placeholders = _shape_env_with_fake_placeholders()(NPU 上(3,4)随机张量);guards = env.produce_guards_expression(placeholders);assertIsInstance(guards, str)—— 返回值类型正确即可证明 API 在 NPU 路径下可调用、可完成守卫生成。(2)
produce_guards_verboseSource列表时,ShapeEnv 能否生成更详细的守卫信息。sources = [Source()] * len(placeholders);guards = env.produce_guards_verbose(placeholders, sources);assertIsNotNone(guards)。_produce_guards_verbose_works()为 False。原因:裸
Source()未实现完整name链,调用会NotImplementedError;属上游/测试桩限制,不代表 NPU 后端缺陷,故 SKIP 而非 FAIL。(3)
replaceenv = ShapeEnv(),a, b = sympy.symbols("a b"),expr = a + b;assertEqual(env.replace(expr), expr)—— 无替换规则时恒等,验证 API 可调用且代数语义一致。(4)
add_backed_var_to_val(2.11.0+ 覆盖)env = ShapeEnv(),backed_sym = sympy.Symbol("test_backed_1");env.add_backed_var_to_val(backed_sym, 10)—— 无异常即通过。_shape_env_has("add_backed_var_to_val")为 False(CI wheel 尚未导出该方法)。(5)
set_unbacked_var_to_valenv = ShapeEnv(),sym = env.create_unbacked_symint();env.set_unbacked_var_to_val(sym, 4)—— 无异常即通过。_shape_env_set_unbacked_var_to_val_works()为 False。原因:
create_unbacked_symint()返回的 SymInt 在内部作 dict key 时可能触发non-nested SymInt,为上游已知限制(2.9~2.12 CI 类似);用例保留以便 wheel 修复后自动 PASS。(6)
simplifyenv = ShapeEnv(),a, b = sympy.symbols("a b");assertEqual(env.simplify((a + b) - b), a)—— 验证典型化简(a+b)-b → a。3.4 版本分支覆盖策略(与低版本 MR 的差异)
produce_guards_expression/replace/simplifyproduce_guards_verbose/set_unbacked_var_to_valadd_backed_var_to_val3.5 与现有
TestSymbolicShapes的关系TestSymbolicShapes:覆盖is_accessor_node、is_concrete_*、is_symbolic等谓词/图节点行为,仅少量ShapeEnv().create_unbacked_*用于构造符号值。TestShapeEnvNPU(本 PR):覆盖 ShapeEnv 实例方法(守卫生成、符号绑定、sympy 改写),补齐同一模块下另一类 API。run_tests()入口,不互相依赖,可单独跑TestShapeEnvNPU或全文件。3.6 运行与 CI 对接
if __name__ == "__main__": run_tests(),与test/nn/test_nn_api.py等仓库惯例一致。test/fx/test_symbolic_shapes.py,流水线会跑:cd test && python fx/test_symbolic_shapes.py -v4. 变更范围
test/fx/test_symbolic_shapes.py(单文件),不修改业务代码与用户可见接口。torch-fx.md)由 docs MR 单独提交。【资料变更】
不涉及。API 支持度表格更新由配套资料 PR 单独合入,本 PR 仅负责 v2.12.0 测试补齐。
【接口变更】
不涉及。未修改跨仓或用户可见接口行为。
【功能验证】
测试环境
ascend-pytorch-*流水线为准)测试命令
在仓库
test目录下执行(与 CI 一致):cd test python fx/test_symbolic_shapes.py -v TestShapeEnvNPU或运行该文件全部用例:
cd test python fx/test_symbolic_shapes.py -v预期结果(PyTorch 2.12.0 目标分支)
ShapeEnv.produce_guards_expressionShapeEnv.produce_guards_verboseSource()无法满足name,2.12.0 CI 预期)ShapeEnv.replaceShapeEnv.add_backed_var_to_valShapeEnv.set_unbacked_var_to_valnon-nested SymInt报错)ShapeEnv.simplify合计:6 个用例;典型为 3~4 PASS + 2~3 SKIP(视
add_backed是否导出)自验证
test_torch_fx_experimental_symbolic_shapes_ShapeEnv_*的 PASS/SKIP 状态。【CheckList】