已合并
test(fx): add DimConstraints API tests #38825
Goko创建于 6月18日
test(fx): add DimConstraints API tests #38825
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Goko 的贡献)6月18日 关联了issue:【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(7)
ascend-robot
6月18日 评论:
6月18日 评论:
6月18日 添加了label:ascend-cla/yes
ascend-robot
6月18日 评论:
6月18日 评论:
此处折叠了95条消息 查看更多
7月6日 添加了label:ci-pipeline-passed
ascend-robot
7月6日 评论:
7月6日 评论:
流水线 PR-pipeline_pytorch#41621 [ commitID:04bcbae7 ] 已完成
>>>代码风格自动修复执行成功(无修复内容)
| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | 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 | 🛑 | >>> | |
| UT_ARM_A2_Select_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Select_Part_02 | ✅ | >>> | |
| 流水线 | PR-pipeline_pytorch | ✅ | >>> |
- compile、compile_inductor、compile_torchair : 运行流水线
- retry : 重试流水线所有失败子任务
- retry <任务名> : 仅重试指定失败子任务
- stop : 停止流水线


ascend-robot
7月6日 评论:
7月6日 评论:
流水线 PR-pipeline_pytorch#41621 [ commitID:04bcbae7 ] 已完成
>>>代码风格自动修复执行成功(无修复内容)
| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | 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 | 🛑 | >>> | |
| UT_ARM_A2_Select_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Select_Part_02 | ✅ | >>> | |
| 流水线 | PR-pipeline_pytorch | ✅ | >>> |
- compile、compile_inductor、compile_torchair : 运行流水线
- retry : 重试流水线所有失败子任务
- retry <任务名> : 仅重试指定失败子任务
- stop : 停止流水线


7月6日 合入了pull request
ascend-robot
7月6日 评论:
7月6日 评论:
流水线 pytorch_gitcode_PR_multiVersion#11955 [ commitID:04bcbae7 ] 已完成


