已合并
test: 新增torch.fx.experimental.symbolic_shapes NPU 适配验证与统一运行脚本 #35209
test: 新增torch.fx.experimental.symbolic_shapes NPU 适配验证与统一运行脚本 #35209
已合并
yuhongming-2026创建于 5月10日
yuhongming-2026
5月10日

【合入来源】

https://gitcode.com/Ascend/pytorch/issues/1611
请勿携带内部流程信息(需求链接、问题单、内部issue等)


【背景与目标】

完善 Torch-NPU 对 PyTorch 原生 FX symbolic shapes 相关 API 的兼容性验证,覆盖以下 5 个 API 在 NPU 环境下的可用性,提升昇腾 NPU 上 PyTorch 框架的易用性与模型适配覆盖率。

API 说明
torch.fx.experimental.symbolic_shapes.compute_unbacked_bindings 计算 unbacked symint 绑定关系
torch.fx.experimental.symbolic_shapes.constrain_range 对符号量施加范围约束
torch.fx.experimental.symbolic_shapes.constrain_unify 统一两个符号量约束
torch.fx.experimental.symbolic_shapes.ConvertIntKey Dynamo 图转换中的 int key 转换器
torch.fx.experimental.symbolic_shapes.ConvertIntKey.get 根据 bool 条件获取对应 int key

【上游社区支持情况】

