已合并
test(nn): Add test cases for torch.nn.parameter.is_lazy #42625
test(nn): Add test cases for torch.nn.parameter.is_lazy #42625
已合并
m0_45651774创建于 28 天前
m0_45651774
m0_45651774
28 天前

【合入来源】

[Usage]: torch.nn.parameter.is_lazy在 torch-npu 的资料未明确标注支持状态,但实际在 NPU 环境下可正常使用
请勿携带内部流程信息(需求链接、问题单、内部issue等)

【修改方案】

一、API 功能说明

torch.nn.parameter.is_lazy 用于判断一个参数(parameter)或缓冲区(buffer)是否处于 lazy(延迟初始化)状态。
判断输入对象 param 是否为:
	• torch.nn.UninitializedParameter
	• torch.nn.UninitializedBuffer
如果是,则返回 True;否则返回 False。

二、测试文件test_parameter_is_lazy.py完整验证该 API 的原因
PyTorch 官方社区暂无针对该 API 的直接独立用例覆盖,有相关调用,但是验证功能不充分,因此自行编写用例并提交到 test 目录。

1. 覆盖了 API 的所有正向逻辑(True 场景)
is_lazy 的核心功能是判断对象是否为未初始化的延迟(Lazy)状态。测试通过以下用例验证了所有符合该特性的对象:
未初始化的 Parameter (UninitializedParameter):验证 API 能正确识别延迟参数,返回 True。
未初始化的 Buffer (UninitializedBuffer):验证 API 能正确识别延迟 Buffer,返回 True。
2. 覆盖了全面的负向与边界逻辑(False 场景)
测试不仅验证了“是”的情况,还通过对比组排除了其他常见数据类型的干扰,确保没有假阳性(False Positive):
普通 Parameter:已实例化的 Parameter 应返回 False。
普通 Tensor:标准的 PyTorch 张量应返回 False。
空值 None:处理非法或边界输入时,API 不会崩溃并能安全返回 False。
3. 验证了生命周期变化(动态状态转换)
延迟加载(Lazy Model)的核心机制在于“先占位,后实例化”。
test_is_lazy_after_materialize 完整模拟了参数的生命周期:
1.初始为 UninitializedParameter  is_lazy 返回 True。
2.调用 .materialize() 完成实体化  is_lazy 返回 False。
此用例确保了 API 能精准感知对象从 Lazy  Concrete 的状态转变。
4. 适配特定硬件环境(NPU 跨设备验证)
代码开头使用 torch.accelerator.current_accelerator() 动态获取设备类型(如 NPU/Ascend)。
所有的验证用例在创建 Tensor/Parameter 时,都显式指定了 device=device_type。这不仅验证了 API 在标准 CPU 上的逻辑,还确保了其在 NPU 等特定硬件加速器上的兼容性与正确性。

三、NPU适配

`torch.nn.parameter.is_lazy` 是 PyTorch 中用于判断参数是否处于 Lazy 初始化状态的纯 Python 层辅助 API。其核心逻辑仅依赖 `UninitializedParameter` 和 `UninitializedBuffer` 类型判断,不涉及 Tensor 计算、设备管理、内存分配或底层 Kernel 调用。核心逻辑不耦合任何特定硬件(包括 GPU/NPU/CPU),因此适配昇腾 NPU 时无需修改这个 API 本身,可直接复用。

【资料变更】

涉及
已检查文档,https://gitcode.com/Ascend/pytorch/tree/master/docs/zh/api/native_api 下面各个版本未写了该API已支持,所以需要提交PR修改资料。

【接口变更】

不涉及

【功能验证】

说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤
新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图

在2.7.1、2.11.0 、2.12.0版本上执行该用例,均通过,日志如下:
测试命令:

cd test
python nn/test_parameter_is_lazy.py

image.png

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 m0_45651774 的贡献)
m0_45651774m0_45651774
28 天前 创建了 pull request,commit e7caed6d
atomgit-bot
atomgit-bot
28 天前 评论:

变更摘要

此 PR 新增了测试文件 test/nn/test_parameter_is_lazy.py,为 torch.nn.parameter.is_lazy API 补充独立的单元测试用例。测试覆盖了正向场景(UninitializedParameterUninitializedBuffer 返回 True)与负向/边界场景(普通 Parameter、普通 TensorNone 以及 materialize 后均返回 False),同时支持 NPU 设备自动检测。

