已合并
[v2.7.1]test: add clone coverage for torch.autograd.grad_mode.set_grad_enabled #42460
Zky0803创建于 7月22日
[v2.7.1]test: add clone coverage for torch.autograd.grad_mode.set_grad_enabled #42460
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Zky0803 的贡献)atomgit-bot
7月22日 评论:
7月22日 评论:
变更摘要
此 PR 为 torch.autograd.grad_mode.set_grad_enabled 的 clone() 方法补充 NPU 单元测试,不涉及 API 实现修改。主要新增了两个测试用例,覆盖 clone() 方法的独立调用行为和装饰器场景下的实际使用。
主要改动
- 新增
test_set_grad_enabled_clone测试用例:验证torch.set_grad_enabled(False/True)上下文管理器对象的clone()行为,包括 clone 后与原对象不是同一实例、clone 后类型仍为torch.autograd.grad_mode.set_grad_enabled、以及 clone 后mode状态与原对象一致。 - 新增
test_set_grad_enabled_clone_decorator测试用例:验证@torch.set_grad_enabled(False/True)作为装饰器时,被装饰函数内部通过torch.is_grad_enabled()读取到的梯度开关状态正确。 - 优化导入语句的静态检查标记:将
import torch_npu改为import torch_npu # noqa: F401,避免因 NPU 后端注册的导入副作用产生未使用导入的 lint 警告。


atomgit-bot
7月22日 评论:
7月22日 评论:
代码审查
审查总结
- P0: 0
- P1: 0
- P2: 0
- P3: 1(
test_set_grad_enabled_clone中True分支缺少assertIsInstance类型校验)
整体风险评估:低风险。本次变更仅在测试文件中新增两个测试用例和一个 lint 抑制注释,不涉及生产代码修改。唯一的问题是 test_set_grad_enabled_clone 中 mode=True 分支缺少与 mode=False 分支一致的类型断言,属于测试覆盖缺口,不影响运行时行为。
已审查文件:
test/npu/test_locally_disabling_gradient_omputation.py— 发现 1 个 P3 问题(如上所述)
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


ascend-robot
7月22日 评论:
7月22日 评论:
此处折叠了87条消息 查看更多
梁松伟
9 天前 评论:
9 天前 评论:
/approve


9 天前 添加了label:approvedlgtm
9 天前 删除了label:ci-pipeline-passed
9 天前 合入了pull request
ascend-robot
9 天前 评论:
9 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#13900 [ commitID:1da804b4 ] 运行失败


