已关闭
test: adapt ShapeEnv proxy tensor upstream tests #36418
小辉懂编程创建于 5月21日关闭于 5月22日
test: adapt ShapeEnv proxy tensor upstream tests #36418
已关闭
小辉懂编程创建于 5月21日关闭于 5月22日
小辉懂编程
5月21日

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

Torch-NPU ShapeEnv API 补齐任务。

PyTorch v2.11.0 官方社区在 test/test_proxy_tensor.py 中已有相关测试用例,覆盖以下 ShapeEnv API:

  • torch.fx.experimental.symbolic_shapes.ShapeEnv.produce_guards
  • torch.fx.experimental.symbolic_shapes.ShapeEnv.get_nontrivial_guards

Torch-NPU 当前 v2.11.0 分支下 test_upstream/test/ 目录中没有对应的 test_proxy_tensor.py.patch,因此本 PR 新增 upstream patch 文件,将 PyTorch 官方社区已有用例适配到 Torch-NPU 的 NPU 测试场景。

本 PR 属于:

1.1 pytorch 官方社区有用例,并且需要做 NPU 适配
1.1.1 torch-npu 社区 test_upstream 无 patch

【修改方案】

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

本 PR 新增文件:

test_upstream/test/test_proxy_tensor.py.patch

具体修改内容如下:

  1. 在 PyTorch 官方测试文件 test/test_proxy_tensor.py 中补充 import torch_npu。
  2. 将 _trace helper 中构造的输入 Tensor 从 CPU Tensor 改为 NPU Tensor:
    • torch.randn(arg) -> torch.randn(arg).npu()
  3. 将 TestSymbolicTracing.test_mega_guard 中的输入 Tensor 改为 NPU Tensor:
    • torch.randn(16) -> torch.randn(16).npu()
    • torch.randn(8) -> torch.randn(8).npu()
  4. 通过官方已有测试覆盖 ShapeEnv.produce_guards 和 ShapeEnv.get_nontrivial_guards 在 NPU Tensor 输入场景下的行为。

一、API 功能

1. torch.fx.experimental.symbolic_shapes.ShapeEnv.produce_guards

该 API 用于根据 ShapeEnv 中记录的符号形状约束生成 guards 表达式,用于保证后续运行时输入形状满足 tracing 阶段建立的符号约束。

在 symbolic tracing 场景下,当输入 Tensor 的 shape 被符号化后,produce_guards 会根据符号变量、输入来源以及约束关系生成运行时检查条件。

2. torch.fx.experimental.symbolic_shapes.ShapeEnv.get_nontrivial_guards

该 API 用于获取 ShapeEnv 中非平凡的 guards,用于判断当前符号形状环境中是否存在需要保留的动态形状约束。

在部分 shape 等价或可化简场景下,如果所有 guards 都可以被消除或证明为平凡条件,则 get_nontrivial_guards 应返回空结果。

二、官方测试用例完整性分析

PyTorch v2.11.0 官方测试文件:

test/test_proxy_tensor.py

已经包含对上述 API 的测试覆盖。

1. ShapeEnv.produce_guards

官方用例:

TestSymbolicTracing.test_mega_guard

该用例通过 symbolic tracing 构造动态 shape 约束:

if a.shape[0] != b.shape[0] * 2:
    raise AssertionError("a.shape[0] should equal b.shape[0] * 2")

随后调用:

fx_g.shape_env.produce_guards(...)

并通过 assertExpectedInline 验证生成的 guards 内容符合预期。

因此,该用例可以覆盖 ShapeEnv.produce_guards 的核心功能,即根据 symbolic shape 约束生成运行时 guards。

2. ShapeEnv.get_nontrivial_guards

官方 helper:

_assert_no_guards

其中调用:

fx_g.shape_env.get_nontrivial_guards()

并断言当前场景下不存在非平凡 guards。

官方用例:

TestSymbolicTracing.test_guards_equal

该用例通过多个 symbolic tracing 场景调用 _assert_no_guards,包括:

  1. 多个输入 Tensor shape 完全相等的场景。
  2. 广播相关 shape 场景。
  3. torch.cat 组合 shape 场景。
  4. view / sum 等 shape 传播场景。