【合入来源】
【修改方案】
本 PR 属于 Torch-NPU API 一致性对齐任务中的测试用例补齐,目标分支为
v2.10.0,面向torch.fx.experimental.symbolic_shapes下 5 个关联 API 完成上游用例核查、Torch-NPU 现有覆盖复查、API 行为验证和 UT 看护补充。本 PR 仅修改:
最终变更为 85 行新增、0 行删除:新增 4 个直接 API 测试及对应英文说明注释,不修改
torch/fx/experimental/symbolic_shapes.py、torch_npu功能源码、原有测试逻辑或 API 对外语义。架构上下文说明
DimDynamic与DimConstraints属于 PyTorch FX / Dynamo 编译前端的符号形状基础设施。它们服务于动态图捕获、动态维度约束收集、SymPy 表达式求解、强制特化识别以及约束错误信息生成,不直接执行 Tensor 数值计算。验证对象包括
sympy.Symbol、FloorDiv、ConstantSource、torch.export.Dim和inspect.Signature。测试不创建 NPU Tensor、不调用 NPU 算子,也不做精度对比;重点是确认这些编译前端 API 在 v2.10.0 中可稳定调用并产生符合 PyTorch 语义的约束结果。上游社区测试情况与用例路线判断
上游源码与测试检索范围
由于开发环境访问 GitHub 不稳定,使用 PyTorch 的 Gitee 镜像进行版本化检索:
本 PR 重点检查官方
v2.10.0tag,并交叉检查v2.7.1、v2.9.0、v2.11.0、v2.12.0,确认 API 和测试路线在相邻版本中的延续情况。各版本源码torch/fx/experimental/symbolic_shapes.py均存在DimDynamic、DimConstraints.solve、forced_specializations、prettify_results和rewrite_with_congruences定义。官方测试目录执行的核心检索模式包括:
grep -rn "dim_constraints\.solve()" test --include="*.py" grep -rn "\.forced_specializations()" test --include="*.py" grep -rn "\.prettify_results" test --include="*.py" grep -rn "\.rewrite_with_congruences(" test --include="*.py" grep -rn "DimDynamic\." test --include="*.py"检索日志:
v2.10.0 上游检索结论
DimConstraints.forced_specializations.forced_specializations()的直接调用。DimConstraints.prettify_resultsDimConstraints.rewrite_with_congruencesDimConstraints.solvetest/test_dynamic_shapes.py:3028存在dim_constraints.solve()直接调用。DimDynamicDimDynamic.*直接使用。进一步查看
test/test_dynamic_shapes.py中solve()调用上下文后确认,该官方用例只构造 SymPy 表达式、DimConstraints、TensorPropertySource、LocalSource等元信息,并断言_static_results和_dynamic_results。用例不包含torch.randn、torch.tensor、.cuda()、.npu()、.to(device)、NPU 算子或 CPU/NPU 精度比较,所以不需要创建test_upstreamNPU 适配 patch。后续官方版本的交叉检索结论一致:
solve()和DimDynamic有直接覆盖,其余 3 个目标方法缺少直接测试,说明该路线并非 v2.10.0 的单版本偶然结果。Torch-NPU v2.10.0 已有测试、patch 与资料复查
在
upstream/v2.10.0的test、test_upstream、docs/zh/native_apis中进行了精确计数复查。日志:以下 4 个方法的结果均为:
粗检索曾在
test/unsupported_test_cases/.pytorch-disabled-tests*.json中命中test_dim_constraints_solve_full,但该条目只是禁用记录,不是测试实现;最终计数已排除 disabled JSON,避免把名称记录误判成已有测试或 patch。DimDynamic在 v2.10.0 的test中有 20 处命中;当前文件的 stateless/stateful symbolic context 测试已直接使用DUCK与INFER_STRIDE,所以不增加重复枚举测试。本次覆盖 API 的功能说明、完备性分析与用例开发思路
DimConstraints.rewrite_with_congruencess0的提示值为 5,输入FloorDiv(s0, 2);断言输出为s0 / 2 - 1/2,并检查记录Mod(s0 + 1, 2),同时覆盖返回值和 congruence 副作用。DimConstraints.solves0 >= 2求解,断言静态结果为空、动态结果为2 <= x;后续两个测试还调用solve()产生静态特化,交叉覆盖动态和静态路径。DimConstraints.forced_specializationsx、调试名dx和等式s0 == 4,求解后断言返回{"dx = x": 4},覆盖动态标记、来源映射和具体值输出。DimConstraints.prettify_resultsdynamic_shapes生成建议修复。inspect.signature、Dim("dx")和强制特化结果调用接口;分别断言特化标题、dx = x来源关系和dx = 4建议值,避免完整文本匹配造成脆弱测试。DimDynamicDYNAMIC、DUCK、STATIC、INFER_STRIDE,供符号上下文决定尺寸和步长动态性。DUCK、INFER_STRIDE直接测试。本 PR 新增 4 个直接测试;其中
solve被 3 个测试调用,forced_specializations被 2 个测试调用,并通过后续流程形成交叉验证。现有断言已覆盖关键输出和副作用,无需为数量增加重复测试或锁定更多私有细节。开发前行为探测与断言稳定性
编写测试前检查了实际 API 签名:
行为探测日志:
探测确认:提示值为 5 时
FloorDiv(s0, 2)可稳定改写为s0/2 - 1/2并记录Mod(s0 + 1, 2);下界约束可产生2 <= x;等式特化可返回{"dx = x": 4};格式化结果稳定包含特化标题、来源关系和dx = 4建议。断言只锁定稳定语义:
prettify_results检查三个关键子串,congruence 使用字符串集合比较,动态结果和强制特化字典采用精确断言,从而兼顾回归检测与跨版本维护性。v2.10.0 用例充分性与分支适用性判断
上游
solve()调用位于较大的 dynamic-shapes 流程中,主要验证整体约束生成结果;本 PR 的测试则直接构造最小DimConstraints对象,明确检查_static_results为空且_dynamic_results为{"2 <= x"}。二者关注层级不同:前者提供流程级回归,后者提供 API 级故障定位,因此不是简单重复。forced_specializations、prettify_results、rewrite_with_congruences在 v2.10.0 upstream 中没有直接调用,若只依赖间接流程,一旦返回映射、同余记录或提示文本发生回归,很难快速定位到具体接口。新增测试分别覆盖“求解后提取特化”“生成可读修复建议”“改写表达式并记录模关系”三类独立职责,已经覆盖各方法最核心的可观察行为。DimDynamic的情况相反:官方有 43 处直接使用,Torch-NPU v2.10.0 也已有 20 处相关命中,当前文件还直接验证DUCK和INFER_STRIDE。继续新增只枚举成员或重复字段保存的测试不会增加有效行为覆盖,因此采用已有用例看护。该取舍以缺口和行为分支为依据,而不是要求每个任务 API 都机械增加一个新函数。上述新增断言不依赖设备张量、随机数或硬件执行结果,输入完全确定;同时避免比较
prettify_results的完整长文本。因而用例能够在 v2.10.0 分支稳定运行,也便于后续版本沿用。具体修改内容
本 PR 新增以下测试方法:
具体实现:
_congruences记录;ConstantSource("x")建立符号到来源的映射,验证范围约束求解后进入_dynamic_results;source_name_to_debug_name={"x": "dx"}验证强制特化输出同时保留调试名、source 和具体值;inspect.signature与torch.export.Dim构造动态形状输入,验证说明文本包含原因和可执行修复建议;适配方案说明
API 适配方案
5 个目标 API 在源码和验证环境中均可正常导入、构造和调用,未发现缺失实现、签名不一致、返回语义异常或 NPU 设备相关错误。因此本 PR 不修改 API 实现、枚举成员和求解逻辑,只增加测试看护。
用例适配方案
对无上游直接用例的 3 个方法采用自写轻量测试;对已有 upstream 调用但无需设备迁移的
solve,不创建无实际内容的test_upstreampatch,而是在现有 API 测试文件中增加聚焦断言;对 upstream 与 Torch-NPU 都已有直接覆盖的DimDynamic不重复开发。用例统一放在
test/fx/test_symbolic_shapes_api.py。该文件已集中看护DimConstraints、SymbolicContext 和 ShapeEnv,可复用现有构造与断言模式。【资料变更】
不涉及。
本 PR 只补充
test/fx/test_symbolic_shapes_api.py的 UT,不修改docs/zh/native_apis。测试补齐不改变接口支持状态、签名、调用方式或用户可见行为;资料支持度更新应按任务要求由独立资料变更处理,不与本测试 PR 混合。【接口变更】
不涉及。
本 PR 未修改函数、类、枚举、参数列表、返回值或跨仓调用关系,仅新增测试断言和说明注释,不产生客户面可见接口变化。
【功能验证】
验证环境
完整 UT 验证
为避免从源码目录误导入未编译的
torch_npu,从/tmp执行完整测试文件:cd /tmp /workspace/user_data/venvs/torch-npu-py312/bin/python \ /workspace/user_data/pytorch/test/fx/test_symbolic_shapes_api.py最终结果:
结果说明:完整测试文件中的 20 个测试全部通过,其中包括本 PR 新增的 4 个
DimConstraints直接测试以及文件中原有的 SymbolicContext、ShapeEnv 等回归用例。本地安装运行时与目标分支均为 torch 2.10.0,完整测试文件未出现版本兼容失败;平台 CI 也在匹配 v2.10.0 的分支构建环境中完成验证。测试日志:
差异与平台检查
本地执行:
cd /workspace/user_data/pytorch git diff --check结果:
同一日志同时确认注释变更为 8 行新增、0 行删除,测试文件不存在空白符错误。提交与推送后,本地 commit 与个人 fork 远端 commit 一致。
v2.10.0 最新提交:
平台验证结果:PR #38825 的 compile、UT/测试和代码规范检查均已通过。该结果确认新增测试能够在真实 v2.10.0 分支构建环境中运行,并且本 PR 未引入代码格式、依赖或编译回归。
【CheckList】