主要改动

  • 新增测试文件 test/nn/test_parameter_is_lazy.py:添加了 49 行完整的独立测试用例文件,专门验证 torch.nn.parameter.is_lazy
  • 新增 TestIsLazy 测试类:包含 6 个测试方法,涵盖 is_lazyUninitializedParameterUninitializedBuffer、普通 Parameter、普通 TensorNone 以及 materialize 后状态的返回值验证。
  • 正向逻辑验证test_is_lazy_uninitialized_parametertest_is_lazy_uninitialized_buffer 分别确认延迟参数和延迟缓冲区被正确识别,is_lazy 返回 True
  • 负向与边界逻辑验证test_is_lazy_regular_parametertest_is_lazy_regular_tensortest_is_lazy_none 以及 test_is_lazy_after_materialize 确保已实例化对象、空值以及物化后的延迟参数均返回 False,避免假阳性。
  • NPU 设备支持:通过 torch.accelerator.current_accelerator() 动态获取设备类型,确保所有测试用例可在 NPU 或 CPU 上正确运行。
likedislike
atomgit-bot
atomgit-bot
28 天前 评论:

代码审查

我已经完整审查了该 diff 中的所有变更。以下是分析过程:


逐项审查

1. 文件头部(第 1-8 行)

  • 模块文档字符串清晰地说明了测试目的。
  • 导入语句 from torch.testing._internal.common_utils import TestCase, run_tests 符合该仓库中其他测试文件的惯例(如 test_global_module_full_backward_hooks.pytest_unflatten_dense_tensors.py 等均使用相同导入)。

2. 设备类型检测(第 11 行)

  • device_type = acc.type if (acc := torch.accelerator.current_accelerator()) else "cpu" 使用海象运算符 :=,Python 3.8+ 支持(setup.py 确认最低支持 3.8)。
  • current_accelerator() 返回 None(无加速器)时,三元条件取 "cpu"acc.type 不会被求值,逻辑正确。
  • 此模式与仓库中 20+ 个其他测试文件完全一致,是项目惯用写法。

3. TestIsLazy 测试类(第 14-45 行)

逐一验证每个测试方法:

方法 验证对象 预期结果 是否正确
test_is_lazy_uninitialized_parameter UninitializedParameter True
test_is_lazy_uninitialized_buffer UninitializedBuffer True
test_is_lazy_regular_parameter torch.nn.Parameter False
test_is_lazy_regular_tensor 普通 Tensor False
test_is_lazy_none None False
test_is_lazy_after_materialize materialize 后的参数 False

关键验证点

  • torch.nn.parameter.UninitializedParameter(device=device_type) — 与 test_uninitialized_parameter_cls_to_become.py:22 用法一致,device 关键字参数有效。
  • torch.nn.parameter.UninitializedBuffer(device=device_type) — 符合 PyTorch API。
  • uninit_param.materialize(shape=(3, 3)) — 与 test_uninitialized_parameter_cls_to_become.py:26 完全一致,合法调用。
  • torch.nn.parameter.is_lazy() — 该函数在 test/test_modules.py:834 处已有调用,API 存在且可用。

4. 测试入口(第 48-49 行)

  • 标准的 if __name__ == "__main__": run_tests(),无问题。

关闭总结

  • 已审查文件test/nn/test_parameter_is_lazy.py无问题
  • 发现数量:0(P0-P3 均为 0)。
  • 整体风险评估:此变更是纯粹的测试用例新增,代码逻辑正确,API 调用与仓库中现有测试保持一致,不存在正确性、安全、可靠性或回归风险。

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

likedislike
ascend-robotascend-robot成员
28 天前 添加了label:ascend-cla/yes
此处折叠了78条消息 查看更多
ascend-robotascend-robot成员
17 天前 添加了label:approved
Jingwei Huang
Jingwei Huang成员
16 天前 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
16 天前 添加了label:lgtm
ascend-robotascend-robot成员
16 天前 合入了pull request
ascend-robot
ascend-robot成员
16 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#13637 [ commitID:3bfa1716 ] 已完成
likedislike