这些场景验证了在 shape 约束可以被化简或无需保留非平凡 guards 时,ShapeEnv.get_nontrivial_guards 能正确返回空 guards。

3. 完整性结论

综上,PyTorch v2.11.0 官方用例已经覆盖:

API 官方测试用例
ShapeEnv.produce_guards TestSymbolicTracing.test_mega_guard
ShapeEnv.get_nontrivial_guards _assert_no_guards / TestSymbolicTracing.test_guards_equal

因此,本 PR 不重复新增自写测试,而是按照 Torch-NPU 的 test_upstream 机制,对 PyTorch 官方已有用例进行 NPU 适配。

三、NPU 适配

3.1 API 适配

不需要修改 API 实现。

ShapeEnv.produce_guards 和 ShapeEnv.get_nontrivial_guards 属于 symbolic shape / guard 管理相关的 Python 层逻辑,主要负责符号形状约束生成、查询和化简。

这两个 API 不涉及:

  1. NPU kernel 实现。
  2. NPU 显存管理。
  3. NPU stream / event。
  4. 分布式通信算子。
  5. 设备侧数值计算逻辑。

因此,本次不需要修改 API 源码实现。

3.2 测试用例适配

需要适配测试输入 Tensor 的设备。

PyTorch 官方用例默认使用 CPU Tensor,例如:

torch.randn(arg)
torch.randn(16)
torch.randn(8)

为了在 Torch-NPU 场景下验证 symbolic tracing 和 ShapeEnv guards 行为,本 PR 将相关输入 Tensor 改为 NPU Tensor:

torch.randn(arg).npu()
torch.randn(16).npu()
torch.randn(8).npu()

同时补充:

import torch_npu

以确保 NPU 后端可用。

【资料变更】

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

不涉及。

本 PR 仅新增 upstream 测试适配 patch,不修改文档资料。

【接口变更】

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

不涉及。

本 PR 不新增、不删除、不修改 Python API 或 C++ 接口,仅新增测试适配 patch。

【功能验证】

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

1. patch dry-run 验证

已执行以下命令验证 patch 可以正确应用到 PyTorch v2.11.0 官方测试文件:

patch --dry-run -p1 -d /workspace/user_data/pytorch_official_v2.11.0 < test_upstream/test/test_proxy_tensor.py.patch

验证结果:

checking file test/test_proxy_tensor.py
Hunk #2 succeeded at 997 (offset -1 lines).
Hunk #3 succeeded at 1868 (offset -2 lines).

验证结论:

patch dry-run 执行成功,未出现 hunk failed,说明 test_upstream/test/test_proxy_tensor.py.patch 可以正确应用到 PyTorch v2.11.0 官方 test/test_proxy_tensor.py 文件。

2. 关联测试覆盖

本 PR 适配 PyTorch 官方已有测试:

test/test_proxy_tensor.py::TestSymbolicTracing::test_mega_guard
test/test_proxy_tensor.py::TestSymbolicTracing::test_guards_equal

【CheckList】

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

关联 PR

v2.11.0 自写测试 PR:

https://gitcode.com/Ascend/pytorch/pull/36403

v2.10.0 同类 upstream patch PR:

https://gitcode.com/Ascend/pytorch/pull/36396

v2.9.0 同类 upstream patch PR:

https://gitcode.com/Ascend/pytorch/pull/36369
likedislike
当前Pull Request已关闭, 关闭人@小辉懂编程
小辉懂编程小辉懂编程
5月21日 创建了 pull request,commit 1881b99f
openLiBingCI成员5月21日进行代码检视1
test_upstream/test/test_proxy_tensor.py.patch
@@ -0,0 +27,2 @@
27+ from torch._dynamo.source import LocalSource
28+ self.assertExpectedInline(
29+ str(fx_g.shape_env.produce_guards(fx_placeholder_vals(fx_g), [LocalSource("a"), LocalSource("b")], ignore_static=False)), # noqa: B950
openLiBingCI5月21日评论:

此条代码评论区间+27至+29

【openlibing.ci】识别到代码检查告警抑制注释,匹配工具:flake8,请Committer检视其合理性。

likedislike
ascend-robot
ascend-robot成员
5月21日 评论:

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

⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)

Module Approval Details

