已合并
test(fx): add NPU test cases and patch for torch.fx.node APIs #37787
hantao55_创建于 6月6日
test(fx): add NPU test cases and patch for torch.fx.node APIs #37787
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 hantao55_ 的贡献)ascend-robot
6月6日 评论:
6月6日 评论:
6月6日 添加了label:stat/needs-squash
6月6日 添加了label:ascend-cla/no
此处折叠了47条消息 查看更多
sunyu-xuan
6月10日 评论:
6月10日 评论:
/lgtm


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


【合入来源】
【修改方案】
一、API功能说明
API范围:
torch.fx.Node是torch.fx.Graph中的基本执行单元,以双向链表形式组织。上述15个API属于PyTorch torch.fx框架层的图节点操作与工具函数:
二、测试用例完备性说明
(一)以下API在PyTorch官方test/test_fx.py中有对应测试函数,且用例全程操作的是图结构对象(Node/Graph),不创建也不执行任何Tensor计算,与设备完全无关,天然兼容NPU环境:
各测试函数无Tensor计算的具体依据:
(二)PyTorch官方有用例且需要NPU适配的API
用例文件:test/dynamo/test_functions.py
测试函数:test_fx_map_aggregate(直接覆盖)
用例中创建torch.randn(4)并执行y * 2乘法计算,同时通过torch.compile编译执行,Tensor是核心被测对象,需迁移到NPU。
以下2个API在官方测试中有Tensor计算,但经实际验证确认无需NPU适配:
torch.fx.Node.is_impure
用例文件:test/fx/test_dce_pass.py
测试函数:test_impure_nodes_args、test_impure_kwargs、test_impure_custom
is_impure()是纯Python属性判断(判断节点是否有副作用),与设备无关。测试中的m(*inputs)是验证DCE变换前后模型输出一致的兜底验证,不是验证is_impure本身的NPU行为。
实际运行原始社区用例(CPU),三个测试函数全部通过,无需NPU适配。
运行命令:
python -m unittest
fx.test_dce_pass.TestDCE.test_impure_nodes_args
fx.test_dce_pass.TestDCE.test_impure_kwargs
fx.test_dce_pass.TestDCE.test_impure_custom -v
运行结果:Ran 3 tests / OK
torch.fx.Node.normalized_arguments
用例文件:test/test_fx_experimental.py
测试函数:test_normalize_modules_exhaustive
normalized_arguments将节点args+kwargs按函数签名规范化,为纯Python图操作,与设备无关。测试中的traced(*inputs)/mod(*inputs)是归一化变换后的兜底验证,不是验证normalized_arguments的NPU行为。尝试迁移到NPU时,因穷举所有torch.nn模块触发了两类无关报错:
(1)PadV3算子库未加载(含padding的卷积模块)
(2)complex128 dtype不支持aclnnIsClose(复数类模块)
两个报错均与torch.fx.Node.normalized_arguments无关,证明Tensor是配角。
社区原有CPU测试已充分覆盖该API全部功能,无需NPU适配。
(三)PyTorch官方无用例、需新增用例的API
以下API在PyTorch官方测试目录中无直接测试函数,经全量搜索确认:
新增用例文件:test/fx/test_fx_node_api.py
覆盖上述API的核心功能,已测试验证通过。
三、API适配方案
API源码无需修改:上述涉及API均为PyTorch框架层图操作,不涉及NPU kernel开发或算子注册。
情况(一)涉及API:社区原有用例天然兼容NPU环境。
情况(二)涉及API(torch.fx.node.map_aggregate):
在test_upstream/test/dynamo/test_functions.py.patch中,调用npu(),采用最小化原则,不影响文件内其他测试函数。
情况(三)涉及API:新增test/fx/test_fx_node_api.py,涵盖_type_repr、Node.kwargs(getter/setter/use-def更新)、map_arg(节点收集/非节点穿透/嵌套结构/callable校验)、Node.next/prev(基本顺序/append-prepend后的顺序变化/next-prev一致性)。上述API均为纯图结构/字符串操作,不涉及Tensor,无需设备适配。
【资料变更】
已检查API支持清单。变更如下:
(1)以下涉及API在文档中已有记录但标注为"否",本次更正为"是":
torch.fx.Node.all_input_nodes、torch.fx.Node.args、torch.fx.Node.kwargs、
torch.fx.Node.next、torch.fx.Node.prev
(2)以下涉及API在文档中完全缺失,本次新增记录("是"):
torch.fx.node._type_repr、torch.fx.Node.insert_arg、
torch.fx.node.map_arg、torch.fx.node.map_aggregate
【接口变更】
不涉及
【功能验证】
验证环境如下
操作系统:Ubuntu
昇腾硬件:800I A2
CANN软件版本:8.5.0
2.9.0:torch 2.9.0+cpu / torch-npu 2.9.0
运行命令与结果:
【CheckList】