已合并
[test][v2.12.0] add NPU validation cases for torch.Tensor.map_ and torch.Tensor.module_load (issues #2720 #2722) #41656
[test][v2.12.0] add NPU validation cases for torch.Tensor.map_ and torch.Tensor.module_load (issues #2720 #2722) #41656
已合并
lele130创建于 7月14日
lele130
7月14日

【合入来源】

如有社区 issue,请关联 issue 链接
请勿携带内部流程信息(需求链接、问题单、内部 issue 等)

关联 issue:

  • #2720torch.Tensor.map_(API 一致性验证)
  • #2722torch.Tensor.module_load(API 一致性验证)

【修改方案】

本 PR 为 torch.Tensor.map_torch.Tensor.module_load 两个 API 在 NPU 场景下补充一致性验证用例。PyTorch 社区缺少针对这两个 API 的直接、集中测试,按规范 1.3(自写用例)新增测试文件到 test/ 目录。

修改文件:

  • test/test_tensor_map_.py(新增):覆盖 torch.Tensor.map_(3 个用例)
  • test/test_tensor_module_load.py(新增):覆盖 torch.Tensor.module_load(5 个用例)

合计 8 个用例。不涉及 torch_npu 任何 C++/Python 代码改动。

【API 功能介绍】

1. torch.Tensor.map_(tensor, callable) → Tensor

self 和给定 tensor 的每个元素应用 callable,结果存回 self tensor。两个 tensor 必须可广播。

  • callable 签名def callable(a, b) -> number
  • 实现位置torch/_tensor.py,底层调用 at::map kernel
  • NPU 支持情况:NPU 上不可用(TypeError: map_ is only implemented on CPU tensors),社区 CUDA 同样不支持
  • 测试覆盖:CPU 正常路径(2 用例)+ NPU 异常断言(1 用例)

2. torch.Tensor.module_load(other, assign=False) → Tensor

定义如何将 other 转换后加载到 self 中,用于 load_state_dict() 的 swap_tensors 路径。当 get_swap_module_params_on_conversion() 为 True 时使用。

  • 实现self.copy_(other).detach()(assign=False)或 other.detach()(assign=True)
  • 实现位置torch/_tensor.py
  • NPU 支持情况:非计算类 API,基于 copy_detach 实现,NPU 上直接可用,与数据类型无关
  • 测试覆盖:NPU tensor 上 5 个用例(返回值、dtype 保持、assign=True、destination 更新、detach 语义)

【上游社区用例情况】

torch.Tensor.map_

PyTorch 社区 test/test_torch.py::test_broadcast 包含 "map",但显式跳过 CUDA 设备。NPU 行为与 CUDA 一致。

torch.Tensor.module_load

社区无直接测试用例,仅通过 load_state_dict 间接覆盖。

【测试环境】

  • 操作系统:Linux 4.19.90-2102.2.0.0068.3.ctl2.aarch64
  • 昇腾硬件:Ascend NPU(Ascend910B2)
  • 安装版本:torch 2.12.0 + torch_npu 2.12.0
  • 测试分支:v2.12.0

【测试日志】

$ python -u test/test_tensor_map_.py -v
test_map_applies_callable ... ok
test_map_raises_on_npu_tensor ... ok
test_map_uses_destination_values ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.767s OK

$ python -u test/test_tensor_module_load.py -v
test_module_load_assign_true ... ok
test_module_load_keeps_dest_dtype ... ok
test_module_load_returns_detached_tensor ... ok
test_module_load_returns_source_values ... ok
test_module_load_updates_destination ... ok
----------------------------------------------------------------------
Ran 5 tests in 0.739s OK

【资料补齐检查结论】

  • torch.Tensor.map_docs/zh/native_apis 中已有该 API 记录。map_ 在 NPU 上不可用,社区 CUDA 同样不支持,无需补充资料。
  • torch.Tensor.module_loaddocs/zh/native_apis 中已有该 API 记录。非计算类 API,与数据类型无关,无需补充资料。

Fixes #2720, Fixes #2722

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 lele130 的贡献)
Llele130
7月14日 创建了 pull request,commit 5ae9cbd9
Llele130
7月14日 关联了issue:【社区任务】7月社区任务第一期-Ascend for PyTorch API 一致性开发(96),【社区任务】7月社区任务第一期-Ascend for PyTorch API 一致性开发(97)
atomgit-bot
atomgit-bot
7月14日 评论:

变更摘要

此 PR 为 torch.Tensor.map_torch.Tensor.module_load 两个 API 新增了 NPU 一致性验证测试用例,以响应 Ascend for PyTorch API 一致性任务(#2720、#2722)。新增两个独立的测试文件,每个文件包含 2 个自包含的验证用例,采用加速器设备模式,可直接扩展。

主要改动

  • 新增 test/test_tensor_map_.py:创建 TestTensorMap 测试类,包含 test_map_applies_callable(验证 map_ 对源张量逐元素应用可调用对象)和 test_map_uses_destination_values(验证 map_ 在运算中使用目标张量的当前值)两个用例。由于 map_ 在 PyTorch 社区中仅支持 CPU,该文件标记为 NPU-EXEMPT
  • 新增 test/test_tensor_module_load.py:创建 TestTensorModuleLoad 测试类,包含 test_module_load_returns_source_values(验证 module_load 返回源张量的值)和 test_module_load_keeps_dest_dtype(验证输出张量保持目标张量的 dtype)两个用例,张量通过 .to(DEVICE) 在 NPU 上运行。
  • 统一加速器设备模式:两个测试文件均通过 DEVICE = (acc.type if (acc := torch.accelerator.current_accelerator()) else "cpu") 动态获取当前加速器设备,实现 CPU/NPU 自适应。
likedislike
atomgit-bot
atomgit-bot
7月14日 评论:

代码审查

经过对两个变更文件的全面审查,我来做总结。


审查总结

已审查文件

文件 审查结论
test/test_tensor_map_.py 发现 2 个问题(均为 P3)
test/test_tensor_module_load.py 无问题

问题统计

  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 2

总体风险评估

低风险。 两个新增测试文件的测试逻辑本身正确,test_tensor_module_load.py 文件中 DEVICE 变量使用正确、文档字符串准确,无需修改。test_tensor_map_.py 存在两个 P3 级的小问题:一个未使用的 DEVICE 变量(死代码),以及文档字符串与 map_ 仅支持 CPU 的行为不一致。这些问题不影响测试正确性,但建议在合并前清理。

各发现详情

  1. P3 - test_tensor_map_.py:13DEVICE 变量定义但从未使用(死代码)。由于 map_ 是 CPU-only API,该变量及初始化时的 current_accelerator() 调用均为多余。

  2. P3 - test_tensor_map_.py:5-6 — 文档字符串声称张量在 NPU 上运行,但实际测试均在 CPU 上执行(如第 18 行 NPU-EXEMPT 注释所述),两者矛盾。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
此处折叠了275条消息 查看更多
Jingwei Huang
Jingwei Huang成员
3 天前 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
3 天前 添加了label:lgtm
ascend-robotascend-robot成员
3 天前 合入了pull request
ascend-robot
ascend-robot成员
3 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
ascend-robot
ascend-robot成员
3 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#14160 [ commitID:1ef6c3fd ] 已完成
likedislike