module lgtm status approve status
test_upstream ❌ (0/2)(You can also ask: wangqiang160, liujunzhu, pengjingyou, wasd1111222, suhaibo) ❌ (0/1)(You can also ask: wangqiang160, 李伟, wasd1111222, medivh-x, htchu)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

gehui-2026, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
ascend-robotascend-robot成员
5月21日 添加了label:ascend-cla/yes
ascend-robot
ascend-robot成员
5月21日 评论:

当前仓库存在以下 保护分支 :

Protected Branch Version Release
master
v2.9.0
v2.11.0
v2.10.0
v2.7.1
v2.12.0

评论 /sync <branch1> <branch2> ... 可将当前 PR 修改同步到其它分支(创建同步 PR):
a) 如果当前 PR 是 Open 状态,同步操作将延迟到 PR 被合并时执行
b) 如果当前 PR 已经 Merged,将立即执行同步操作

注意:

  1. /sync 命令可以指定同步到多个分支,仅最后一个 /sync 命令生效
  2. 如果创建的同步 PR 不正确,可通过向同步 PR 的源分支提交轻量级 PR 完善,或使用 /close 命令关闭
likedislike
小辉懂编程
小辉懂编程
5月21日 评论:

compile

likedislike
ascend-robotascend-robot成员
5月21日 添加了label:ci-pipeline-running
ascend-robot
ascend-robot成员
5月21日 评论:

Ascend docs pipeline is running...

likedislike
ascend-robotascend-robot成员
5月21日 添加了label:docs-ci-pipeline-running
ascend-robot
ascend-robot成员
5月21日 评论:

Ascend docs pipeline is running...

likedislike
ascend-robot
ascend-robot成员
5月21日 评论:

✅ 跳过 docs ci 检查,没有需要检查的文档文件

likedislike
ascend-robotascend-robot成员
5月21日 删除了label:docs-ci-pipeline-running
ascend-robotascend-robot成员
5月21日 添加了label:docs-ci-pipeline-success
ascend-robot
ascend-robot成员
5月21日 评论:

✅ 跳过 docs ci 检查,没有需要检查的文档文件

likedislike
ascend-robotascend-robot成员
5月21日 删除了label:ci-pipeline-running
ascend-robotascend-robot成员
5月21日 添加了label:ci-pipeline-passed
ascend-robot
ascend-robot成员
5月21日 评论:
流水线 PR-pipeline_pytorch#24935 [ commitID:d79602db ] 已完成
阶段 任务名 状态 详情
编译构建 Build_X86 ✅ >>>
Build_ARM ✅ >>>
Build_LibTorch_x86 ✅ >>>
Build_LibTorch_ARM ✅ >>>
Build_X86_torchair 🛑 >>>
Build_ARM_torchair 🛑 >>>
patch_test ✅ >>>
恶意代码检查 Antipoison ✅ >>>
编码安全与规范检查 CodeCheck ✅ >>>
check_error ✅ >>>
CodeCheck_lintrunner ✅ >>>
开源片段检查 SCA ✅ >>>
开发者测试 UT_X86_Part_01 🛑 >>>
UT_X86_Part_02 🛑 >>>
UT_ARM_A3_Part_01 🛑 >>>
UT_ARM_A3_Part_02 🛑 >>>
UT_ARM_A2_Part_01 ✅ >>>
UT_ARM_A2_Part_02 ✅ >>>
UT_ARM_A2_Part_03 ✅ >>>
UT_inductor_Part_01 🛑 >>>
UT_inductor_Part_02 🛑 >>>
UT_inductor_Part_03 🛑 >>>
UT_inductor_Part_04 🛑 >>>
UT_DIST_ARM_Part_01 🛑 >>>
UT_DIST_ARM_Part_02 🛑 >>>
UT_DIST_ARM_Part_03 🛑 >>>
UT_DIST_ARM_Part_04 🛑 >>>
流水线 PR-pipeline_pytorch ✅ >>>
此流水线已支持下列评论快捷指令,仅PR创建者评论有效
  • compile : 运行流水线
  • retry : 重试流水线所有失败子任务
  • retry <任务名> : 仅重试指定失败子任务
  • stop : 停止流水线
likedislike
小辉懂编程小辉懂编程
5月22日 关闭了 pull request