已合并
fix lazy_init and api export #36707
fix lazy_init and api export #36707
已合并
bellatan创建于 5月26日
bellatan
bellatan成员
5月26日

【合入来源】

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

【修改方案】

问题1:test/test_npu.py的test_lazy_init用例失败
image.png
根因
重构前 torch_npu/init.py 中,先做 accelerator 冲突检查,即_check_device_conflict 接口调用,再 import torch_npu.npu、torch_npu.utils 等内部模块,不会触发 NPU device count 提前枚举
重构后 torch_npu/init.py 中,先调用了_check_device_conflict 接口,再 import torch_npu.npu、torch_npu.utils 等内部模块,_check_device_conflict 接口调用顺序被延后,调用 _get_accelerator() 时 NPU backend 状态已经被拉起,触发底层设备探测,导致 _npu_getDeviceCount() 提前枚举真实设备数 8。
解决 : 在 torch_npu/init.py 中,保持和重构前一样的调用顺序,即_check_device_conflict 接口调用提前到所有的 import 之前。

问题2:缺失子模块导出的 API:

torch_npu.asd.checksum
torch_npu.utils.syncbatchnorm

现象
image.png

根因分析
旧版 torch_npu/__init__.py 是一个大顶层初始化脚本,里面直接写了很多顶层 import:

from torch_npu.asd.checksum import _matmul_checksum as matmul_checksum
import torch_npu.utils.syncbatchnorm

这些 import 会产生父包属性挂载副作用:

torch_npu.asd.checksum
torch_npu.utils.syncbatchnorm

重构后初始化逻辑被拆分到 _init/core/module_loader.py_exports.py 等模块中,部分旧版顶层 import 副作用没有恢复,因此这些子模块路径在 import torch_npu 后不可见。

解决方案
_load_registration_modules() 中补充子模块父包属性:

import torch_npu.asd.checksum  # noqa: F401
import torch_npu.utils.syncbatchnorm  # noqa: F401

问题3:顶层属性缺失 API

torch_npu.ParallelStore
torch_npu._ShardedGradScaler

现象
image.png

根因分析
旧版顶层有:

from torch_npu._C._distributed_c10d import ParallelStore
from torch_npu.npu.amp.sharded_grad_scaler import _ShardedGradScaler

因此旧版支持:

torch_npu.ParallelStore
torch_npu._ShardedGradScaler

重构后 _distributed_c10d 子模块初始化逻辑被集中到 C 扩展子模块初始化流程中,但没有把 ParallelStore 恢复到 torch_npu 顶层,导致旧版顶层访问路径缺失。_ShardedGradScaler 只在 distributed patch 逻辑中局部 import:

def _apply_sharded_grad_scaler_patch(torch):
    from torch.distributed.fsdp import sharded_grad_scaler
    from torch_npu.npu.amp.sharded_grad_scaler import _ShardedGradScaler

    sharded_grad_scaler.ShardedGradScaler = _ShardedGradScaler

这能保证 patch 行为一致,但没有恢复旧版顶层属性torch_npu._ShardedGradScaler

解决方案
_exports.py 中补 legacy 顶层属性:

def _export_distributed_apis(globals_dict):
    """
    Export legacy distributed-related top-level APIs.
    Rule:
        - torch_npu._C._distributed_c10d.ParallelStore -> torch_npu.ParallelStore
        - torch_npu.npu.amp.sharded_grad_scaler._ShardedGradScaler -> torch_npu._ShardedGradScaler

    Note:
        These APIs are kept for compatibility and should not be added to __all__.
    """
    from torch_npu._C._distributed_c10d import ParallelStore
    from torch_npu.npu.amp.sharded_grad_scaler import _ShardedGradScaler

    globals_dict["ParallelStore"] = ParallelStore
    globals_dict["_ShardedGradScaler"] = _ShardedGradScaler

【资料变更】

不涉及

【接口变更】

不涉及

【功能验证】

test/test_torch_npu_init.py 新增对应的测试项本地验证pass,CI pass

image.png

【CheckList】

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

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 bellatan 的贡献)
bellatanbellatan成员
5月26日 创建了 pull request,commit cb7665ff
bellatanbellatan成员
5月26日 关联了issue:[Refactor] python初始化导入重构
ascend-robot
ascend-robot成员
5月26日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-Ascend/pytorch ffmh, chujinjin (2/2) chujinjin (1/1)
test chujinjin, ffmh (2/2) chujinjin (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

bellatan, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
ascend-robotascend-robot成员
5月26日 添加了label:ascend-cla/yes
此处折叠了61条消息 查看更多
ffmh
ffmh成员
5月30日 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
5月30日 添加了label:lgtm
ascend-robotascend-robot成员
5月30日 合入了pull request
ascend-robot
ascend-robot成员
5月30日 评论:
流水线 pytorch_gitcode_PR_multiVersion#9709 [ commitID:e5388199 ] 已完成
likedislike
bellatanbellatan成员
6月1日 修改了pull request 的描述