文件最后提交记录最后更新时间
Add ShapeEnv symbolic shapes API tests Co-authored-by: nannan-2026<1794949109@qq.com> # message auto-generated for no-merge-commit merge: !36575 merge test-shape-env-symbolic-shapes-master into master Add ShapeEnv symbolic shapes API tests Created-by: nannan-2026 Commit-by: nannan-2026 Merged-by: ascend-robot Description: # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 关联 issue:https://gitcode.com/Ascend/pytorch/issues/1622 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 本 PR 针对 torch.fx.experimental.symbolic_shapes.ShapeEnv 相关 PyTorch 原生 API 在 master 分支补充 Torch-NPU 侧本地专项测试用例,覆盖如下 API: - torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symboolnode - torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symfloatnode 本 PR 仅涉及测试用例补齐,不修改 torch_npu/ 功能代码,不新增 NPU 算子实现,不改变现有 API 行为。 说明: - master 分支不提交 test_upstream patch; - 对于已有 PyTorch 上游社区用例的 API,相关 test_upstream patch 已在 release 分支提交; - 本 PR 仅针对 PyTorch 上游社区缺少充分、直接专项验证的 API 新增本地测试文件。 ## 一、API 功能说明 1. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symboolnode 该 API 用于根据 symbolic boolean expression 创建 torch.SymBool,用于表达符号化布尔条件。 2. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symfloatnode 该 API 用于根据 symbolic float expression 创建 torch.SymFloat,用于表达符号化浮点值。 ## 二、上游社区用例分析与用例补齐说明 经检索 PyTorch 上游社区测试用例,本次 issue 中部分 API 已存在上游测试覆盖,部分 API 缺少充分、直接的专项验证。 1. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symbolic_sizes_strides_storage_offset PyTorch 上游社区已有相关测试,位于 test/dynamo/test_misc.py。该 API 的上游用例 NPU 适配已通过 release 分支的 test_upstream patch 提交。根据要求,master 分支不提交 test_upstream patch。 2. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unbacked_symbool PyTorch 上游社区已有相关测试,位于 test/dynamo/test_misc.py。该 API 的上游用例 NPU 适配已通过 release 分支的 test_upstream patch 提交。根据要求,master 分支不提交 test_upstream patch。 3. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symintnode PyTorch 上游社区已有相关测试,位于 test/test_python_dispatch.py。该 API 的上游用例 NPU 适配已通过 release 分支的 test_upstream patch 提交。根据要求,master 分支不提交 test_upstream patch。 4. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symboolnode 经检索,PyTorch 上游社区中未发现该 API 充分、直接的专项验证用例。 5. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symfloatnode 经检索,PyTorch 上游社区中未发现该 API 充分、直接的专项验证用例。 因此,本 PR 在 master 分支新增本地专项测试文件: - test/fx/experimental/test_symbolic_shapes.py 用于集中验证 torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symboolnodetorch.fx.experimental.symbolic_shapes.ShapeEnv.create_symfloatnode 的基础行为和 NPU 侧兼容性。 ## 三、test_upstream patch 说明 本 PR 为 master 分支测试 PR,不涉及 test_upstream patch。 原因如下: 1. master 分支根据任务要求不提交 test_upstream patch; 2. 对于已有 PyTorch 上游社区测试覆盖的 API,test_upstream patch 已分别提交到 release 分支; 3. 本 PR 仅新增本地测试文件,验证上游社区缺少充分直接测试的 ShapeEnv.create_symboolnodeShapeEnv.create_symfloatnode。 因此,本 PR 不包含以下文件: - test_upstream/test/dynamo/test_misc.py.patch - test_upstream/test/test_python_dispatch.py.patch ## 四、新增测试文件说明 本 PR 新增测试文件: - test/fx/experimental/test_symbolic_shapes.py 该文件用于集中验证 torch.fx.experimental.symbolic_shapes.ShapeEnv 相关 API 的基础兼容性。文件开头已补充英文说明,说明该文件用于补充 ShapeEnv symbolic shape API 的 NPU 侧验证用例,并可继续扩展同类 API 测试。 文件开头说明如下: """ Add validation cases for torch.fx.experimental.symbolic_shapes.ShapeEnv APIs on NPU: 1. PyTorch community lacks sufficient and direct API validations for these APIs, so this file is added. 2. This file validates ShapeEnv.create_symboolnode and ShapeEnv.create_symfloatnode. 3. This file is extendable for other torch.fx.experimental.symbolic_shapes.ShapeEnv APIs. """ 新增测试覆盖以下场景: 1. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symboolnode 基础行为验证 通过 NPU Tensor 的 shape metadata 构造 symbolic expression,调用 ShapeEnv.create_symboolnode 创建 torch.SymBool,并验证返回类型和布尔结果。 2. torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symfloatnode 基础行为验证 通过 NPU Tensor 的 shape metadata 构造 symbolic expression,调用 ShapeEnv.create_symfloatnode 创建 torch.SymFloat,并验证返回类型和具体数值结果。 ## 五、NPU 适配说明 本次涉及的 API 均属于 torch.fx.experimental.symbolic_shapes.ShapeEnv Python 层 symbolic shape 相关接口,不涉及新增 NPU 算子实现,也不涉及 C++、Kernel 或底层算子逻辑修改。 但测试用例中涉及 Tensor,因此需要确保测试 Tensor 运行在 NPU / 当前 accelerator 侧。 新增本地测试文件中使用如下方式获取当前 accelerator: device_type = acc.type if (acc := torch.accelerator.current_accelerator()) else "cpu" 并通过如下方式将测试 Tensor 迁移到当前设备: tensor = torch.ones(2, 3).to(device_type) 在 Torch-NPU 测试环境中,当前 accelerator 为 NPU,因此测试 Tensor 会通过 .to(device_type) 迁移到 NPU 侧运行,满足新增用例涉及 Tensor 必须运行在 NPU 侧的要求。 ## 六、涉及版本说明 本次用例补齐分别提交到以下目标分支: - v2.7.1 - v2.9.0 - v2.10.0 - v2.11.0 - v2.12.0 - master 各版本均单独提交 PR,目标分支与源码分支一一对应。 本 PR 为 master 分支对应的测试 PR。 说明: 1. release 分支提交 test_upstream patch 和本地测试; 2. master 分支不提交 test_upstream patch,仅提交本地测试; 3. 文档资料补齐通过单独文档 PR 提交到 v2.7.1 分支; 4. 本次根据当前任务要求提交上述分支,不涉及 v2.8.0 分支。 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及。 本 PR 仅补齐 master 分支本地测试用例,不直接修改 docs/zh/native_apis 资料文档。 资料支持情况已同步检查: 1. 本次涉及的 API 均属于 torch.fx.experimental.symbolic_shapes.ShapeEnv 下的 Python 层 symbolic shape 相关接口; 2. 经检查,相关 API 在 docs/zh/native_apis 中需要补充支持状态记录; 3. 本测试 PR 仅负责补齐 test/fx/experimental/test_symbolic_shapes.py 测试用例,不直接修改资料文档; 4. 相关 API 的 docs/zh/native_apis 支持状态通过单独资料 PR 补充; 5. 文档 PR 仅提交到 v2.7.1 分支,并刷新 docs/zh/native_apis 下要求版本的 API 支持状态。 配套文档 PR: - 待补充:Add ShapeEnv symbolic shapes API documentation # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及。 本 PR 不修改客户可见接口,不修改 API 行为,仅新增测试用例验证现有 API 兼容性。 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 新增测试内容: - test/fx/experimental/test_symbolic_shapes.py 测试场景: 1. 验证 torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symboolnode 可基于 NPU Tensor shape metadata 创建 torch.SymBool; 2. 验证 torch.fx.experimental.symbolic_shapes.ShapeEnv.create_symfloatnode 可基于 NPU Tensor shape metadata 创建 torch.SymFloat; 3. 验证新增测试中涉及的 Tensor 已通过 .to(device_type) 迁移到当前 accelerator / NPU 侧运行; 4. 验证该组 Python 层 symbolic shape API 不需要新增 NPU kernel 实现即可在 Torch-NPU 环境中完成基础行为验证。 本地验证命令: cd /tmp python /root/torch_npu_api_task/pytorch-master/test/fx/experimental/test_symbolic_shapes.py 本地验证结果: .. ---------------------------------------------------------------------- Ran 2 tests in 1.251s OK 说明: 该组 API 为 torch.fx.experimental.symbolic_shapes.ShapeEnv Python 层 symbolic shape 相关接口,不涉及 NPU 算子计算。本次测试主要验证 API 功能行为与 PyTorch 原生保持一致,同时确保测试中涉及的 Tensor 运行在当前 accelerator / NPU 侧。 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!365754 天前
!9513 [UT] Add official test cases for fx modules. Merge pull request !9513 from 王夏夏/master 2 年前
!9513 [UT] Add official test cases for fx modules. Merge pull request !9513 from 王夏夏/master 2 年前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
test(fx): add tests for graph codegen api Co-authored-by: nannan-2026<1794949109@qq.com> # message auto-generated for no-merge-commit merge: !34465 merge test-fx-codegen-api-master into master test(fx): add tests for graph codegen api Created-by: nannan-2026 Commit-by: nannan-2026 Merged-by: ascend-robot Description: # 【合入来源】 - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 关联 issue:https://gitcode.com/Ascend/pytorch/issues/1637 # 【修改方案】 本 PR 新增 torch.fx 代码生成相关 API 的单元测试,覆盖如下 API: - torch.fx.Graph.python_code - torch.fx.graph.PythonCode - torch.fx.Graph.set_codegen 具体修改内容: 1. 新增 test/test_fx_codegen_api.py 测试文件。 2. 增加 test_graph_python_code_returns_python_code 用例,验证 Graph.python_code("self") 返回对象类型为 PythonCode,并校验返回对象包含 srcglobals 字段。 3. 增加 test_graph_set_codegen 用例,验证 Graph.set_codegen 设置自定义 CodeGen 后,GraphModule 可重新编译并正常执行。 4. 该组 API 属于 torch.fx Python 层代码生成接口,不涉及新增 NPU 算子实现。 # 【资料变更】 不涉及。 本 PR 仅新增测试用例,不修改资料文档。如后续确认 torch.fx.graph.PythonCode 在 native_apis 文档中缺失,将单独提交 docs PR 补充。 # 【接口变更】 不涉及。 本 PR 不修改客户可见接口,不修改 API 行为,仅新增测试用例验证现有 API 兼容性。 # 【功能验证】 测试场景: 1. 验证 torch.fx.Graph.python_code 可正常生成 PythonCode。 2. 验证 torch.fx.graph.PythonCode 对象包含 srcglobals 字段。 3. 验证 torch.fx.Graph.set_codegen 设置自定义 CodeGen 后,GraphModule 可重新编译并正常执行。 测试命令: TORCH_DEVICE_BACKEND_AUTOLOAD=0 python test/test_fx_codegen_api.py -v 测试结果: test_graph_python_code_returns_python_code (__main__.TestFXCodegenAPI.test_graph_python_code_returns_python_code) ... ok test_graph_set_codegen (__main__.TestFXCodegenAPI.test_graph_set_codegen) ... ok Ran 2 tests in 0.168s OK 说明: 该 API 为 torch.fx Python 层代码生成接口,不涉及 NPU 算子计算。本次测试主要验证 API 功能行为与 PyTorch 原生保持一致。 # 【CheckList】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!3446522 天前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
docs(torch.fx): 完善 experimental.symbolic_shapes 文档与测试用例 Co-authored-by: yuhongming-2026<moshui_1@qq.com> # message auto-generated for no-merge-commit merge: !35211 merge add-fx-experimental-symbolic-api-test-master into master test: 新增torch.fx.experimental.symbolic_shapes NPU 适配验证与统一运行脚本 Created-by: yuhongming-2026 Commit-by: yuhongming-2026 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**https://gitcode.com/Ascend/pytorch/issues/1611**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] 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. 测试命令 ```bash cd <pytorch-repo-root> python test/fx/test_fx_experimental_symbolic.py ``` ### 3. 测试结果 ![e8c4c6730960b2e315f5b5e9b2f9d6d4.png](https://raw.gitcode.com/user-images/assets/7404318/f7574f98-7ad8-4010-a336-3f0ec94be838/e8c4c6730960b2e315f5b5e9b2f9d6d4.png '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】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!352116 天前
[test] add tests for torch.fx Graph APIs Co-authored-by: lihaokun-2026<851563813@qq.com> # message auto-generated for no-merge-commit merge: !34399 merge add-fx-graph-api-test-master into master [test] add tests for torch.fx Graph APIs Created-by: lihaokun-2026 Commit-by: lihaokun-2026 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > [【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(30) #1636](https://gitcode.com/Ascend/pytorch/issues/1636) > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 本次提交对应 Torch-NPU API 补齐任务,涉及以下 5 个 API: - torch.fx.Graph.output_node - torch.fx.Graph.placeholder - torch.fx.Graph.print_tabular - torch.fx.Graph.process_inputs - torch.fx.Graph.process_outputs # 【修改方案】 1. 对目标 API 进行现状核查,确认在当前Pytorch环境中已实际支持,不需要补齐底层实现。 2. 补充独立测试文件test/fx/test_fx_graph.py文件。 3. 采用最小化修改方案,不改动已有底层实现,仅补齐测试覆盖。 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 测试场景: 1. torch.fx.Graph的5个API进行验证 2. NPU 设备下 tensor shape 场景验证 测试方法: ``` cd /data TORCH_DEVICE_BACKEND_AUTOLOAD=1 /usr/local/python3.11.14/bin/python3 /data/pytorch/test/fx/test_fx_graph.py -v ``` # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(30) [#1636](https://gitcode.com/Ascend/pytorch/issues/1636) See merge request: Ascend/pytorch!3439922 天前
test(fx): add NPU tests for torch.fx graph APIs Co-authored-by: zhouzirui1234<2490136803@qq.com> # message auto-generated for no-merge-commit merge: !35521 merge intern/fx-graph-api-tests-master into master test(fx): add NPU tests for torch.fx graph APIs Created-by: zhouzirui-2026 Commit-by: zhouzirui1234 Merged-by: ascend-robot Description: # 【合入来源】 - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 关联 issue: - 任务 issue:https://gitcode.com/Ascend/pytorch/issues/1634 # 【修改方案】 本 PR 新增 test/fx/test_fx_graph_api.py,补充 torch.fx Graph 相关 API / 内部 codegen 链路在 NPU 环境下可直接运行的轻量验证用例。测试中涉及 Tensor 的输入均通过 .to(device_type) 放到当前 accelerator 上执行。 任务 API 功能及上游社区用例情况如下: | API / 内部链路 | 功能说明 | 上游社区用例情况 | 本 PR 处理 | | --- | --- | --- | --- | | torch.fx.Graph.inserting_after | 设置 FX Graph 插入点,使后续新节点插入到指定节点之后。 | PyTorch 上游 test/quantization/fx/test_model_report_fx.py::TestFxModelReportDetectDynamicStatic.test_nested_detection_case 中有使用,但该用例在当前 Kunpeng/ARM 环境会因 FBGEMM 条件被 skip,无法直接进入目标主体。 | 参考上游构图方式,新增轻量 NPU 测试直接验证插入顺序、节点参数传递和 NPU 执行结果。 | | torch.fx.Graph.inserting_before | 设置 FX Graph 插入点,使后续新节点插入到指定节点之前。 | PyTorch 上游 test/test_fx.py::TestFX.test_insertion_point 已有直接用例。目标 API 本身不依赖 libtorchbind_test.so,但当前环境直接运行相关 TestFX 用例时会在测试初始化阶段受该依赖缺失影响,尚未进入目标 API 测试主体即失败。 | 抽取上游用例核心逻辑新增独立轻量 NPU 测试,验证插入顺序、参数重写和 NPU 执行结果。 | | torch.fx.Graph.lint | 校验 FX Graph 结构合法性,包括节点拓扑顺序、引用关系、owner、target 等约束。 | PyTorch 上游 test/test_fx.py 已有直接专项测试,例如 TestFX.test_wrong_topoTestFX.test_copy_no_remap。 | 不重复新增 lint 专项测试;本 PR 仅在新增测试中调用 graph.lint() 校验所构造图的合法性。 | | torch.fx.graph.magic_methods.format | torch.fx.graph 内部 codegen 模板链路,用于生成 magic method 对应的 Python 表达式。 | 未找到针对 magic_methods.format 的直接专项测试;PyTorch 上游 test/test_fx.py::TestFX.test_fx_shifts 通过 shift 表达式覆盖相关 FX codegen 链路。 | 新增 NPU 测试,通过 symbolic_trace 验证 Proxy 节点生成、节点参数、codegen 文本和 NPU 执行结果。 | | torch.fx.graph.inplace_methods.format | torch.fx.graph 内部 inplace codegen 模板链路,用于生成 inplace 操作对应的 Python 代码。 | 未找到针对 inplace_methods.format 的直接专项测试;PyTorch 上游 test/test_fx.py::TestFX.test_imul_code_print 通过 operator.imul 覆盖相关 FX inplace codegen 链路。 | 新增 NPU 测试,手动构造 operator.imul 节点触发 a *= b codegen,并验证节点参数、输出结果和输入 Tensor 原地更新。 | 主要开发思路: 1. 先复查 PyTorch 上游社区用例,确认 5 个任务 API / 内部链路的已有覆盖情况。 2. 对 torch.fx.Graph.lint,上游已有直接专项测试,因此本 PR 不重复新增 lint 测试。 3. 对 torch.fx.Graph.inserting_after,上游 quantization 用例会因当前 Kunpeng/ARM 环境不支持 FBGEMM 被 skip,因此参考其插入点使用方式新增轻量测试。 4. 对 torch.fx.Graph.inserting_before,PyTorch 上游 test/test_fx.py::TestFX.test_insertion_point 已有直接 API 用例。但 test/test_fx.py 是上游 FX 综合测试大文件,当前 Kunpeng/ARM + torch-npu 验证环境中直接运行该 TestFX 用例时,会在测试初始化阶段受 libtorchbind_test.so 缺失影响,尚未进入目标 API 主体即失败。并且上游原用例主要验证 Python FX 图结构行为,不能直接证明 torch-npu 侧 NPU Tensor 执行链路。因此,本 PR 抽取 TestFX.test_insertion_point 的核心验证逻辑,新增独立轻量测试,验证节点插入顺序、relu.args 参数重写、节点 target,并使用 .to(device_type) 的 NPU Tensor 执行 GraphModule 校验结果。 5. 对 torch.fx.graph.magic_methods.formattorch.fx.graph.inplace_methods.format,未找到针对 .format 调用本身的显式专项测试;仅在 test/test_fx.py::TestFX.test_fx_shiftsTestFX.test_imul_code_print 中找到相关 FX codegen 链路覆盖。因此,本 PR 针对这两个内部 codegen 模板链路新增独立轻量测试,并补充 NPU Tensor 执行验证。 本 PR 覆盖以下 4 个新增测试目标项: | API / 内部链路 | 验证内容 | | --- | --- | | torch.fx.Graph.inserting_after | 验证 FX Graph 插入点设置后,新节点可插入到指定节点之后,并校验节点顺序、节点参数传递、节点 target 以及 NPU 执行结果。 | | torch.fx.Graph.inserting_before | 验证 FX Graph 插入点设置后,新节点可插入到指定节点之前,并校验节点顺序、节点参数传递、节点 target 以及 NPU 执行结果。 | | torch.fx.graph.magic_methods.format | 通过 symbolic_trace 触发 Proxy 生成链路,验证 operator.lshift / operator.rshift 节点生成、参数传递、生成代码格式以及 NPU 执行结果。 | | torch.fx.graph.inplace_methods.format | 手动构造 operator.imul FX 节点,验证 inplace codegen 生成 a *= b、节点参数传递、NPU 执行结果以及输入 Tensor 被原地更新。 | 本 PR 不新增 torch.fx.Graph.lint 专项测试,原因如下: 1. 复查 PyTorch 官方 test/test_fx.pytorch.fx.Graph.lint 已有直接专项测试覆盖,例如 TestFX.test_wrong_topoTestFX.test_copy_no_remap 等。 2. 本 PR 新增的 4 个测试中也在构造或 trace 完 FX Graph 后调用 graph.lint(),用于校验测试图结构合法性,但不把它作为本 PR 的新增目标 API。 新增测试文件: ```text test/fx/test_fx_graph_api.py ``` 新增测试方法: ```text test_graph_inserting_after test_graph_inserting_before test_magic_methods_format_codegen test_inplace_methods_format_codegen ``` 各测试核心验证点如下: | 测试方法 | 核心验证点 | | --- | --- | | test_graph_inserting_after | 构造 placeholder -> neg -> relu -> output;使用 graph.inserting_after(neg);断言 relu 紧跟 neg;断言 neg.args == (x,)relu.args == (neg,)relu.target == torch.relu;在 NPU Tensor 上执行 GraphModule 并校验结果。 | | test_graph_inserting_before | 先构造 placeholder -> relu -> output;使用 graph.inserting_before(relu) 插入 neg;断言 neg 位于 relu 前且相邻;断言 neg.args == (x,)relu.args == (neg,)neg.target == torch.neg;在 NPU Tensor 上执行 GraphModule 并校验结果。 | | test_magic_methods_format_codegen | 使用 symbolic_trace trace x << 3, x >> 3;断言 FX Graph 中生成 operator.lshift / operator.rshift 节点;断言节点参数为 (x_node, 3);断言 codegen 包含 x << 3x >> 3;在 NPU LongTensor 上执行并校验结果。 | | test_inplace_methods_format_codegen | 手动构造 operator.imul(a, b) 节点;断言节点参数和 target;断言 codegen 包含 a *= b;在 NPU Tensor 上执行并校验输出结果,同时校验输入 Tensor 被原地更新。 | # 【资料变更】 当前不涉及资料补齐 PR。三个公开 torch.fx.Graph.* API 已在 docs/zh/native_apis 中记录;两个 torch.fx.graph.*.format 项为内部 codegen 字典模板链路,不宜按普通公开 API 强行补入 native API 表。 # 【接口变更】 不涉及。 # 【功能验证】 执行命令: ```bash cd /root python /workspace/pytorch/test/fx/test_fx_graph_api.py ``` 执行结果: ```text .... ---------------------------------------------------------------------- Ran 4 tests in 7.673s OK ``` 最终验证结论: 1. 本 PR 新增 4 个轻量 NPU 测试,覆盖 inserting_afterinserting_beforemagic_methods.formatinplace_methods.format。 2. 新增测试不仅验证 API 调用不崩溃,也验证 FX 图构建、Proxy 生成、节点 target、节点参数传递、codegen 文本和 NPU Tensor 执行结果。 3. torch.fx.Graph.lint 已有 PyTorch 官方直接专项测试覆盖,因此本 PR 不重复新增 lint 专项测试。 4. 本 PR 不修改 API 实现,不涉及资料变更和接口变更。 # 【CheckList】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!3552111 天前
[test] Add fx graph internal API verify tests Co-authored-by: lihaokun-2026<851563813@qq.com> # message auto-generated for no-merge-commit merge: !35580 merge add-fx-graph-api-verify-master into master [test] Add fx graph internal API verify tests Created-by: lihaokun-2026 Commit-by: lihaokun-2026 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > [【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(25) #1631](https://gitcode.com/Ascend/pytorch/issues/1631) > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改背景】 本次任务聚焦 torch.fx.graph 相关内部能力的测试补齐与行为验证,主要覆盖 FX 图代码生成过程中涉及的内部辅助接口及状态维护逻辑。 结合目标分支实际源码核查后发现,torch.fx.graph.py 中相关能力的暴露形式并不完全一致: - torch.fx.graph._format_targettorch.fx.graph._is_from_torchtorch.fx.graph._origin_type_maptorch.fx.graph._register_custom_builtintorch.fx.graph 模块级内部对象,可直接进行 API 级测试; - torch.fx.graph._format_args 在当前目标分支中并非 torch.fx.graph 模块级函数,也不是 CodeGen 类方法,而是定义在 CodeGen._gen_python_code() 内部的局部 helper 函数,无法通过 torch.fx.graph._format_args 直接访问。 因此,本次 PR 对 torch.fx.graph._format_args 不进行测试验证。 本次任务范围为 test/ 目录下测试用例开发与验证,不涉及 torch_npu/ 目录实现逻辑修改。 # 【资料支持情况核查】 核查结论: 1. torch.fx.graph._format_target 为模块级内部函数,可直接验证目标路径格式化行为; 2. torch.fx.graph._is_from_torch 为模块级内部函数,可直接验证 torch 对象识别行为; 3. torch.fx.graph._origin_type_map 为模块级内部映射表,可直接验证内置容器类型映射行为; 4. torch.fx.graph._register_custom_builtin 为模块级内部函数,可直接验证自定义 builtin 注册及内部状态更新行为; 5. torch.fx.graph._format_args 当前不是模块级 API,而是 CodeGen._gen_python_code() 内部局部函数,因此测试中不进行测试验证。 同时在torch官方社区中并没有针对这5个api的测试方法,同时由于torch.fx.graph._format_args 当前不是模块级 API,而是 CodeGen._gen_python_code() 内部局部函数,因此测试中不进行测试验证,因此需要在本pr中新增对4个api的测试方法,测试范围已与当前目标分支实际源码保持一致,避免将局部 helper 错误声明为模块级 API。 本次提交对应 Torch-NPU API 补齐任务,涉及以下 4 个 API: | API / 行为 | 作用说明 | 备注 | |---|---|---| | torch.fx.graph._format_target | 将 FX Node 的 target 路径格式化为合法的 Python 属性访问表达式。对于非法 Python 标识符,会转换为 getattr(...) 形式。 | 主要用于 call_methodcall_moduleget_attr 等节点的代码生成。 | | torch.fx.graph._is_from_torch | 判断一个对象是否来自 torch 命名空间,用于区分 torch 原生对象和用户自定义对象。 | FX codegen 可据此决定是否直接生成类似 torch.add(...) 的调用形式。 | | torch.fx.graph._origin_type_map.get | 查询内置容器类型到 typing 类型的映射关系,例如 list -> typing.Listdict -> typing.Dict。 | 主要用于 FX 代码生成过程中的类型注解处理。 | | torch.fx.graph._register_custom_builtin | 注册 FX codegen 需要识别的自定义 builtin 对象,并更新 _custom_builtins_illegal_names 内部状态。 | 用于保证生成代码能够正确引用特定全局对象,同时避免变量名与 builtin 名称冲突。 | # 【修改方案】 新增测试文件: test/fx/test_fx_graph_internal.py 文件顶部补充用途说明,明确该文件用于承载 torch.fx.graph 相关内部 API 及 CodeGen 行为的兼容性验证。 当前测试覆盖以下 4个api : 1. torch.fx.graph._format_target; 2. torch.fx.graph._is_from_torch; 3. torch.fx.graph._origin_type_map.get; 4. torch.fx.graph._register_custom_builtin。 本次采用最小化修改方案: - 仅新增 test/ 下测试文件; - 不修改 torch_npu/ 目录下实现代码; - 不引入与本次任务无关的功能改动; - 不使用 try / except 异常捕获逻辑,测试中如出现异常直接暴露; # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 > 测试场景: 1. torch.fx.Graph的4个API进行验证 2. NPU 设备下 tensor shape 场景验证 > 测试方法: ``` export TORCH_DEVICE_BACKEND_AUTOLOAD=1 python /test/fx/test/fx/test_fx_graph_internal.py -v ``` >测试结果 ![image.png](https://raw.gitcode.com/user-images/assets/7404318/c4b8490a-c960-487b-95a0-2978f3eadb52/image.png 'image.png') 所有api功能性测试均已通过 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 [【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(25) #1631](https://gitcode.com/Ascend/pytorch/issues/1631) See merge request: Ascend/pytorch!3558011 天前
Add test_fx_graph_pickler for NPU adapter validation Co-authored-by: yuhongming-2026<moshui_1@qq.com> # message auto-generated for no-merge-commit merge: !34855 merge add-fx-graph-api-test-master into master test: 新增 GraphPickler NPU 适配验证与统一运行脚本 Created-by: yuhongming-2026 Commit-by: yuhongming-2026 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> ​ # 【合入来源】 > <font color="red">**#1607**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> ​ - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [x] 重构优化 - [ ] 资料更新 ​ # 【修改方案】 1. 新增统一验证脚本 run_graphpickler_npu_unified.py,用于自动选择可用后端并验证 torch.fx._graph_pickler 三大 API 在 CPU/NPU 环境中的适配性。 2. 支持的目标 API 包括 GraphPickler.dumpsGraphPickler.loads 以及 Option/Options 配置项,兼容 torch.fx._graph_picklertorch_npu.fx._graph_picklergraphpickler_npu_adapter 三种后端。 3. 在验证逻辑中实现:API 存在性检查、CPU round-trip 序列化/反序列化验证、NPU round-trip 验证、Option/Options 参数测试和输出一致性对比。 4. 参考已有验证结果文档和报告,确认 graphpickler_npu_validation_report.json 中三大 API 均通过验证,Option 配置测试 7/7 通过,NPU 功能测试通过且输出完全匹配。 5. PR 文档内容已基于目录下现有 NPU_ADAPTER_FULL_REPORT.mdNPU_ADAPTER_2100_REPORT.mdADAPTATION_REPORT.md 等验证报告进行整理。 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 - 通过统一验证脚本 run_graphpickler_npu_unified.py 运行结果确认: - NPU 可用:torch.npu.is_available() 返回 true。 - API 存在性:GraphPickler.dumpsGraphPickler.loadsOption 均存在且可调用。 - CPU round-trip:序列化成功,反序列化成功,输出与原始模型一致。 - NPU round-trip:NPU 模型序列化/反序列化成功,NPU 输出完全匹配。 - Option 配置测试:默认/压缩/保留设备信息/包含元数据/完整性校验/二进制格式/全部选项均通过,7/7 通过率 100%。 - 参考验证报告:graphpickler_npu_validation_report.jsonNPU_ADAPTER_FULL_REPORT.mdNPU_ADAPTER_2100_REPORT.md 等。 - 已补充 PR 文档,便于 reviewer 直接确认适配结果。 # 【CheckList】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!3485525 天前
test(fx): add test for lazy_format_graph_code Co-authored-by: Lane0218<laneljc@qq.com> # message auto-generated for no-merge-commit merge: !35078 merge task2-master-test-fx-lazy-format into master test(fx): add test for lazy_format_graph_code Created-by: liujiacheng_2026 Commit-by: Lane0218 Merged-by: ascend-robot Description: # 【合入来源】 > [【开源实习】Torch-NPU API一致性对齐:补齐测试用例、API功能对齐、补齐文档(2)](https://gitcode.com/Ascend/pytorch/issues/1608) - [ ] 需求 - [ ] 问题单 - [X] issue/工单 - [ ] 重构优化 - [ ] 资料更新 本 PR 覆盖以下 API: - torch.fx._utils.lazy_format_graph_code # 【修改方案】 ## 一、API 功能说明 torch.fx._utils.lazy_format_graph_codetorch.fx 中用于延迟格式化 GraphModule 可读代码的 Python helper。 该 API 返回 torch._logging.LazyString,只有在日志系统或调用方真正需要字符串内容时,才调用内部格式化函数。字符串化时会调用 GraphModule.print_readable(print_output=False, **kwargs),并将结果包装成包含 TRACED GRAPH 标识和标题的可读文本。 该 API 主要用于 FX pass 的日志输出,例如 split_moduleruntime_assert_tensorify_python_scalars 等路径。它不涉及 NPU 算子分派,也不修改 graph 语义。 ## 二、用例完备性说明 经检索,PyTorch 社区测试中暂未发现直接覆盖 torch.fx._utils.lazy_format_graph_code 的专项测试。因此按任务要求在 Torch-NPU test 目录补充自写用例。 新增 TestFXNPU.test_lazy_format_graph_code,验证内容包括: - 构造最小 torch.nn.Module 并通过 symbolic_trace 得到 GraphModule。 - 调用 lazy_format_graph_code("fx lazy graph", gm, maybe_id=1)。 - 对返回的 LazyString 执行字符串化。 - 断言输出包含 TRACED GRAPH。 - 断言标题包含 ===== fx lazy graph 1 =====。 - 断言输出包含 def forward,证明 GraphModule.print_readable 的结果进入最终格式化文本。 该测试是功能类 API 的最小核心验证,不依赖真实 NPU 张量,不绑定具体算子节点文本,也不覆盖颜色输出等非核心格式细节,避免测试过度约束输出实现。 ## 三、NPU 适配说明 本次不修改 Torch-NPU 生产代码,仅新增测试用例。 lazy_format_graph_code 是 FX Python 层日志辅助函数,不涉及 NPU kernel、device dispatch 或 tensor 精度计算。NPU 适配目标是验证该 API 在 Torch-NPU 测试环境中可正常导入、调用和生成符合预期的 FX graph 可读输出。 为什么不需要修改 API: - Torch-NPU 未覆写该 API。 - 该 API 行为由 PyTorch torch.fx._utils 提供。 - 当前验证中 API 可正常运行,输出包含预期 graph 标识、标题和 forward 代码。 # 【资料变更】 不涉及。本 API 的资料补齐由单独文档 PR 提交到 v2.7.1。 # 【接口变更】 不涉及。 # 【功能验证】 执行命令: ```bash TORCH_DEVICE_BACKEND_AUTOLOAD=0 PYTHONPATH=<repo>/test python <repo>/test/test_fx.py TestFXNPU.test_lazy_format_graph_code ``` 覆盖版本: - master - v2.7.1 - v2.8.0 - v2.9.0 - v2.10.0 - v2.11.0 - v2.12.0 执行结果: ```text ---------------------------------------------------------------------- Ran 1 test in 0.009s OK ``` 额外检查: ```bash python -m py_compile <repo>/test/test_fx.py git diff --check ``` 覆盖上述全部版本,结果均通过。 # 【CheckList】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!3507811 天前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
test(nn): add test for fx.tracer.create_arg Co-authored-by: Micke Zhang<18502290727@163.com> # message auto-generated for no-merge-commit merge: !36180 merge test-fx-tracer-create-arg into master test(nn): add test for fx.tracer.create_arg Created-by: weixin_38711892 Commit-by: Micke Zhang Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【API 功能】 ## API: torch.fx.Tracer.create_arg ## 功能: Tracer.create_arg 是 PyTorch FX 符号追踪(Symbolic Tracing)过程中的核心基础函数之一,它充当了原生 Python / 张量值与 FX 计算图节点之间的转换入口。torch.fx.Tracer.create_arg 的主要职责是在追踪(Trace)阶段,将输入的各类参数值(如常量、Python 基础类型、张量、符号代理等)统一处理并封装为计算图(Graph)可识别的节点或符号代理(Proxy)。在 PyTorch FX 的设计中,Tracer 通过该方法完成参数的标准化处理,确保传入模块、算子、函数的各类参数都能被正确转换为计算图中的合法节点表示,为后续构建完整、可执行的计算图提供底层支撑,是 FX 追踪流程中参数节点生成的关键环节。 # 【用例完整性】 经 PyTorch 社区代码检索,v2.7.1/v2.8.0/v2.9.0/v2.10.0/v2.11.0针对torch.fx.Tracer.create_arg API 的验证功能较为薄弱,现有验证情况分析如下: | 验证维度 | 详细描述 | 验证强度评估 | | :--- | :--- | :--- | | API 接口可用性 | 验证了用户可以通过实现 __fx_create_arg__ 方法来控制对象如何被转换为 FX 图中的节点(Node)。 | 基础 | | 代码生成 (Codegen) | 验证了自定义逻辑生成的代码字符串中包含了预期的构造函数调用。 | 薄弱 | | 图结构正确性 | 仅通过检查代码字符串包含特定字符来间接推断图结构正确,未直接检查图节点(Node)的属性。 | 薄弱 | | 运行时正确性 | 未验证。该测试没有执行生成的 GraphModule,也没有检查运行结果是否与原函数一致。 | 缺失 | 现有用例仅验证了 __fx_create_arg__ 接口可被调用并生成含指定字符串的代码,未对其语义正确性与运行时行为进行校验。 因此需要新增完整的单元测试文件 test_fx_tracer_create_arg.py,以全面验证该 API 的功能正确性、鲁棒性及兼容性。 # 【修改方案】 一、API现状检索 经核查确认,目标 API 在现有 v2.7.1、v2.8.0、v2.9.0、v2.10.0、v2.11.0 版本中均已完整支持,无需补充底层实现。本次 PR 仅在 test/fx/ 目录下新增 torch.fx.Tracer.create_arg 相关测试用例,完善测试覆盖。 二、新增文件:test/fx/test_fx_tracer_create_arg.py全覆盖验证 create_arg 核心能力,包含: ``` 1、对 create_arg API 的验证 核心功能验证 test_create_arg_tensor_to_constant_node:验证核心的「Tensor 类型参数转换为图常量节点」能力,确认 API 能正确处理 torch.Tensor 并返回有效的 fx.Node 对象,节点类型为 get_attr,包含标准常量命名标识。 test_create_arg_tensor_node_in_graph:验证「生成的张量节点正确加入计算图」能力,确保 create_arg 创建的节点被成功添加到当前计算图中,保证图结构完整性。 test_create_arg_tensor_list_to_node_list:验证「Tensor 列表类型」参数的递归处理能力,确认 API 能递归调用 create_arg 处理列表中每个元素,返回结构一致的节点列表容器。 test_create_arg_dict_to_node_dict:验证「字典类型」参数的递归处理能力,确认 API 能处理字典中每个 value 为 Tensor 的场景,保持字典结构完整、键值对应关系不变且值均转换为合法图节点。 test_create_arg_tuple_to_node_tuple:验证「元组类型」参数的递归处理能力,确认 API 能正确处理不可变容器类型,递归转换内部张量并返回结构一致、元素均为节点的元组容器。 test_create_arg_deeply_nested_container:验证「深度嵌套混合容器」递归处理能力,支持 list + dict + 多层 Tensor 嵌套结构,确保 API 能完整遍历并转换所有层级的张量为图节点。 test_create_arg_with_basic_types:覆盖「整数 / 浮点数 / 字符串 / 布尔值」等基础 Python 类型的处理,验证 API 能直接返回原值而不创建图节点,保持常量语义不变。 test_create_arg_npu_tensor_consistency:验证「NPU 张量与 CPU 张量处理一致性」,确保 API 对昇腾 NPU 张量的处理逻辑与 CPU 完全相同,行为无差异、硬件无感知。 test_create_arg_with_custom_tracer_override:验证「自定义类型扩展能力」,支持继承 Tracer 重写 create_arg 处理自定义对象,确保 API 具备良好的扩展性与适配能力。 test_create_arg_list_mixed_types:验证「混合类型列表」处理能力,支持 Tensor + 基础类型组合,确保张量转为节点、基础类型保持不变,结构与输入完全对齐。 test_create_arg_dict_mixed_values:验证「混合类型字典」处理能力,支持 Tensor、基础类型、嵌套列表混合场景,确保递归处理正确、结构完整、类型匹配。 边界条件验证 test_create_arg_with_none:验证 None 值边界场景下 API 直接返回 None 而不创建任何图节点,保证极端输入下的鲁棒性与稳定性。 底层逻辑验证 所有用例均通过先调用 tracer.trace(model) 完成追踪器初始化,构建合法的 root 模块与图上下文,确保 create_arg 在正确的图环境中执行。验证 API 能够正常访问 self.root、self.graph 等核心上下文,并完成参数到图节点的合法转换,保证底层图构建逻辑正确性。 2、测试隔离性保障 每个测试用例独立定义 SimpleModule、独立创建 fx.Tracer 实例、独立生成全新计算图,确保: 不同测试用例之间的图结构完全隔离、互不干扰 多次调用 create_arg 不会产生状态污染或节点冲突 无需额外 setUp/tearDown 清理逻辑,用例天然具备独立性与可重复性 单测失败可精准定位,不影响其他用例执行 ``` 三、NPU适配 ``` torch.fx.Tracer.create_arg 具备硬件无关性、纯 Python 层实现、无底层算子依赖三大核心特征,决定了其无需针对昇腾 NPU 做修改,具体分析: 1. 纯 Python 层抽象,无硬件相关逻辑 - create_arg API:仅负责 Python 对象到计算图节点的类型转换和递归处理,是「参数-节点映射」的纯 Python 抽象接口,独立于所有硬件相关的计算、存储、通信逻辑之外(如 NPU 算子、NPU 内存管理、NPU 通信协议等)。 2.无底层算子 / 内核依赖 API 内部仅调用 Python 标准库(isinstance 类型判断、递归遍历容器)和 PyTorch 纯 Python 层的图节点抽象(Node/Proxy 类),与 CUDA/NPU 等硬件相关的扩展库、内核函数或底层驱动完全独立。 类型递归处理仅基于 Python 原生容器类型(list、dict、tuple)和基础类型系统,无需依赖任何硬件相关接口。 3.核心逻辑与硬件解耦 参数处理解耦:create_arg 对 torch.Tensor 的处理是创建图节点占位符,该节点仅是计算图的逻辑表示,与张量实际存储的硬件设备(CPU/NPU/GPU)无关 —— 无论张量在何种设备上,create_arg 均将其统一转换为图中节点,NPU 环境下可直接复用。 容器递归逻辑解耦:对 list、dict、tuple 的递归处理是纯 Python 容器遍历操作,与硬件相关属性完全隔离。嵌套容器中无论包含 CPU Tensor 还是 NPU Tensor,递归遍历逻辑完全一致。 基础类型处理解耦:对 int、float、str、bool、None 的常量返回操作,无需与硬件产生交互,NPU 环境下常量处理规则无需调整。 4.图构建上下文解耦 create_arg 依赖的 self.root(被追踪的模块)和 self.graph(计算图容器)是 FX 框架的纯 Python 层抽象,不含任何硬件相关属性。 tracer.trace (model) 的初始化过程仅进行模块结构分析和符号追踪,与设备相关的算子下发、内存分配相互独立。 生成的常量节点(get_attr)仅记录参数名称和类型元信息,不携带设备标识,因此 NPU 环境下无需修改节点创建逻辑。 5.测试验证的硬件无关性体现 测试用例中已单独覆盖 NPU 张量场景 test_create_arg_npu_tensor_consistency,验证结果表明: 传入 NPU 张量时,create_arg 的处理路径与 CPU 张量完全一致 均生成合法的 fx.Node 常量节点,节点类型、结构、行为无任何差异 简言之,create_arg 是「硬件无关的纯 Python 层抽象」,核心逻辑不绑定、不依赖任何特定硬件(包括 GPU/NPU/CPU),因此适配昇腾 NPU 时无需修改 API 本身,可直接复用。 ``` # 【资料变更】 已经在 https://gitcode.com/Ascend/pytorch/treeN2.7.1/docs/zh/native apis 的文档中进行查找与验证。该目录下的pytorch.2-6.0至pytorch.2-10-0文件夹下的torch-fx.md已经对"torch.fx.Tracer.create_arg"全部标注"是"。无需更改。 ![image.png](https://raw.gitcode.com/user-images/assets/7404318/0aeb83c6-e4bd-4912-a044-4787150e6a58/image.png 'image.png') ![image.png](https://raw.gitcode.com/user-images/assets/7404318/1d8a09a4-a3ee-4ec2-a2ed-2fa3093ff38a/image.png 'image.png') ![image.png](https://raw.gitcode.com/user-images/assets/7404318/b5831e6f-e0c1-4808-9156-73754ce0589b/image.png 'image.png') ![image.png](https://raw.gitcode.com/user-images/assets/7404318/dea3b551-d604-453c-bdac-cdaefd74fdcf/image.png 'image.png') ![image.png](https://raw.gitcode.com/user-images/assets/7404318/4f38e17d-f21d-4912-bc75-f618d4d580e4/image.png 'image.png') # 【接口变更】 > 不涉及 # 【功能验证】 ## 测试文件路径 - test/fx/test_fx_tracer_create_arg.py ## 验证环境 - 对应版本:torch-npu 2.10.0 - 操作系统:AlmaLinux 8.10 - CANN 软件版本:8.5.0 - 安装的软件版本:torch、torch-npu 2.10.0 ## 验证结果 ``` [root@2338f55479be test]# python test_fx_tracer_create_arg.py ............ ---------------------------------------------------------------------- Ran 12 tests in 1.117s OK [root@2338f55479be test]# ``` ## 结果说明 测试用例执行通过。 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - ✅ 代码注释完备,正确记录错误日志 - ✅ 代码实现进行了返回值、空指针等校 - ✅ PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - ✅ PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!361805 天前
test(fx): add test for Tracer.getattr Co-authored-by: m0_45651774<2759927519@qq.com> # message auto-generated for no-merge-commit merge: !35414 merge test-fx-Tracer-getattr-master into master test(fx): add test for Tracer.getattr Created-by: m0_45651774 Commit-by: m0_45651774 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260512 --> # 【API功能】 **API:** torch.fx.Tracer.getattr **功能:** Tracer.getattr 是 PyTorch FX 符号追踪(Symbolic Tracing)过程中的核心钩子函数之一,它充当了 Python 对象属性访问与 FX 计算图节点之间的桥梁。torch.fx.Tracer.getattr 的主要职责是在追踪(Trace)阶段,拦截对 nn.Module 实例属性的访问操作,并将其转化为计算图(Graph)中的一个 get_attr 节点。在 PyTorch FX 的设计中,Tracer 通过重写 Python 的属性访问机制,确保当代码尝试读取模型的权重(如 self.linear.weight)、偏置或子模块时,不会直接返回底层的 Tensor 或 Module 对象,而是返回一个代表该值的符号代理(Proxy)。 # 【用例完整性】 经 PyTorch 社区代码检索,v2.7.1/v2.8.0/v2.9.0/v2.10.0/v2.11.0/master均无torch.fx.Tracer.getattr 测试用例覆盖,因此需要新增 torch-npu 自有用例。 # 【修改方案】 对目标 API 进行现状核查,确认在当前v2.7.1/v2.8.0/v2.9.0/v2.10.0/v2.11.0已实际支持,不需要补齐底层实现,本 PR 仅补充torch.fx.Tracer.getatt的测试用例至test/fx/test_fx_tracer_transformer_api.py。 # 【版本说明】 经 PyTorch 社区代码检索,v2.7.1/v2.8.0/v2.9.0/v2.10.0/v2.11.0均存在该API # 【NPU适配分析】 - **职责**:在符号追踪过程中,处理模型代码对属性(如 self.submodule.weightself.layers.__len__)的访问。决定该属性是直接返回原始值(视为常量),还是记录为图中的 get_attr 节点。 - **实现层次**:该方法属于 Tracer 类的 Python 成员函数,其逻辑由 PyTorch 框架在 Python 层完成(例如通过 super().getattr() 调用默认行为或用户自定义的 is_leaf_module 判断)。 - **设备无关性**:getattr 操作的对象是 torch.nn.Module 或 Python 对象,并不直接接触 torch.Tensor 的底层设备内存。即使访问的张量位于 NPU 上,getattr 也只是获取该张量的属性元信息(如 .shape, .dtype)或子模块引用,不涉及 NPU 侧的 kernel 执行或内存传输。 torch.fx.Tracer.getattr属于纯 Python 框架层面的操作,不需要进行 NPU 适配。 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 torch.fx.Tracer.getattr测试用例路径:test/fx/test_fx_tracer_transformer_api.py **验证环境** - 对应版本:torch-npu 2.7.1、2.8.0、2.9.0、2.10.0、2.11.0 - 操作系统:openEuler22.03 - CANN 软件版本:8.5.0 - 安装的软件版本:torch、torch-npu 2.7.1~2.11.0 验证结果: ![master.png](https://raw.gitcode.com/user-images/assets/7404318/804d9507-85f7-47f7-8ca8-b80f9ff36882/master.png 'master.png') 结果说明:测试用例执行通过。 注意:测试结果图中的test_fx_Tracer_getattr.py文件内容已添加到test/fx/test_fx_tracer_transformer_api.py文件。 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!3541418 天前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
[test] add fx graph api coverage Co-authored-by: baoxuebin_2026<xuebin@isrc.iscas.ac.cn> # message auto-generated for no-merge-commit merge: !34556 merge codex/fx-graph-apis-master into master [test] add fx graph api coverage Created-by: baoxuebin_2026 Commit-by: baoxuebin_2026 Merged-by: ascend-robot Description: # 【合入来源】 > 如有社区issue,请关联issue链接 - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 公开issue:暂无单独公开 issue 链接,本次提交对应 Torch-NPU API 补齐任务,涉及以下 5 个 API: - torch.fx.graph.map_arg - torch.fx.Graph.node_copy - torch.fx.Graph.nodes - torch.fx.Graph.on_generate_code - torch.fx.Graph.output # 【修改方案】 1. 对目标 API 进行现状核查,确认在当前 PyTorch 2.9.0 + torch_npu 2.9.0rc1 环境中已实际支持,不需要补齐底层实现。 2. 补充独立测试文件 test/fx/test_graph_api.py,覆盖以下场景: - map_arg 对嵌套参数结构的映射行为 - Graph.node_copy 的图节点复制行为 - Graph.nodes 的拓扑顺序遍历行为 - Graph.on_generate_code 对生成代码的 hook 行为 - Graph.output 在 NPU 输入场景下的实际执行验证 3. 采用最小化修改方案,不改动已有底层实现,仅补齐测试覆盖。 # 【资料变更】 不涉及。本文 PR 仅补测试,不包含资料修改。 # 【接口变更】 不涉及。未修改跨仓接口,也未修改用户可见接口行为。 # 【功能验证】 测试场景: 1. torch.fx 图相关 API 的核心行为验证 2. NPU 设备下 Graph.output 的实际运行验证 测试方法: ```bash cd /data/pytorch TORCH_DEVICE_BACKEND_AUTOLOAD=1 python3.11 test/fx/test_graph_api.py -v [#1635](https://gitcode.com/Ascend/pytorch/issues/1635) See merge request: Ascend/pytorch!3455622 天前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
test(fx): add tests for proxy tensor api Co-authored-by: nannan-2026<1794949109@qq.com> # message auto-generated for no-merge-commit merge: !34873 merge test-proxy-tensor-api-master into master test(fx): add tests for proxy tensor api Created-by: nannan-2026 Commit-by: nannan-2026 Merged-by: ascend-robot Description: # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 关联 issue:https://gitcode.com/Ascend/pytorch/issues/1609 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 本 PR 针对 torch.fx.experimental.proxy_tensor 相关 API 新增专项验证用例,覆盖如下 API: - torch.fx.experimental.proxy_tensor.get_proxy_mode - torch.fx.experimental.proxy_tensor.handle_sym_dispatch - torch.fx.experimental.proxy_tensor.make_fx - torch.fx.experimental.proxy_tensor.maybe_disable_thunkify - torch.fx.experimental.proxy_tensor.maybe_enable_thunkify ## 一、API 功能说明 1. torch.fx.experimental.proxy_tensor.get_proxy_mode 该 API 用于获取当前活跃的 ProxyTorchDispatchMode。在普通执行环境下返回 None,在 make_fx tracing 过程中可获取到当前 proxy mode。 2. torch.fx.experimental.proxy_tensor.handle_sym_dispatch 该 API 用于处理 proxy tensor tracing 过程中的 symbolic dispatch 逻辑,依赖当前 proxy mode 环境。该接口属于 proxy_tensor tracing 内部调度相关 helper。 3. torch.fx.experimental.proxy_tensor.make_fx 该 API 用于对 Python 函数进行 tracing,并生成对应的 torch.fx.GraphModule。生成后的 GraphModule 可用于表示被 trace 函数的 ATen 图结构。 4. torch.fx.experimental.proxy_tensor.maybe_enable_thunkify 该 API 用于在特定上下文中启用 thunkify 相关逻辑,可作为上下文管理器使用。 5. torch.fx.experimental.proxy_tensor.maybe_disable_thunkify 该 API 用于在特定上下文中关闭 thunkify 相关逻辑,可作为上下文管理器使用。 ## 二、上游社区用例分析与用例补齐说明 经检索,PyTorch 上游社区中已存在部分 make_fx 相关测试用例。例如在 test/export/test_export.py 中存在 test_stack_trace_make_fx 等用例,会调用 torch.fx.experimental.proxy_tensor.make_fx。 但经分析,现有 make_fx 用例主要验证的是 export / stack trace 等上层功能路径中 make_fx 的使用效果,测试重点并不是 make_fx API 本身的基础行为,也未集中覆盖本次 issue 要求的 torch.fx.experimental.proxy_tensor 相关 API 组合。具体来说,现有用例未充分覆盖以下内容: 1. 未独立验证 make_fx 返回对象是否为 torch.fx.GraphModule; 2. 未独立验证 make_fx 生成的 GraphModule 执行结果是否与原函数一致; 3. 未验证 get_proxy_mode 在 tracing 外返回 None、在 make_fx tracing 中可获取到 proxy mode 的行为; 4. 未验证 handle_sym_dispatch 作为 proxy tensor tracing 内部 helper 对 proxy mode 的依赖关系; 5. 未验证 maybe_enable_thunkify / maybe_disable_thunkify 作为上下文管理器在 make_fx tracing 中可稳定执行; 6. 未针对 Torch-NPU 场景验证测试张量迁移到当前 accelerator / NPU 侧运行。 同时,经检索,本次任务中的以下 API 未发现独立、直接的专项验证用例: - torch.fx.experimental.proxy_tensor.get_proxy_mode - torch.fx.experimental.proxy_tensor.handle_sym_dispatch - torch.fx.experimental.proxy_tensor.maybe_disable_thunkify - torch.fx.experimental.proxy_tensor.maybe_enable_thunkify 因此,现有上游社区用例对 make_fx 有调用覆盖,但不足以完整覆盖本次 issue 中 5 个 proxy_tensor API 的专项兼容性验证需求。基于此,本 PR 新增轻量级专项测试文件: ```text test/fx/test_proxy_tensor_api.py ``` 该文件集中验证 torch.fx.experimental.proxy_tensor 相关 API 的基础行为,且测试张量通过 .to(device_type) 迁移到当前 accelerator / NPU 侧运行,满足 Torch-NPU API 一致性测试要求。 ## 三、新增测试文件说明 本 PR 新增测试文件: ```text test/fx/test_proxy_tensor_api.py ``` 该测试文件用于集中验证 torch.fx.experimental.proxy_tensor 相关 API 的基础兼容性。为便于后续维护和扩展,文件开头已补充英文说明,说明该文件用于补充 proxy_tensor API 的 NPU 侧验证用例,并可继续扩展同类 API 测试。 文件开头说明如下: ```python """ Add validation cases for torch.fx.experimental.proxy_tensor APIs on NPU: 1. PyTorch community lacks sufficient and direct API validations for some proxy_tensor APIs, so this file is added. 2. This file validates get_proxy_mode, handle_sym_dispatch, make_fx, maybe_enable_thunkify, and maybe_disable_thunkify (extendable). """ ``` 新增测试覆盖以下场景: 1. make_fx tracing 基础场景 通过 make_fx(fn)(x, y) 对函数进行 tracing,验证返回结果为 GraphModule,并验证生成的 GraphModule 执行结果与原函数一致。 2. get_proxy_mode tracing 场景 验证 get_proxy_mode 在 tracing 外返回 None,在 make_fx tracing 过程中可以获取到非空 proxy mode。 3. handle_sym_dispatch proxy mode 依赖场景 验证 handle_sym_dispatch 为可调用对象,并验证其依赖当前 proxy mode 的行为。在非 proxy mode 环境下直接调用会触发断言,符合该 helper 的使用约束。 4. maybe_enable_thunkify / maybe_disable_thunkify 上下文管理器场景 验证 maybe_enable_thunkifymaybe_disable_thunkify 可作为上下文管理器正常使用,并可在 make_fx tracing 过程中稳定执行。 ## 四、NPU 适配说明 上述 API 均属于 torch.fx.experimental.proxy_tensor Python 层 tracing / proxy tensor 相关接口,不涉及新增 NPU 算子实现,也不涉及 C++、Kernel 或底层算子逻辑修改。 但测试用例中涉及张量输入,因此测试张量需要运行在 NPU / 当前 accelerator 侧。本 PR 使用如下方式获取当前 accelerator: ```python device_type = acc.type if (acc := torch.accelerator.current_accelerator()) else "cpu" ``` 并通过如下方式将测试张量迁移到当前设备: ```python x = torch.randn(2, 3).to(device_type) y = torch.randn(2, 3).to(device_type) ``` 在 Torch-NPU 测试环境中,当前 accelerator 为 NPU,因此测试张量会通过 .to(device_type) 迁移到 NPU 侧运行,满足新增用例涉及张量需在 NPU 侧执行的要求。 ## 五、涉及版本说明 本次用例补齐分别提交到以下目标分支: - v2.7.1 - v2.9.0 - v2.10.0 - v2.11.0 - v2.12.0 - master 各版本均单独提交 PR,目标分支与源码分支一一对应。 本次根据当前任务要求提交上述分支,不涉及 v2.8.0 分支。 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及。 本 PR 仅新增测试用例,不修改资料文档。 相关 API 的 docs/zh/native_apis 支持状态已通过单独文档 PR 补充。 本 PR 仅新增 test/fx/test_proxy_tensor_api.py 测试用例,不直接修改 docs/zh/native_apis 资料文档。 但已结合配套资料补齐任务,对本次涉及的 torch.fx.experimental.proxy_tensor 相关 API 在 docs/zh/native_apis 中的资料支持状态进行了同步核查。 资料支持情况核查结论如下: 1. 本次任务涉及的 API 均属于 torch.fx.experimental.proxy_tensor 下的 Python 层 tracing / proxy tensor 相关接口; 2. 相关 API 的资料支持状态需要结合目标版本实际能力在 docs/zh/native_apis/pytorch_*/torch-fx.md 中进行声明; 3. 本测试 PR 仅负责补齐 test 目录下的专项用例与行为验证,不涉及 torch_npu/ 目录下的功能代码修改,也不涉及资料文档修改; 4. 相关 API 的 docs/zh/native_apis 支持状态已通过单独资料 PR 补充; 5. 本 PR 的测试验证范围与当前代码实际可验证能力保持一致,避免“资料声明”和“测试验证”口径 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及。 本 PR 不修改客户可见接口,不修改 API 行为,仅新增测试用例验证现有 API 兼容性。 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 新增测试用例: ```text test/fx/test_proxy_tensor_api.py ``` 测试命令: ```bash python -u test/fx/test_proxy_tensor_api.py -v ``` 测试场景: 1. 验证 make_fx 可正常生成 GraphModule; 2. 验证 make_fx 生成的 GraphModule 执行结果与原函数一致; 3. 验证 get_proxy_mode 在 tracing 外返回 None; 4. 验证 get_proxy_modemake_fx tracing 中可获取到 proxy mode; 5. 验证 handle_sym_dispatch 的可调用性及其依赖 proxy mode 的行为; 6. 验证 maybe_enable_thunkify / maybe_disable_thunkify 上下文管理器可正常使用; 7. 验证测试中涉及的张量已通过 .to(device_type) 迁移到当前 accelerator / NPU 侧运行。 本地验证结果示例: ```text test_get_proxy_mode_during_make_fx (__main__.TestProxyTensorAPI.test_get_proxy_mode_during_make_fx) ... ok test_handle_sym_dispatch_requires_proxy_mode (__main__.TestProxyTensorAPI.test_handle_sym_dispatch_requires_proxy_mode) ... ok test_make_fx_returns_graph_module (__main__.TestProxyTensorAPI.test_make_fx_returns_graph_module) ... ok test_thunkify_context_managers (__main__.TestProxyTensorAPI.test_thunkify_context_managers) ... ok ---------------------------------------------------------------------- Ran 4 tests in 0.333s OK ``` 已在以下版本执行该用例: - v2.7.1:通过 - v2.9.0:通过 - v2.10.0:通过 - v2.11.0:通过 - v2.12.0:通过 - master:通过 说明: 该组 API 为 torch.fx.experimental.proxy_tensor Python 层 tracing 相关接口,不涉及 NPU 算子计算。本次测试主要验证 API 功能行为与 PyTorch 原生保持一致,同时确保测试中涉及的张量运行在当前 accelerator / NPU 侧。 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!3487311 天前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前
[test] ShapeEnv APIs NPU兼容性验证与资料更新 Co-authored-by: hongwei-2026<feizi_050920@qq.com> # message auto-generated for no-merge-commit merge: !36138 merge add_pr5_renwu21_master into master [test] ShapeEnv APIs NPU兼容性验证与资料更新 Created-by: hongwei-2026 Commit-by: hongwei-2026 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> <!-- MR: https://gitcode.com/Ascend/pytorch/pull/36138 | 分支: add_pr5_renwu21_master → master --> # 【合入来源】 > **https://gitcode.com/Ascend/pytorch/issues/1627** > **请勿携带内部流程信息(需求链接、问题单、内部issue等)** - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 本 PR 在仓库已有 **test/fx/test_symbolic_shapes.py**(torch.fx.experimental.symbolic_shapes 模块测试)中增补 **TestShapeEnvNPU**,对 issue #1627 要求的 **ShapeEnv 守卫与符号表 API** 在 **Ascend NPU(master 日构建)** 上做单元验证,写法与文件内现有 TestSymbolicShapes 一致(**TestCase + run_tests()**)。 **合入目标分支:master(MR 36138)** ## 1. 上游社区与仓库现有测试情况 | 测试位置 | 覆盖侧重点 | 与本次 API 的关系 | |---------|-----------|------------------| | test/fx/test_symbolic_shapes.py | is_accessor_nodeis_concrete_*is_symbolic;已使用 ShapeEnv | **本 PR 在此文件扩展** ShapeEnv 守卫类 API 用例 | | test/fx/test_symbolic_shapes_api.py | definitely_trueDimConstraints 等其它 symbolic_shapes API | 不同 API 类别,不混放 | | test/dynamo/test_export.pytest/dynamo/test_misc.py | 导出等集成路径中间接使用 ShapeEnv | 缺少下列公开方法的独立、可回归 NPU 用例 | | test/fx/test_fx_passes.py 等 | FX Pass / Graph 变换 | 不涉及 ShapeEnv 守卫字符串与 sympy 简化 | 结论:需在 **test_symbolic_shapes.py** 中补齐 ShapeEnv 守卫类 API 在 NPU 上的直接单测;**不新增 test_cases.py**(评审已明确要求合并至本文件)。实现方式与 [MR 36139](https://gitcode.com/Ascend/pytorch/pull/36139)~[MR 36204](https://gitcode.com/Ascend/pytorch/pull/36204) 保持一致。 ## 2. 目标 API 功能说明(全称,master 测试范围) | API 全称 | 功能简述 | 本 PR 是否编写用例 | |---------|---------|------------------| | torch.fx.experimental.symbolic_shapes.ShapeEnv.produce_guards_expression | 根据占位 FakeTensor 等输入,生成守卫**表达式字符串** | 是 | | torch.fx.experimental.symbolic_shapes.ShapeEnv.produce_guards_verbose | 结合 Source 生成更详细的守卫信息 | 是(_produce_guards_verbose_works() 探测,不可用时 skip) | | torch.fx.experimental.symbolic_shapes.ShapeEnv.replace | 在 ShapeEnv 符号表上下文中替换 sympy 表达式 | 是 | | torch.fx.experimental.symbolic_shapes.ShapeEnv.add_backed_var_to_val | 为 **backed** 符号绑定具体整型值(**2.11.0+**) | 是(_shape_env_has() 检测) | | torch.fx.experimental.symbolic_shapes.ShapeEnv.set_unbacked_var_to_val | 为 **unbacked** 符号绑定具体值 | 是(_shape_env_set_unbacked_var_to_val_works() 探测,不可用时 skip) | | torch.fx.experimental.symbolic_shapes.ShapeEnv.simplify | 在 ShapeEnv 环境下对 sympy 表达式做化简 | 是 | > **关于 add_backed_var_to_val(回应评审疑问)** > 该 API 来自 issue #1627,由上游在 **PyTorch 2.11.0+** 引入。v2.7.1~v2.10.0 MR(36139/36201/36202)**故意不包含**;master 与 [MR 36203](https://gitcode.com/Ascend/pytorch/pull/36203)、[MR 36204](https://gitcode.com/Ascend/pytorch/pull/36204) 同属 2.11.0+ 策略(wheel 未导出则 skip)。 ## 3. 用例设计与开发思路 ### 3.1 总体原则 1. **模块归属**:在同一文件新增 **TestShapeEnvNPU**,与 TestSymbolicShapes 并列,**不用** test_cases.py。 2. **一 API 一用例**:方法名 test_torch_fx_experimental_symbolic_shapes_ShapeEnv_<api>,便于 CI 报告与 issue 追溯。 3. **设备约束**:@unittest.skipUnless(torch.npu.is_available(), "requires npu")。 4. **断言驱动**:「构造 → 调用 → 断言」;能力不满足时由 **@skipUnless + 探测函数** 决定 SKIP。 ### 3.2 公共辅助逻辑 | 辅助项 | 作用 | |--------|------| | _shape_env_with_fake_placeholders(shape=(3, 4)) | NPU FakeTensor + FakeTensorMode(shape_env=env) 占位场景 | | _shape_env_has(name) | 判断 API 是否存在(用于 add_backed_var_to_val) | | _produce_guards_verbose_works() | 端到端探测 produce_guards_verbose;bare Source() 失败则 SKIP | | _shape_env_set_unbacked_var_to_val_works() | 端到端探测 set_unbacked_var_to_valnon-nested SymInt 则 SKIP | > master 上部分 API「存在但不可用」,仅用 hasattr 会 CI ERROR;端到端探测保证 **PASS / SKIP** 语义正确。 ### 3.3 分 API 用例设计 #### (1)produce_guards_expression - **目的**:NPU FakeTensor 占位场景下生成守卫表达式字符串。 - **步骤**:_shape_env_with_fake_placeholders()produce_guards_expressionassertIsInstance(guards, str)。 - **说明**:不校验 guards 具体内容,只验证接口可达性。 #### (2)produce_guards_verbose - **目的**:提供 Source 列表时生成详细守卫信息。 - **步骤**:构造 placeholders → [Source()] * len(placeholders)produce_guards_verboseassertIsNotNone。 - **SKIP**:_produce_guards_verbose_works() 为 False(bare Source() 无完整 name,不代表 NPU 缺陷)。 #### (3)replace - **目的**:sympy 表达式替换路径行为正确。 - **步骤**:ShapeEnv() + a,b = symbolsassertEqual(env.replace(a+b), a+b)。 #### (4)add_backed_var_to_val(2.11.0+) - **目的**:backed 符号绑定 API 在 NPU 环境可调用。 - **步骤**:add_backed_var_to_val(sympy.Symbol("test_backed_1"), 10),无异常即通过。 - **SKIP**:_shape_env_has("add_backed_var_to_val") 为 False。低版本 MR 不含此用例。 #### (5)set_unbacked_var_to_val - **目的**:unbacked 符号绑定路径可触发。 - **步骤**:create_unbacked_symint()set_unbacked_var_to_val(sym, 4)。 - **SKIP**:_shape_env_set_unbacked_var_to_val_works() 为 False(non-nested SymInt 上游限制)。 #### (6)simplify - **目的**:sympy 化简 (a+b)-b → a。 - **步骤**:assertEqual(env.simplify((a+b)-b), a)。 ### 3.4 版本分支覆盖 | API | v2.7.1~v2.10.0 MR | master 本 MR | |-----|-------------------|--------------| | produce_guards_expression / replace / simplify | 测 | 测 | | produce_guards_verbose / set_unbacked_var_to_val | 测(多 SKIP) | 测(多 SKIP) | | add_backed_var_to_val | **不测** | **测** | ### 3.5 与现有 TestSymbolicShapes 的关系 - **TestSymbolicShapes**:谓词/图节点(is_accessor_nodeis_concrete_* 等)。 - **TestShapeEnvNPU**:ShapeEnv 实例方法(守卫生成、符号绑定、sympy 改写)。 - 同文件、同 run_tests(),可单独跑 TestShapeEnvNPU。 ### 3.6 运行与 CI 对接 ```bash cd test python fx/test_symbolic_shapes.py -v TestShapeEnvNPU ``` ## 4. 变更范围 - **仅修改** test/fx/test_symbolic_shapes.py(+95 行),无业务代码变更。 - **评审修订**:不新增 test_cases.py,并入 TestShapeEnvNPU。 - 低版本见 36139/36201/36202;2.11.0+ 见 36203/36204;资料见 [MR 36144](https://gitcode.com/Ascend/pytorch/pull/36144)。 # 【资料变更】 不涉及。资料由 docs MR 单独提交。 # 【接口变更】 不涉及。 # 【功能验证】 ## 测试环境 - 硬件:Ascend 910B(CI ascend-pytorch-*) - 软件:**PyTorch master 日构建** + torch_npu + CANN ## 测试命令 ```bash cd test python fx/test_symbolic_shapes.py -v TestShapeEnvNPU ``` ## 预期结果(master) | API 全称 | 预期 | |---------|------| | ShapeEnv.produce_guards_expression | PASS | | ShapeEnv.produce_guards_verbose | SKIP(bare Source() 无法满足 name) | | ShapeEnv.replace | PASS | | ShapeEnv.add_backed_var_to_val | PASS 或 SKIP(视 wheel 是否导出) | | ShapeEnv.set_unbacked_var_to_val | SKIP(non-nested SymInt) | | ShapeEnv.simplify | PASS | **合计 6 用例;典型 3~4 PASS + 2~3 SKIP** ## 自验证 - 本地/CI 可见各 test_torch_fx_experimental_symbolic_shapes_ShapeEnv_* 的 PASS/SKIP 状态。 - ![image.png](https://raw.gitcode.com/user-images/assets/7404318/2d945950-2939-4597-8fb8-28b1d62bf3c8/image.png) # 【CheckList】 - [x] 测试并入 test/fx/test_symbolic_shapes.py,未使用 test_cases.py - [x] add_backed_var_to_val 纳入 master(2.11.0+),与 issue #1627 一致 - [x] 代码注释完备,错误由断言与 unittest 机制暴露 - [x] TestCase + run_tests() 规范写法 - [x] PR 标题使用类型标签(如 test:) - [ ] CI 执行通过 See merge request: Ascend/pytorch!361381 天前
test(fx): add NPU tests for symbolic shapes APIs Co-authored-by: zhouzirui-2026<2490136803@qq.com> # message auto-generated for no-merge-commit merge: !36503 merge intern/task2-symbolic-shapes-test-master into master test(fx): add NPU tests for symbolic shapes APIs Created-by: zhouzirui-2026 Commit-by: zhouzirui-2026 Merged-by: ascend-robot Description: # 【合入来源】 - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 关联 issue: - 任务 issue:https://gitcode.com/Ascend/pytorch/issues/1610 # 【修改方案】 本 PR 在 test/fx/test_symbolic_shapes_api.py 中补充 torch.fx.experimental.symbolic_shapes 相关 API / 工具链路在 NPU 环境下可直接运行的验证用例。已有该测试文件的目标分支在原文件基础上追加用例;目标分支没有该文件时,按同路径新增测试文件。补充测试中涉及 Tensor 的输入均通过 .to(device_type)device=device_type 放到当前 accelerator 上执行。 任务 API 功能、上游社区用例情况与本 PR 处理方式如下: | API / 工具链路 | 功能说明 | 上游社区用例 / 覆盖情况 | 本 PR 处理 | | --- | --- | --- | --- | | torch.fx.experimental.symbolic_shapes._lru_cache | ShapeEnv 感知的 LRU cache 包装器。当 ShapeEnv 的 _version_counter 变化时,会清空缓存并重新计算,同时对外透出 cache_info / cache_clear。 | PyTorch 源码中存在该 private helper,公开文档收录的是不同函数 torch.fx.experimental.symbolic_shapes.lru_cache;未检索到直接专项测试;PyTorch 上游在 torch/fx/experimental/symbolic_shapes.py 中将其用于 ShapeEnv 内部查询缓存。 | 补充测试验证缓存 miss / hit、版本变化后重新计算、cache_infocache_clearmaxsize。 | | torch.fx.experimental.symbolic_shapes.CallMethodKey | 用于描述 pytree key path 中的无参方法调用,并通过 __str__ 表示路径片段,例如 .size()。 | PyTorch 官方公开文档已收录;未检索到直接专项测试;PyTorch 上游在 symbolic shapes unbacked binding 路径中使用 CallMethodKey("size")CallMethodKey("stride")CallMethodKey("storage_offset")。 | 补充 NPU Tensor 测试验证 dataclass 相等 / hash、字符串表达和 key path 稳定性。 | | torch.fx.experimental.symbolic_shapes.CallMethodKey.get | 通过 getattr(o, name)() 调用对象上的无参方法并返回结果。 | PyTorch 官方公开文档已收录;未检索到直接专项测试;PyTorch 上游在 symbolic shapes unbacked binding 路径中使用 CallMethodKey("size")CallMethodKey("stride")CallMethodKey("storage_offset")get 是对应 key path 取值方法。 | 补充 NPU Tensor 测试验证 size()stride()storage_offset()dim() 等无参方法调用结果。 | | torch.fx.experimental.symbolic_shapes.canonicalize_bool_expr | 将 SymPy 布尔表达式规范化为稳定的 lt / le / eq / ne 形式,并递归处理 And / Or / Not。 | PyTorch 官方公开文档已收录;未检索到直接专项测试;PyTorch 上游 ShapeEnv 约束化简、等价关系和 guard 处理链路多处调用该函数。 | 补充 SymPy 表达式测试,覆盖 GeGtEqNeAndOrNot 和非布尔表达式。 | | torch.fx.experimental.symbolic_shapes.check_consistent | 检查两份 meta 值是否一致,覆盖 Tensor 维度 / shape 和标量值;bool 与未知类型会跳过一致性检查。 | PyTorch 官方公开文档已收录;未检索到直接专项测试;当前按实现语义补充 NPU 直接验证。 | 补充 NPU Tensor 与标量测试,覆盖一致、Tensor shape / dim 不一致、int / float 不一致、bool 与未知类型跳过场景。 | 主要开发思路: 1. 先确认目标 API 在 torch.fx.experimental.symbolic_shapes 模块中均可导入,并在 torch + torch_npu 多版本环境中可运行。 2. 复核 PyTorch 官方公开文档,torch.fx.experimental.symbolic_shapes.CallMethodKeytorch.fx.experimental.symbolic_shapes.CallMethodKey.gettorch.fx.experimental.symbolic_shapes.canonicalize_bool_exprtorch.fx.experimental.symbolic_shapes.check_consistent 均有公开文档条目。 3. 复核 PyTorch 源码,torch.fx.experimental.symbolic_shapes._lru_cache 在源码中存在并用于 ShapeEnv 版本感知缓存链路,但公开文档收录的是不同函数 torch.fx.experimental.symbolic_shapes.lru_cache。本任务目标明确为 _lru_cache,因此测试和资料均按 _lru_cache 处理。 4. 检索 torch-npu 当前仓库的 test 目录,未发现本组 5 个 API 的直接专项测试。 5. 本组 API 位于 torch.fx.experimental.symbolic_shapes,属于 PyTorch FX dynamic shapes / ShapeEnv / meta 检查工具链路。 6. 当前未发现需要修改 torch-npu API 实现的问题,因此本 PR 不做 API 功能补齐代码。 7. 因未找到 PyTorch 官方直接专项测试,本 PR 不走 test_upstream patch 路径,而是在 torch-npu test 目录补充自写 NPU 测试。 8. 按目标分支实际基线处理 test/fx/test_symbolic_shapes_api.py:已有该文件的版本在原文件基础上追加本组任务 API 用例,未包含该文件的2.80版本新增同路径测试文件。 9. 补充测试涉及 Tensor 的部分均迁移到当前 accelerator,确保验证 NPU Tensor 路径。 本 PR 覆盖以下 5 个任务目标项: | API / 工具链路 | 验证内容 | | --- | --- | | torch.fx.experimental.symbolic_shapes._lru_cache | 验证 ShapeEnv 版本感知缓存、缓存命中、版本变化后重新计算、cache_infocache_clearmaxsize。 | | torch.fx.experimental.symbolic_shapes.CallMethodKey | 验证 frozen dataclass 的相等 / hash 行为和路径字符串表达。 | | torch.fx.experimental.symbolic_shapes.CallMethodKey.get | 验证 get 可在 NPU Tensor 上调用 size()stride()storage_offset()dim() 并返回正确结果。 | | torch.fx.experimental.symbolic_shapes.canonicalize_bool_expr | 验证 GeGtEqNeAndOrNot 和非布尔表达式的规范化结果。 | | torch.fx.experimental.symbolic_shapes.check_consistent | 验证 NPU Tensor meta 值、标量值、异常路径、bool 跳过和未知类型跳过行为。 | 测试文件变更: ```text test/fx/test_symbolic_shapes_api.py ``` 其中已有该文件的目标分支为修改原文件并追加测试方法;目标分支没有该文件时为新增同路径文件。 补充测试方法: ```text test_lru_cache_handles_hits_clears_and_maxsize test_call_method_key_get_on_npu_tensor test_canonicalize_bool_expr test_check_consistent_on_npu_tensor_and_scalars ``` 各测试核心验证点如下: | 测试方法 | 核心验证点 | | --- | --- | | test_lru_cache_handles_hits_clears_and_maxsize | 构造带 _version_counter_get_key() 的 ShapeEnv-like 对象;验证 _lru_cache 的 miss / hit、版本变化后重新计算、cache_clearcache_infomaxsize=1 淘汰行为。 | | test_call_method_key_get_on_npu_tensor | 在 NPU Tensor 上验证 CallMethodKey("size") 的字符串表达、相等 / hash 行为,并验证 size()stride()storage_offset()dim()get 调用结果。 | | test_canonicalize_bool_expr | 验证 Ge / Gt 改写为 Le / LtEq / Ne 整系数约分,And / Or / Not 递归规范化,以及非布尔表达式保持原值。 | | test_check_consistent_on_npu_tensor_and_scalars | 验证 NPU Tensor shape / dim 一致时通过,不一致时抛出包含 old != newRuntimeError,同时验证 int / float 一致性、异常路径、bool 跳过和未知类型跳过。 | # 【资料变更】 本组 API 的资料补齐已通过独立文档 PR 提交。 # 【接口变更】 不涉及。 # 【功能验证】 执行命令: ```bash cd /root python /workspace/pytorch/test/fx/test_symbolic_shapes_api.py ``` 执行结果: ```text .... ---------------------------------------------------------------------- Ran 4 tests in 6.261s OK ``` 最终验证结论: 1. 本 PR 补充 4 个 NPU 测试,覆盖 5 个任务目标 API / 工具链路的主要功能点。 2. 补充测试不仅验证 API 可导入和可调用,也验证缓存行为、key path 方法调用、SymPy 表达式规范化、NPU Tensor shape 一致性检查和异常路径。 3. 补充测试涉及 Tensor 的部分均在当前 accelerator 上执行。 4. 目标 API 当前行为符合预期,未发现需要 API 功能补齐的问题。 5. 本 PR 不修改 API 实现,不涉及接口变更。 # 【CheckList】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!365035 天前
test(dynamo): add NPU alignment tests for unspecified symbols Co-authored-by: litianyu2026<1483211810@qq.com> # message auto-generated for no-merge-commit merge: !35864 merge test-unspecified-symbols into master test(fx): add NPU alignment tests for unspecified symbols Created-by: litianyu_2026 Commit-by: litianyu2026 Merged-by: ascend-robot Description: # 【合入来源】 > <font color="red">https://gitcode.com/Ascend/pytorch/issues/1623</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 1. **架构上下文补充说明(CPU vs NPU)**: 本次任务涉及的ShapeEnv` 系列接口属于 PyTorch Dynamo 编译引擎前端(图追踪阶段)的基础设施。其核心功能是在编译期处理动态形状推导中的逻辑符号对象(如产生SymInt, SymFloat或施加运行时期望断言),而非处理存储实际数据的物理张量(Tensor)。因此,这些接口的逻辑天然且必须在宿主机(CPU)上由 Python/SymPy 解释器完成,物理上无法也不需要迁移至 NPU 设备执行。本次 NPU 一致性对齐的核心目的,是验证昇腾编译后端在接收到前端抛出的这些未确定动态符号时,能否正确解析包装且不发生编译期崩溃。 2. 本PR属于开源实习任务中的功能测试用例补齐。该任务共包含 5 个ShapeEnv相关接口。经客观排查与环境验证: -torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unbacked_symfloat与torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unbacked_symint官方已具备完善的原生用例覆盖,在 NPU 环境下天然支持。 -torch.fx.experimental.symbolic_shapes.ShapeEnv.defer_runtime_assert接口已在 v2.7.1 跑通官方原生用例,且自 v2.8.0 起被官方重命名为torch.fx.experimental.symbolic_shapes.ShapeEnv.guard_or_defer_runtime_assert,高版本已包含原生覆盖。 - 以上 3 个接口属于 NPU 天然支持/上游变更,无需在本仓补充代码。 3. 上游 PyTorch 官方测试库中,对核心接口torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unspecified_symbol和torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unspecified_symint_and_symbol的测试存在空白。本 PR 专门在test/fx/目录下新增专项测试文件test_unspecified_symbols.py进行看护。 4. 新增测试用例严格根据底层源码逻辑进行设计: - 针对create_unspecified_symbol:重点验证传入0和1边界值时,触发其内部do_not_specialize_zero_one=True特性,断言其返回未确定的符号表达式对象(自由符号),确保其不被静态折叠。 - 针对create_unspecified_symint_and_symbol:验证其成功将底层的符号表达式正确包装并转化为上层编译栈所需的SymInt类型对象。 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及。 经核查官方文档目录https://gitcode.com/Ascend/pytorch/tree/v2.7.1/docs/zh/native_apis,本次对齐的torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unspecified_symbol等接口属于torch.fx.experimental下的底层编译期实验性内部接口,非对外暴露的常规 Native API。该文档目录严格记录向外部最终用户开放的稳定核心算子与工具级 API,本内部方法不属于该文档的收录统计范围,故无需在 md 文件中补充登记,当前资料状态已核查闭环。 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 1. 测试场景:昇騰 NPU 单卡算力开发环境,执行图追踪核心工具类接口的功能一致性、边界值看护与原生用例兼容性验证。 2. 测试方法: - 新增自主测试:针对存在上游测试空白的接口,执行新增的专项看护脚本。 - 原生用例复测:针对上游已覆盖的接口,直接在 NPU 环境下复测原生测试集,验证底层符号推导的兼容性。 3. 测试步骤: - 步骤一:执行新增看护用例 验证torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unspecified_symbol与torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unspecified_symint_and_symbol接口: 执行命令如下: ```bash python ./fx/test_unspecified_symbols.py ``` ![image.png](https://raw.gitcode.com/user-images/assets/7404318/591d2af7-07a2-4a92-9678-db5586ebc876/image.png 'image.png') - 步骤二:执行官方原生用例看护 验证torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unbacked_symfloat和torch.fx.experimental.symbolic_shapes.ShapeEnv.create_unbacked_symint接口,这两个接口可同时在test/dynamo/test_misc.py中的test_shape_env_equal_unbacked下一起验证。 由于原生用例test_shape_env_equal_unbacked涉及特殊的图编译验证,在本地执行时需进行以下特殊处理: 1.注释@onlyIfTranslationValidation装饰器:该装饰器限制了用例仅在开启 Translation Validation(翻译验证)的环境下激活。本地测试环境默认未使能 TV 导致用例被跳过(Skipped),为了在本地环境中强制触发并验证该用例在 NPU 底座下的兼容性,需手动注释此行限制。 2. 使用EXPECTTEST_ACCEPT=1环境变量:该用例底层引入了expecttest框架进行符号环境输出的字面量强比对。在本地强制执行该用例时,由于环境差异或输出格式的微调,会导致原硬编码的预期字符串(Expect String)不匹配。通过声明EXPECTTEST_ACCEPT=1,可指示测试框架自动接受当前的实际正确运行输出,并自动覆写/刷新代码中的预期字面量,从而完成校验闭环。 执行命令如下: ```bash EXPECTTEST_ACCEPT=1 python ./dynamo/test_misc.py -v -k test_shape_env_equal_unbacked ``` ![60dbfbfc4b5fd97da38546faecf61ff.png](https://raw.gitcode.com/user-images/assets/7404318/201e6803-eb7f-4f4a-b094-3807df84a759/60dbfbfc4b5fd97da38546faecf61ff.png '60dbfbfc4b5fd97da38546faecf61ff.png') - 步骤三:执行官方原生用例看护 验证torch.fx.experimental.symbolic_shapes.ShapeEnv.defer_runtime_assert接口,该接口可同时在test/test_dynamic_shapes.py中的test_floor_clean_div_axioms下验证。 执行命令如下: ```bash python ./test_dynamic_shapes.py -v -k test_floor_clean_div_axioms ``` ![5d9654c44a518a7664f29bcc6244ae1.png](https://raw.gitcode.com/user-images/assets/7404318/a276ffd3-2e33-4cde-9e67-71d00aff5c8b/5d9654c44a518a7664f29bcc6244ae1.png '5d9654c44a518a7664f29bcc6244ae1.png') # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!358644 天前
!9596 The test cases of fx support NPU. Merge pull request !9596 from 王夏夏/master 2 年前