项目 结论
是否属于上游 PyTorch API 是,均位于 torch.fx.experimental.symbolic_shapes,为纯 Python 实现,不依赖 CUDA 专用算子
上游是否提供公开 API 是,constrain_range / constrain_unify 等已列入公开 API allowlist(如 test/allowlist_for_publicAPI.json
上游是否有相关用例 部分有。上游在 test/dynamo/test_misc.py 等文件中调用 constrain_rangeconstrain_unifycompute_unbacked_bindingsConvertIntKeyConvertIntKey.get 在基线 test/ 中缺少直接用例
上游用例能否直接证明 NPU 支持 不能单独证明。上游现有调用主要覆盖 CPU/CUDA 或通用语义,未覆盖 NPU tensor 输入、torch.npu.device 上下文、由 NPU tensor 比较派生 bool 路径
本 PR 的补充价值 在 Ascend NPU 上新增专项兼容性测试,补齐上游“部分覆盖/场景不足”导致的 NPU 侧验证缺口

结论: 5 个 API 属于上游能力范围,但测试覆盖对 NPU 场景不完整(部分 API 无直接用例、部分 API 缺少 NPU关键路径)。本 PR 新增用例用于补齐 Torch-NPU 侧可验证性。本 MR 不修改文档资料。


【修改方案】

1. API功能

  1. torch.fx.experimental.symbolic_shapes.compute_unbacked_bindings
    计算 unbacked SymInt 的绑定关系。本 PR 验证该接口在 NPU tensor 输入、NPU 上下文与 .to("npu") 迁移路径下可稳定调用。

  2. torch.fx.experimental.symbolic_shapes.constrain_range
    为符号值施加范围约束。本 PR 验证正常分支、异常分支以及 NPU 上下文调用行为。

  3. torch.fx.experimental.symbolic_shapes.constrain_unify
    对两个符号值进行约束统一。本 PR 验证正常/异常分支及 NPU 上下文下的可用性。

  4. torch.fx.experimental.symbolic_shapes.ConvertIntKey
    将布尔条件映射为整型 key 的转换器。本 PR 验证实例化与基础映射能力。

  5. torch.fx.experimental.symbolic_shapes.ConvertIntKey.get
    根据 bool 条件返回对应 int key(True->1,False->0)。本 PR 重点验证字面量 bool 和 NPU tensor 比较派生 bool 两类输入。

2. 新增 NPU 兼容性测试

新增 test/fx/test_fx_experimental_symbolic.py,写法与同目录 FX 测试一致(TestCase + run_tests,默认 NPU 环境可用)。

用例 覆盖 API / 场景
test_compute_unbacked_bindings compute_unbacked_bindings + NPU tensor 输入
test_compute_unbacked_bindings_npu_context compute_unbacked_bindings + torch.npu.device(0) 上下文
test_compute_unbacked_bindings_to_npu compute_unbacked_bindings + .to("npu") 路径
test_constrain_range constrain_range 基本调用与异常分支
test_constrain_range_npu_context constrain_range + NPU device 上下文
test_constrain_unify constrain_unify 基本调用与异常分支
test_constrain_unify_npu_context constrain_unify + NPU device 上下文
test_convert_int_key_singleton ConvertIntKey 实例化
test_convert_int_key_get_bool ConvertIntKey.get(True/False)
test_convert_int_key_get_npu_derived ConvertIntKey.get + 由 NPU tensor 比较得到的 bool
test_convert_int_key_npu_context ConvertIntKey.get + NPU device 上下文

场景覆盖说明:

  • compute_unbacked_bindings:NPU 张量、device 上下文、.to("npu") 迁移路径(3 类主路径)
  • constrain_range / constrain_unify:正常调用、异常分支、NPU 上下文(与上游 dynamo 通用语义用例互补)
  • ConvertIntKey / .get:实例化、字面量 bool、NPU 派生 bool、device 上下文(4 类主路径)

2.1 新增用例必要性与完整性分析

  1. 针对 compute_unbacked_bindings
    上游基线 test/ 缺少面向 NPU tensor 的直接用例;本 PR 覆盖 device="npu".to("npu")torch.npu.device(0) 三类主路径,补齐验证闭环。

  2. 针对 constrain_range / constrain_unify
    上游 test/dynamo/test_misc.py 已有调用,但主要是 Python int + fallback 语义验证;本 PR 增加 NPU 上下文与异常分支验证,属于互补增强,不与上游重复。

  3. 针对 ConvertIntKey / ConvertIntKey.get
    上游基线 test/ 缺少这组 API 的直接测试,尤其缺失“由 NPU tensor 比较结果派生 bool 后调用 get()”路径;本 PR 新增专项用例为必要补齐。

  4. 结论:
    本 PR 的新增测试属于“对上游部分覆盖场景做 NPU 侧补齐 + 对上游缺失场景补空白”,不是重复建设。

3. 多版本分支合入(如适用)

按 Ascend PyTorch 版本线分别提 MR,每个 MR 仅 1 个 squash 提交:

目标分支 MR
v2.7.1 https://gitcode.com/Ascend/pytorch/pull/35207
v2.9.0 https://gitcode.com/Ascend/pytorch/pull/35208
v2.10.0 https://gitcode.com/Ascend/pytorch/pull/35209
v2.11.0 https://gitcode.com/Ascend/pytorch/pull/35210
v2.12.0 https://gitcode.com/Ascend/pytorch/pull/35552
master https://gitcode.com/Ascend/pytorch/pull/35211

若当前 MR 仅针对单一版本分支,可删除上表中与本 MR 无关的行。


【资料变更】

不涉及,测试 PR 本身不直接修改资料文件;资料补齐由配套资料 PR 单独提交。
本 PR 仅负责测试补齐与验证,确保测试范围与当前版本实际能力一致。


【接口变更】

不涉及(无新增/修改对外 C++ 或 Python 接口,仅新增测试)


【功能验证】

1. 测试环境

  • 设备: Ascend NPU(如 Ascend910B4)
  • 框架: 对应分支 Torch-NPU + PyTorch
  • 说明: 测试默认 NPU 可用,不额外做 torch.npu.is_available() 跳过逻辑

2. 测试命令

cd <pytorch-repo-root>
python test/fx/test_fx_experimental_symbolic.py

3. 测试结果

e8c4c6730960b2e315f5b5e9b2f9d6d4.png

4. 与上游用例的关系

验证维度 上游现有用例 本 PR 新增用例
constrain_range / constrain_unify 调用 test/dynamo/test_misc.py 等(通用语义) 增加 NPU 上下文与异常分支验证
NPU tensor + compute_unbacked_bindings 无直接用例 已覆盖(NPU输入/上下文/迁移路径)
NPU 上 ConvertIntKey.get(含 NPU 派生 bool) 无直接用例 已覆盖
NPU 侧验证闭环 不完整 本 PR 补齐

【CheckList】

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 yuhongming-2026 的贡献)
yuhongming-2026yuhongming-2026
5月10日 创建了 pull request,commit 24f9dad5
yuhongming-2026yuhongming-2026
5月10日 关联了issue:【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(5)
ascend-robot
ascend-robot成员
5月10日 评论:

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 /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

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

likedislike
ascend-robotascend-robot成员
5月10日 添加了label:ascend-cla/yes
此处折叠了147条消息 查看更多
liwei386成员
5月27日 评论:

/approve

likedislike
ascend-robotascend-robot成员
5月27日 添加了label:approvedlgtm
ascend-robot
ascend-robot成员
5月27日 评论:

Review Guide

This pull-request passes review.
Committers who wrote a comment of /approve are: 李伟.
Reviewers who wrote a comment of /lgtm are: 李伟, sunyu-xuan.

likedislike
ascend-robotascend-robot成员
5月27日 合入了pull request
ascend-robot
ascend-robot成员
5月27日 评论:
流水线 pytorch_gitcode_PR_multiVersion#9456 [ commitID:3bbfe94d ] 已完成
likedislike