【合入来源】
来源任务 Issue:【社区任务】7月社区任务第二期-Ascend for PyTorch API 一致性开发(31)
结果 Issue:torch.autograd.grad_mode.set_grad_enabled.clone API 一致性补齐
【分支范围】
本 PR 面向
v2.7.1目标分支。本任务整体覆盖:
v2.9.0、v2.10.0已进入维护阶段,不再合入新特性或本类新增测试,因此本任务不再对这两个分支作补齐要求。
【修改方案】
本次仅补充
torch.autograd.grad_mode.set_grad_enabled.clone的 NPU 单元测试,不修改 API 实现。
修改文件:
整改后提交:
文件头增加 Huawei BSD 3-Clause copyright 和 API 覆盖说明:
# Copyright (c) 2026 Huawei Technologies Co., Ltd # All rights reserved. # # Licensed under the BSD 3-Clause License (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://opensource.org/licenses/BSD-3-Clause # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Add validation cases for gradient-mode APIs on NPU. This file validates torch.no_grad, torch.enable_grad, torch.set_grad_enabled, and torch.autograd.grad_mode.set_grad_enabled.clone, including clone object independence, mode preservation, grad-mode restoration, and decorator behavior with NPU tensors. """1. clone 直接行为
整改后的
test_set_grad_enabled_clone:def test_set_grad_enabled_clone(self): initial_grad_enabled = torch.is_grad_enabled() with torch.set_grad_enabled(initial_grad_enabled): for mode in (False, True): ctx = torch.set_grad_enabled(mode) cloned = ctx.clone() self.assertIsNot(ctx, cloned) self.assertIsInstance( cloned, torch.autograd.grad_mode.set_grad_enabled, ) self.assertEqual(cloned.mode, mode) self.assertEqual(torch.is_grad_enabled(), initial_grad_enabled)验证:
torch.set_grad_enabled(False).clone();torch.set_grad_enabled(True).clone();mode状态保持;2. NPU Tensor 装饰器调用链
整改后的
test_set_grad_enabled_clone_decorator:def test_set_grad_enabled_clone_decorator(self): initial_grad_enabled = torch.is_grad_enabled() x = torch.tensor( [1.0], device="npu:0", requires_grad=True, ) with torch.set_grad_enabled(initial_grad_enabled): @torch.set_grad_enabled(False).clone() def grad_disabled(tensor): return tensor * 2 with torch.enable_grad(): disabled_result = grad_disabled(x) self.assertEqual(disabled_result.device, x.device) self.assertFalse(disabled_result.requires_grad) @torch.set_grad_enabled(True).clone() def grad_enabled(tensor): return tensor * 2 with torch.no_grad(): enabled_result = grad_enabled(x) self.assertEqual(enabled_result.device, x.device) self.assertTrue(enabled_result.requires_grad) self.assertEqual(torch.is_grad_enabled(), initial_grad_enabled)该用例在测试代码中显式调用:
torch.set_grad_enabled(False).clone() torch.set_grad_enabled(True).clone()并直接验证:
mode=False装饰器使 NPU 输出requires_grad=False;torch.no_grad()时,clone 后的mode=True装饰器使 NPU 输出requires_grad=True;3. 导入清理
继续保持移除冗余的:
import torch_npu # noqa: F401当前通过:
from torch_npu.testing.testcase import TestCase, run_tests使用项目测试基类和测试入口,不使用
noqa掩盖未使用导入。本次不涉及:
test_upstreampatch;【社区用例检索与新增必要性】
在
origin/v2.7.1(bacce7d835e779a6417047f18547f58fc0e37739)中执行:git grep -n -E \ 'set_grad_enabled.*clone|clone.*set_grad_enabled|test_.*set_grad_enabled.*clone' \ -- test直接 clone 测试匹配数:
相关基础测试包括:
test/test_autograd.py::test_set_grad_enabledtest/test_autograd.py::test_set_grad_enabled_wrapstest/npu/test_locally_disabling_gradient_omputation.py::test_set_grad_enabled这些用例覆盖基础上下文管理器或通用装饰器行为,但没有直接检查 clone 后对象的
身份、类型和
mode,没有验证测试前后线程 grad mode 保持,也没有使用 clone后对象作为装饰器对 NPU Tensor 输出进行断言。因此需要在现有 Torch-NPU NPU
测试文件中新增本用例,不能直接以社区基础用例替代。
【资料变更】
涉及。
torch.autograd.grad_mode.set_grad_enabled.clone为 PyTorch 对外公开的set_grad_enabled子方法。经资料补齐要求复核,当前 Torch-NPU Native API资料仅登记父 API,缺少
clone()子方法,因此本任务另行提交资料补齐 PR。资料补齐信息:
资料修改文件:
资料中将
clone()作为torch.autograd.grad_mode.set_grad_enabled的子方法登记,支持状态与父 API保持一致:
该 API 为非计算类上下文对象复制方法,与 Tensor 数据类型无关,因此资料中不
增加 fp16、fp32、bf16 等 dtype 限制说明。
资料分支已完成本地检查并成功推送,
diff --check、四版本条目覆盖及远端 SHA验证均通过。
【接口变更】
不涉及。
本次不修改函数实现、接口签名、返回类型或其他组件交互。
【功能验证】
环境
命令
python test/npu/test_locally_disabling_gradient_omputation.py -v隔离验证还分别从初始 grad mode 为
False和True的状态执行两个 clone 测试。测试场景
隔离验证场景:
完整原始输出
该版本执行结果:
【test_upstream patch】
不涉及。
本 PR 只修改 Torch-NPU 自定义 NPU 测试,不修改 PyTorch 官方测试逻辑或断言,
无需新增或修改
test_upstreampatch。【CheckList】