已合并
test(nn): add test for fx.tracer.call_module_2.9.0 #38070
test(nn): add test for fx.tracer.call_module_2.9.0 #38070
已合并
咿咿呀呀创建于 6月10日
咿咿呀呀
6月10日

【合入来源】

[Usage]: pytorch社区用例缺少对torch.fx.Tracer.call_module的测试,在现有test/fx/test_fx_tracer_transformer_api.py中补充用例验证NPU正确性

API 功能

API:

torch.fx.Tracer.call_module

功能:

Tracer.call_module 是 PyTorch FX 符号追踪(Symbolic Tracing)过程中的核心钩子函数之一,它充当了模块调用行为与 FX 计算图节点之间的转换桥梁。torch.fx.Tracer.call_module 的主要职责是在追踪(Trace)阶段,拦截对 nn.Module 子模块的调用操作,并将其转化为计算图(Graph)中的一个 call_module 节点。在 PyTorch FX 的设计中,Tracer 通过该方法完成模块调用的符号化记录,确保模型中的子模块调用能够被正确转换为计算图节点,同时保留模块名称、参数传递、节点依赖等关键信息,为后续计算图优化、代码生成、模型转换等流程提供可靠的结构支撑,是 FX 追踪流程中模块调用节点生成的核心环节。

【修改方案】

一、追加到现有文件而非新建

test/fx/test_fx_tracer_transformer_api.py 已是 Tracer/Transformer API 的聚合测试文件(含 trace、path_of_module、iter、keys、proxy、to_bool、getattr 等),fx.Tracer.call_module 同属 Tracer 方法,追加到该文件中可避免文件碎片化,便于后期维护。

二、在test/fx/test_fx_tracer_transformer_api.py中追加用例进行全场景、全维度、全覆盖测试。
主要内容包含setUp → 初始化 Tracer / Graph、_create_placeholder → 工具函数、13 个完整测试用例。
新增 TestTracerCallModule测试用例说明表

测试函数名 功能描述
setUp 初始化 Tracer、空计算图与根模块,为每个用例提供独立运行环境
_create_placeholder 工具函数 创建图占位节点并返回 Proxy,简化用例编写
test_call_module_creates_node_in_graph 验证 call_module 可合法创建图节点并插入计算图
test_call_module_returns_proxy_with_correct_node 验证返回合法 Proxy,节点类型、目标名称正确
test_call_module_preserves_positional_args 验证多位置参数能正确绑定到节点 args
test_call_module_preserves_kwargs 验证关键字参数能正确保留到节点 kwargs
test_call_module_chains_multiple_calls 验证多模块连续调用,节点依赖关系正确
test_call_module_same_module_multiple_times 验证同一模块多次调用生成独立节点
test_call_module_with_nested_module_path 验证嵌套模块路径解析正确
test_call_module_with_sequential_indexing 验证 Sequential 容器索引调用正常
test_call_module_result_can_be_used_in_operations 验证 call_module 输出可参与符号计算
test_call_module_with_different_module_types 验证多类常见模块(Linear/Conv2d/ReLU 等)兼容调用
test_call_module_graph_contains_only_call_module_nodes 验证纯手动构建图无冗余节点
test_call_module_module_must_be_registered 验证未注册模块会抛出预期异常
test_call_module_with_single_arg 验证单参数调用场景参数绑定正确
test_call_module_preserves_output_for_further_tracing 验证构建的图可执行且计算结果正确

三、NPU适配

1、纯 Python 层抽象,无硬件相关逻辑
call_module API 仅负责「模块调用 → call_module 图节点」的符号映射,是纯逻辑层接口,不涉及任何硬件相关计算、内存、通信。
2、无底层算子 / 内核依赖
API 内部仅处理模块路径、参数代理、节点创建等图结构逻辑,不依赖 NPU/CUDA 相关扩展、驱动或算子内核。
3、核心逻辑与硬件解耦
- 模块调用解耦:只记录 “调用哪个子模块、传入什么参数”,不执行真实计算
- 参数传递解耦:无论输入是 CPU / NPU Tensor,节点生成逻辑完全一致
- 图结构解耦:生成节点仅保存符号信息,不携带设备标识
4、图构建上下文解耦
Tracer、Graph、root module 均为 FX 纯 Python 抽象,与硬件无关;
call_module 只做符号记录,不执行设备相关内存分配或算子下发。
5、测试验证的硬件无关性体现
- 所有用例均可在 NPU 环境稳定运行:
- NPU 张量输入不影响 call_module 节点生成规则
- 模块、代理、图结构在 NPU 上行为与标准环境完全一致
- 无需针对 NPU 修改任何 API 逻辑
简言之,call_module 是硬件无关的纯 Python 层图构建 API,核心逻辑不耦合任何特定硬件,因此在昇腾 NPU 上可直接复用、无需修改。

【资料变更】

