已合并
[test][v2.7.1] add NPU validation cases for torch._functorch.config.patch and _add_batch_dim (issues #2687 #2688) #41382
ggg_0963创建于 7月12日
[test][v2.7.1] add NPU validation cases for torch._functorch.config.patch and _add_batch_dim (issues #2687 #2688) #41382
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 ggg_0963 的贡献)atomgit-bot
7月12日 评论:
7月12日 评论:
变更摘要
此 PR 为 PyTorch functorch 模块新增了两个 NPU 设备上的测试文件,分别覆盖 torch._functorch.config.patch API 和 torch._functorch.vmap._add_batch_dim API 的验证用例。这些用例补充了社区中这两个 API 缺乏直接且充分验证的不足,确保它们在 NPU 设备上的行为正确性。
主要改动
- 新增
test_functorch_config_api.py:添加TestFunctorchConfigPatch测试类,包含 5 个用例,验证config.patch上下文管理器的基本用法、字典参数传入、异常后恢复、嵌套上下文以及 NPU 张量操作场景下的正确性。 - 新增
test_vmap_add_batch_dim_api.py:添加TestVmapAddBatchDim测试类,包含 7 个用例,验证_add_batch_dim在 NPU 上的基本功能、与vmap配合使用、嵌套vmap、与nn.Linear模型结合、不同in_dims和out_dims参数以及梯度计算场景下的正确性。 - 所有测试用例均以 NPU 为目标设备:通过
device_type = "npu"统一指定设备类型,确保张量创建和操作均在 NPU 上执行,并验证结果的设备属性。


ascend-robot
7月12日 评论:
7月12日 评论:
atomgit-bot
7月12日 评论:
7月12日 评论:
代码审查
审查总结
审查文件清单:
test/functorch/test_functorch_config_api.py— 已审查,发现 1 个 P3 可选改进建议test/functorch/test_vmap_add_batch_dim_api.py— 已审查,发现 1 个 P2 潜在导入问题
按优先级统计:
- P0:0
- P1:0
- P2:1(
_add_batch_dim导入路径与现有代码不一致) - P3:1(
except RuntimeError: pass过于宽泛,可选改进)
整体风险评估: 低风险。两个新增测试文件均为 NPU 设备的 API 验证用例,测试逻辑本身正确。主要关注点是 test_vmap_add_batch_dim_api.py 第 7 行的导入路径 from torch._functorch.vmap import _add_batch_dim 与现有代码库中使用的 torch._C._functorch._add_batch_dim 不一致,存在导入失败的可能。建议在合入前确认该导入路径的有效性。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


7月12日 添加了label:ascend-cla/no
此处折叠了410条消息 查看更多
Jingwei Huang
9 天前 评论:
9 天前 评论:
/lgtm


9 天前 添加了label:lgtm
9 天前 合入了pull request
ascend-robot
9 天前 评论:
9 天前 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


ascend-robot
9 天前 评论:
9 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#13884 [ commitID:2d3b8bf1 ] 运行失败


【合入来源】
torch._functorch.aot_autograd.aot_compile_joint_with_descriptors(一期任务 任务61(#2684))torch._functorch.aot_autograd.aot_export_joint_with_descriptors(一期任务 任务62(#2685))torch._functorch.config.patch(一期任务 任务64(#2687))torch._functorch.vmap._add_batch_dim(一期任务 任务65(#2688))【修改方案】
本 PR 覆盖 4 个
torch._functorch.*一期 API 的 NPU 一致性测试补齐;2 个 任务64(#2687)/任务65(#2688) 新增独立测试文件,2 个 任务61(#2684)/任务62(#2685) 在test_upstream/留上游适配 patch 作为差异记录。本 PR 不涉及
torch_npu任何C++ / Python代码改动,也不修改torch_npu既有 patch。修改文件:
test/functorch/test_functorch_config_api.py(新增):覆盖torch._functorch.config.patch(7 个用例)test/functorch/test_vmap_add_batch_dim_api.py(新增):覆盖torch._functorch.vmap._add_batch_dim(11 个用例:7 个 vmap 集成 + 4 个_add_batch_dim直接 API 调用)test_upstream/test/functorch/test_aot_joint_with_descriptors.py.patch(v2.7.1 分支不新增,因release/2.5/release/2.7上游尚无该文件)合计新增 20 个独立测试用例(7 + 13),全部 NPU 实测通过;aot patch 不参与运行测试。
【API 功能介绍】
torch._functorch.config.patch(key_or_dict, value=...):torch._functorch命名空间下的配置项,退出 with 块后自动恢复(支持嵌套、异常路径恢复)key: str+value,或dict[str, value]Nonetorch/_functorch/config.pytorch._functorch.vmap._add_batch_dim(x, batch_dim, vmap_level):torch.vmap内部实现的关键原语之一torch/_functorch/vmap.pytorch._functorch.aot_autograd.aot_compile_joint_with_descriptors(...):nn.Module。与 aot_export_joint_with_descriptors 配对使用torch._functorch.aot_autograd.aot_export_joint_with_descriptors(...):【测试方案】
20 个独立用例的设计:
config.patch(7 个用例):test_basic_patch:单 key patch,验证进入/退出作用域时配置值正确切换/恢复test_patch_dict:dict 批量 patch,验证多个配置项同时修改test_patch_restore_after_exception:异常恢复,验证作用域内抛异常后配置仍能正确恢复test_patch_nested:嵌套 patch,验证多层嵌套上下文正确生效/恢复test_patch_with_tensor_device:NPU 张量兼容性,验证 patch 上下文中 NPU 张量运算正常_add_batch_dim间接(vmap 集成,7 个用例):test_add_batch_dim_basic:基础调用,验证_add_batch_dim返回非空 Tensor + shape/device 正确test_add_batch_dim_with_vmap:vmap 集成,验证 vmap 内部自动调用_add_batch_dim的正确性test_add_batch_dim_nested_vmap:嵌套 vmap,验证多层 vmap 的 batch dim 传播test_add_batch_dim_with_model:模型场景,验证 vmap 在 nn.Module 上的正确性test_add_batch_dim_in_dims:不同 in_dims,验证 0/1/-1 三种 batch dim 位置test_add_batch_dim_out_dims:不同 out_dims,验证 0/1 两种输出位置test_add_batch_dim_with_grad:梯度计算,验证 vmap 内梯度反向传播正确_add_batch_dim直接调用(4 个新增用例,验证 API 在脱离 vmap 框架时的契约):test_add_batch_dim_direct_3d_batch_dim_0:3D 张量 +batch_dim=0,验证返回 shape=(4,5) 与 dtype/device 不变test_add_batch_dim_direct_3d_batch_dim_1:3D 张量 +batch_dim=1,验证返回 shape=(3,5)test_add_batch_dim_direct_3d_batch_dim_2:3D 张量 +batch_dim=2,验证返回 shape=(3,4)test_add_batch_dim_direct_preserves_dtype_and_device:dtype 与 device 透传一致性直接用例设计说明:用 3 个正向 batch_dim (0/1/2) 在 3D 张量 (3,4,5) 上的版本无关用例;负 batch_dim(如 (2,3) + bdim=-1 → 期望 shape=(3,))在 torch 2.12+ predispatch 会先把负 batch_dim 转为正(
batch_dim = self.ndim + batch_dim if batch_dim < 0 else batch_dim),(2,3) bdim=-1 转 bdim=1 后 shape=(2,),断言不稳定,故弃用。shape 在 2.9 / 2.12 / main 全版本一致。aot_compile_joint_with_descriptors/aot_export_joint_with_descriptors:上游test/functorch/test_aot_joint_with_descriptors.py在 NPU 上的适配 patch 已落盘test_upstream/test/functorch/test_aot_joint_with_descriptors.py.patch,作为与上游差异的留存。由于 任务61(#2684) 任务62(#2685) 的 AOT API 在release/2.5/release/2.7上游尚未出现(release/2.9才引入),本 PR 在 v2.7.1 分支不新增 aot patch。【测试环境】
torch.npu.is_available()验证,torch.npu.device_count() == 4)v2.7.1/home/openmind/code/torch-npu-fork/test/functorch/【测试命令】
cd /home/HwHiAiUser/workspace/pytorch-test/torch-npu source env.sh git checkout v2.7.1 python -u test/functorch/test_functorch_config_api.py -v python -u test/functorch/test_vmap_add_batch_dim_api.py -v【测试日志】(本 PR 测试用例清单,按 test method 名顺序)
torch 2.7.1+cpu, npu=2
======== test_functorch_config_api.py (7 cases) ========
Ran 7 tests in 0.536s
OK
======== test_vmap_add_batch_dim_api.py (13 cases) ========
Ran 13 tests in 0.467s
OK