已关闭
[Usage]: 【API一致性任务】torch.Tensor.__setstate__ #4679
coconut创建于  9月8日关闭于  9月28日
coconut
coconut
9月8日 创建

在提交新问题之前,请确保您已经在社区中搜索过相关问题,并使用了社区中提供的资源/工具后,仍未找到满意的解决方式。

环境信息

操作系统:Ubuntu
昇腾硬件信息:NPU
CANN软件版本:8.5.0
安装的对应软件版本:
torch 2.7.1、torch-npu 2.7.1
torch 2.9.0+cpu、torch_npu 2.9.0.post2
torch 2.10.0+cpu、torch_npu 2.10.0
torch 2.11.0+cu130、torch_npu 2.11.0rc1
torch 2.12.0+cu130、torch_npu 2.12.0rc1

使用场景及问题

来源任务

内容 链接
来源 Issue https://gitcode.com/Ascend/pytorch/issues/2677
v2.7.1 代码 PR https://gitcode.com/Ascend/pytorch/pull/42427
v2.11.0 代码 PR https://gitcode.com/Ascend/pytorch/pull/42446
v2.12.0 代码 PR https://gitcode.com/Ascend/pytorch/pull/42447
master 代码 PR https://gitcode.com/Ascend/pytorch/pull/42442

处理结论

根据 NPU API 一致性开发规范,本 Issue 用于记录 torch.Tensor.setstate 的源码依据、NPU 适配说明和实际运行结果。

  • setstate 是 Tensor 的内部状态恢复接口,官方社区用例对该行为缺少直接调用覆盖。
  • 关联代码 PR 中增加了直接调用 setstate 的测试用例,用于验证叶子 Tensor 和非叶子 Tensor 的行为。
  • 本说明性 Issue 不新增新的 test_upstream patch,不重复提交额外测试文件。
  • 测试使用当前加速器选择 NPU 设备,未通过 transfer_to_npu 对官方代码进行全局 monkey patch。

一、API 功能

torch.Tensor.setstate 用于恢复 Tensor 的内部状态。本次测试重点验证:

  1. 可以在当前 NPU 设备上创建 Tensor;
  2. 叶子 Tensor 调用 setstate 后可以正确更新 requires_grad;
  3. 非叶子 Tensor 调用 setstate 时会抛出预期的 RuntimeError。

二、社区用例覆盖情况

setstate 属于 Tensor 的内部状态恢复方法,PyTorch 社区测试主要通过序列化、JIT 或其他间接路径触发相关逻辑,缺少对该接口本身的直接行为验证。

因此,本任务需要补充直接 API 调用验证,确认 Ascend NPU 环境下的行为与原生 PyTorch 保持一致。

本次测试不包含 CUDA 到 NPU 的迁移路径,未使用:

tensor.cuda()
torch.cuda.*
device="cuda"

三、测试源码片段

关联代码 PR 中的测试文件:

test/test_tensor_setstate_api_completion.py

1. 根据当前加速器选择设备

device_type = acc.type if (acc := torch.accelerator.current_accelerator()) else "cpu"

当环境中启用 NPU 时,device_type 为 npu;没有可用加速器时才回退到 cpu。950PR 日志确认:

ACCELERATOR: npu
NPU_AVAILABLE: True

2. 验证叶子 Tensor 的状态更新

tensor = torch.ones(2, device=device_type)
self.assertFalse(tensor.requires_grad)

tensor.__setstate__((True, None, None))
self.assertTrue(tensor.requires_grad)

3. 验证非叶子 Tensor 的异常行为

with self.assertRaisesRegex(
    RuntimeError, "__setstate__ can be only called on leaf Tensors"
):
    (tensor + 1).__setstate__((False, None, None))

该片段验证非叶子 Tensor 调用 setstate 时抛出与原生 PyTorch 一致的异常类型和错误信息。

四、适配和验证方案

  1. 保持 torch.Tensor.setstate 的原生接口行为不变。
  2. 使用 torch.accelerator.current_accelerator() 获取当前设备,确保测试在 NPU 环境实际执行。
  3. 不使用 transfer_to_npu,避免全局 monkey patch 改变 PyTorch 原生语义。
  4. 验证叶子 Tensor 状态更新和非叶子 Tensor 异常校验两个核心行为。
  5. 在 910B3 和 Ascend950PR 环境分别运行对应版本测试,并保留完整日志。

五、产品支持情况

  • Atlas A2 训练系列产品:支持
  • Atlas A3 训练系列产品:支持
  • Ascend 950DT:支持

