已合并
[test] ShapeEnv APIs NPU兼容性验证与资料更新 #36139
Yhw050920创建于 5月19日
[test] ShapeEnv APIs NPU兼容性验证与资料更新 #36139
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Yhw050920 的贡献)5月19日 关联了issue:【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(21)
ascend-robot
5月19日 评论:
5月19日 评论:
ascend-robot
5月19日 评论:
5月19日 评论:
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月19日 添加了label:ascend-cla/no
此处折叠了277条消息 查看更多
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#9773 [ commitID:16ebb22d ] 运行失败


【合入来源】
【修改方案】
本 PR 在仓库已有
test/fx/test_symbolic_shapes.py(torch.fx.experimental.symbolic_shapes模块测试)中增补TestShapeEnvNPU,对 issue #1627 要求的 ShapeEnv 守卫与符号表 API 在 Ascend NPU(v2.7.1) 上做单元验证,写法与文件内现有TestSymbolicShapes一致(TestCase+run_tests())。合入目标分支:
v2.7.1(MR 36139)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(文件名无法体现测试模块)。2. 目标 API 功能说明(全称,v2.7.1 测试范围)
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.set_unbacked_var_to_val_shape_env_set_unbacked_var_to_val_works()探测,不可用时skip)torch.fx.experimental.symbolic_shapes.ShapeEnv.simplify未纳入本 PR 测试:
ShapeEnv.add_backed_var_to_val3. 用例设计与开发思路
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是否导出可调用方法,用于能力探测的前置检查。_produce_guards_verbose_works()Source()试调produce_guards_verbose;若抛NotImplementedError/TypeError(2.7.1 CI wheel 实测 bareSource()无法满足name),则整用例 SKIP,避免误报 FAIL。_shape_env_set_unbacked_var_to_val_works()set_unbacked_var_to_val(create_unbacked_symint(), 4);若 2.7.1 上触发TypeError: non-nested SymInt(SymInt 不能作 dict key),则 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。原因:2.7.1 预装 PyTorch 中,裸
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)
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。原因:2.7.1 上
create_unbacked_symint()返回的 SymInt 在unbacked_var_to_val内部作 dict key 时触发non-nested SymInt,为上游已知限制;用例保留以便高版本 wheel 探测通过后自动变为 PASS。(5)
simplifyenv = ShapeEnv(),a, b = sympy.symbols("a b");assertEqual(env.simplify((a + b) - b), a)—— 验证典型化简(a+b)-b → a。3.4 未覆盖 API 的说明
add_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)由 MR 36144 单独提交。【资料变更】
不涉及。API 支持度表格更新由配套资料 PR 单独合入,本 PR 仅负责 v2.7.1 测试补齐。
【接口变更】
不涉及。未修改跨仓或用户可见接口行为。
【功能验证】
测试环境
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.7.1 目标分支)
ShapeEnv.produce_guards_expressionShapeEnv.produce_guards_verboseSource()无法满足name,2.7.1 CI 实测)ShapeEnv.replaceShapeEnv.set_unbacked_var_to_valnon-nested SymInt报错)ShapeEnv.simplify合计:5 个用例,3 PASS + 2 SKIP
自验证
test_torch_fx_experimental_symbolic_shapes_ShapeEnv_*的 PASS/SKIP 状态。【CheckList】