已合并
test: add NPU coverage for Optimizer.zero_grad #43537
test: add NPU coverage for Optimizer.zero_grad #43537
已合并
Jinfan Liu创建于 25 天前
Jinfan Liu
Jinfan Liu
25 天前

关联 issue

https://gitcode.com/Ascend/pytorch/issues/2739

API 功能

torch.optim.Optimizer.zero_grad(set_to_none=True) 将优化器管理的全部 Parameter 的梯度清零或置为 None。默认 set_to_none=True 时直接把 param.grad 置为 None(更省内存);set_to_none=False 时将梯度置为与参数同形状的全 0 张量。参数按 Python 真值语义处理(1/[1] 等视为 True,0/[]/None 等视为 False),与 PyTorch 官方行为一致。该操作仅涉及梯度内存管理,不触发算子计算,NPU 上与官方语义一致。

官方用例情况

检索官方 test/ 目录后确认:官方 test/test_optim.py 等存在对 zero_grad 的调用,但未发现对 set_to_none 布尔/真值语义、非法调用签名(多参数/未知关键字)的直接覆盖,也没有 NPU 专项用例。本 PR 在 test/npu/ 补充 NPU 侧直接验证。

测试场景覆盖

新增 test/npu/test_optimizer_zero_grad.py,覆盖以下场景:

  • 默认调用:optimizer.zero_grad()param.grad is None
  • 布尔参数:set_to_none=True → grad 为 None;set_to_none=False → grad 非 None 且与 torch.zeros_like 逐元素相等(torch.equal
  • 真值语义:set_to_none=1set_to_none=[1] → grad 为 None;set_to_none=0set_to_none=[]set_to_none=None → grad 为全 0(对齐官方真值处理)
  • 非法调用:zero_grad(True, False)zero_grad(unexpected=True) 均抛 TypeError
  • 前置条件:SGD + NPU Parameter 反向传播后断言 grad 非 None 且非零,再验证清零/置 None 行为

资料补齐情况

Optimizer.zero_grad 为 PyTorch 原生 API,Native API 资料中无单独 Restrictions/Notes 限制条目(NPU 行为与官方一致),本 PR 仅补充测试,不涉及 native API 文档修改。

运行命令与日志

  • 分支:v2.7.1
  • 环境:Ascend 910(npu-smi 25.5.1)+ CANN 9.1.0-beta.1 + Python 3.12.13;本地验证使用 torch 2.12.0+cu130 / torch_npu 2.12.0(master_py312 环境近似验证,跨版本以 CI 为准)
  • 命令:
cd /workspace
unset PYTHONPATH
/workspace/venvs/master_py312/bin/python /workspace/user_data/tasks/_align-20260814/test-optimizer-zero-grad-master/test/npu/test_optimizer_zero_grad.py -v
  • 结果:Ran 4 tests ... OK(退出码 0)

变更说明

  • 新增 test/npu/test_optimizer_zero_grad.py,仅补充测试,不修改任何实现代码
  • Source: JfanLiu:test-optimizer-zero-grad-v271,Target: v2.7.1
  • Previous PR: none
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Jinfan Liu 的贡献)
Jinfan LiuJinfan Liu
25 天前 创建了 pull request,commit cdf425cb
Jinfan LiuJinfan Liu
25 天前 关联了issue:【社区任务】7月社区任务第一期-Ascend for PyTorch API 一致性开发(17)
atomgit-bot
atomgit-bot
25 天前 评论:

变更摘要

本 PR 为 NPU 平台新增 Optimizer.zero_grad 的测试覆盖(纯测试改动,不涉及实现代码)。新增文件 test/npu/test_optimizer_zero_grad.py,通过 TestOptimizerZeroGrad 测试类在 NPU 设备上验证 zero_grad 的默认行为、布尔及真值/假值参数、以及非法调用签名,共 4 个测试用例。

主要改动

  • 新增 NPU 测试文件: 添加 test/npu/test_optimizer_zero_grad.py,定义 TestOptimizerZeroGrad 测试类,并通过 torch_npu.testing.testcaserun_tests 运行。
  • 测试辅助方法: 新增 _create_optimizer_with_gradient_assert_gradient_is_none_assert_gradient_is_zero,用于在 NPU 上创建带梯度的 SGD 优化器并断言 parameter.gradNone 或全零张量。
  • 默认行为与布尔参数测试: test_zero_grad_default_sets_gradient_to_none 验证默认调用将梯度置为 Nonetest_zero_grad_boolean_parameter_values 验证 True 置空、False 置零。
  • 真值/假值参数测试: test_zero_grad_non_boolean_truthy_and_falsy_values 验证 1/[1] 走真值分支置空,0/[]/None 走假值分支置零。
  • 非法签名测试: test_zero_grad_rejects_invalid_call_signatures 验证多余位置参数(zero_grad(True, False))和未知关键字参数(zero_grad(unexpected=True))均抛出 TypeError
likedislike
atomgit-bot
atomgit-bot
25 天前 评论:

代码审查

✅ 未发现问题

likedislike
此处折叠了41条消息 查看更多
ascend-robotascend-robot成员
11 天前 添加了label:lgtm
ascend-robotascend-robot成员
11 天前 删除了label:ci-pipeline-passed
ascend-robotascend-robot成员
11 天前 合入了pull request
ascend-robot
ascend-robot成员
11 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#14087 [ commitID:2bdae958 ] 已完成
likedislike
Jinfan LiuJinfan Liu
8 天前 修改了pull request 的描述