说明:

  • Atlas A2、Atlas A3 按 910 系列产品验证口径记录为支持;
  • Ascend 950DT 的结论来自 Ascend950PR 实际测试结果;
  • 950PR 测试过程中确认实际使用的是 NPU,而不是 CPU fallback。

六、910B3 验证结果

910B3 环境日志目录:

/workspace/tensor_api_fix_logs_20260908/

v2.7.1

torch=2.7.1+cpu
accelerator=npu
npu_available=True
device=npu:0

Ran 1 test in 1.423s
OK

v2.11.0

torch=2.11.0+cu130
accelerator=npu
npu_available=True
device=npu:0

Ran 1 test in 1.449s
OK

v2.12.0

torch=2.12.0+cu130
accelerator=npu
npu_available=True
device=npu:0

Ran 1 test in 1.463s
OK

master 分支此前也已在 910B3 环境完成定向验证:

torch=2.10.0+cpu
accelerator=npu
npu_available=True
device=npu:0

Ran 1 test in 1.460s
OK

七、Ascend950PR 验证结果

1. 硬件环境

NPU: Ascend950PR
Health: OK
npu-smi: 25.7.rc1

2. v2.7.1

COMMAND: /tmp/benchmark-api-venvs/torch271/bin/python -
PWD: /tmp
DATE: 2026-09-08 11:43:00 UTC

.
----------------------------------------------------------------------
Ran 1 test in 21.033s

OK
PYTHON: /tmp/benchmark-api-venvs/torch271/bin/python
TORCH_VERSION: 2.7.1+cpu
ACCELERATOR: npu
NPU_AVAILABLE: True
EXIT_CODE: 0

3. v2.11.0

COMMAND: /tmp/benchmark-api-venvs/torch211/bin/python -
PWD: /tmp
DATE: 2026-09-08 11:43:26 UTC

[W908 11:43:31.809899421 NPUCachingAllocator.cpp:201] Warning: The current CANN and Soc versions require processing for 32 padding size, with memory allocation.
(function operator())
.
----------------------------------------------------------------------
Ran 1 test in 2.474s

OK
PYTHON: /tmp/benchmark-api-venvs/torch211/bin/python
TORCH_VERSION: 2.11.0+cpu
ACCELERATOR: npu
NPU_AVAILABLE: True
EXIT_CODE: 0

4. v2.12.0

COMMAND: /tmp/benchmark-api-venvs/torch212/bin/python -
PWD: /tmp
DATE: 2026-09-08 11:43:33 UTC

[W908 11:43:38.916177150 NPUCachingAllocator.cpp:201] Warning: The current CANN and Soc versions require processing for 32 padding size, with memory allocation.
(function operator())
.
----------------------------------------------------------------------
Ran 1 test in 2.069s

OK
PYTHON: /tmp/benchmark-api-venvs/torch212/bin/python
TORCH_VERSION: 2.12.0+cpu
ACCELERATOR: npu
NPU_AVAILABLE: True
EXIT_CODE: 0

2.11.0 和 2.12.0 日志中的 NPU allocator warning 是 CANN 与 SoC 版本相关的提示,不影响测试结果;三个版本的测试退出码均为 0。

八、资料补齐

不涉及资料补齐。

torch.Tensor.__setstate__ 属于私有方法,根据资料补齐要求,私有方法无需补齐文档,因此不修改:

docs/zh/api/native_api/private_apis.md

## 九、最终结论

1. torch.Tensor.__setstate__ 的直接行为已通过测试用例覆盖。
2. 910B3 环境下对应版本测试均通过。
3. Ascend950PR 环境下 v2.7.1、v2.11.0、v2.12.0 测试均通过,且实际使用 NPU 设备。
4. 按本任务的产品归属口径,Atlas A2、Atlas A3 和 Ascend 950DT 记录为支持。
5. 测试未使用 CPU fallback 作为 950PR 的验证结果。


欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
TorchNPU-BotTorchNPU-Bot成员
9月8日 添加了label:help-wantedevent: api-consistencybot-triaged
ascend-robotascend-robot成员
9月8日 添加了label:usage
TorchNPU-Bot
TorchNPU-Bot成员
9月8日 评论:

检测到社区任务相关 issue,自动添加标签:event: api-consistency、help-wanted

likedislike
coconutcoconut
9月8日 修改了issue 的描述
ascend-robotascend-robot成员
9月28日 关闭了 issue
ascend-robotascend-robot成员
9月28日 issue状态由 TODO 改变为 DONE
ascend-robotascend-robot成员
9月28日 添加了label:resolved