已经在 https://gitcode.com/Ascend/pytorch/treeN2.7.1/docs/zh/native apis 的文档中进行查找与验证。该目录下的pytorch.2-7.1至pytorch.2-12-0文件夹下的torch-fx.md已经对"torch.fx.Tracer.call_module"全部标注"是"。无需更改。

image.png

image.png

image.png

image.png

image.png

【接口变更】

不涉及

【功能验证】

测试文件路径

test/fx/test_fx_tracer_transformer_api.py

验证环境

对应版本:torch-npu 2.9.0
操作系统:AlmaLinux 8.10
CANN 软件版本:8.5.0
安装的软件版本:torch、torch-npu 2.9.0

验证结果

[root@b33ba4bec663 test]# python -m pytest fx/test_fx_tracer_transformer_api.py::TestTracerCallModule -v
=================================================================== test session starts ===================================================================
platform linux -- Python 3.11.13, pytest-9.0.2, pluggy-1.6.0 -- /usr/local/bin/python
cachedir: .pytest_cache
rootdir: /home/ph/pytorch
configfile: pyproject.toml
collected 14 items                                                                                                                                        

fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_chains_multiple_calls PASSED                                           [  7%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_creates_node_in_graph PASSED                                           [ 14%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_graph_contains_only_call_module_nodes PASSED                           [ 21%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_module_must_be_registered PASSED                                       [ 28%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_preserves_kwargs PASSED                                                [ 35%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_preserves_output_for_further_tracing PASSED                            [ 42%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_preserves_positional_args PASSED                                       [ 50%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_result_can_be_used_in_operations PASSED                                [ 57%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_returns_proxy_with_correct_node PASSED                                 [ 64%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_same_module_multiple_times PASSED                                      [ 71%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_with_different_module_types 
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_with_different_module_types PASSED                                     [ 78%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_with_nested_module_path PASSED                                         [ 85%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_with_sequential_indexing PASSED                                        [ 92%]
fx/test_fx_tracer_transformer_api.py::TestTracerCallModule::test_call_module_with_single_arg PASSED                                                 [100%]

==================================================================== warnings summary =====================================================================
../../../../opt/_internal/cpython-3.11.13/lib/python3.11/site-packages/torch/jit/_script.py:365: 14 warnings
  /opt/_internal/cpython-3.11.13/lib/python3.11/site-packages/torch/jit/_script.py:365: DeprecationWarning: `torch.jit.script_method` is deprecated. Please switch to `torch.compile` or `torch.export`.
    warnings.warn(

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=================================================== 14 passed, 14 warnings, 5 subtests passed in 8.73s ====================================================
[root@b33ba4bec663 test]# 

结果说明

测试用例执行通过。

【CheckList】

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

  • ✅ 代码注释完备,正确记录错误日志
  • ✅ 代码实现进行了返回值、空指针等校
  • ✅ PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等
  • ✅ PR持续集成流水线(CI)执行通过,代码检查无异常
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 咿咿呀呀 的贡献)
咿咿呀呀
6月10日 创建了 pull request,commit e48aa1a6
咿咿呀呀
6月10日 关联了issue:[Usage]: pytorch社区用例缺少对torch.fx.Tracer.call_module的测试,在现有test/fx/test_fx_tracer_transformer_api.py中补充用例验证NPU正确性
ascend-robotascend-robot成员
6月10日 添加了label:ascend-cla/yes
ascend-robot
ascend-robot成员
6月10日 评论:

CLA Signature Pass

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

likedislike
ascend-robot
ascend-robot成员
6月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)
likedislike
ascend-robot
ascend-robot成员
6月10日 评论:

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

Protected Branch Version Release
master
v2.12.0
v2.11.0
v2.10.0
v2.9.0
v2.7.1
v2.7.1-26.1.0
v2.9.0-26.1.0
v2.12.0-26.1.0
v2.11.0-26.1.0
v2.10.0-26.1.0
ci-test
sync-pr28113--to-v2.9.0

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

注意:

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

compile

likedislike
ascend-robot
ascend-robot成员
6月10日 评论:

Ascend docs pipeline is running...

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

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

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

Ascend docs pipeline is running...

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

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

likedislike
ascend-robotascend-robot成员
6月10日 删除了label:docs-ci-pipeline-running
ascend-robotascend-robot成员
6月10日 删除了label:ci-pipeline-running
ascend-robotascend-robot成员
6月10日 添加了label:ci-pipeline-passed
ascend-robot
ascend-robot成员
6月10日 评论:
流水线 PR-pipeline_pytorch#30878 已完成
阶段 任务名 状态 详情
编译构建 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 >>>
likedislike
sunyu-xuan成员
6月10日 评论:

/lgtm

likedislike
liwei386成员
6月10日 评论:

/approve

likedislike
ascend-robotascend-robot成员
6月10日 添加了label:approvedlgtm
ascend-robotascend-robot成员
6月10日 合入了pull request
ascend-robot
ascend-robot成员
6月10日 评论:
流水线 pytorch_gitcode_PR_multiVersion#10428 [ commitID:cc34d393 ] 已完成
likedislike