已合并
fix lazy_init and api export #36707
bellatan创建于 5月26日
fix lazy_init and api export #36707
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 bellatan 的贡献)5月26日 关联了issue:[Refactor] python初始化导入重构
ascend-robot
5月26日 评论:
5月26日 评论:
ascend-robot
5月26日 评论:
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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


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


5月30日 添加了label:lgtm
5月30日 合入了pull request
ascend-robot
5月30日 评论:
5月30日 评论:
流水线 pytorch_gitcode_PR_multiVersion#9709 [ commitID:e5388199 ] 已完成


6月1日 修改了pull request 的描述
【合入来源】
【修改方案】
问题1:test/test_npu.py的test_lazy_init用例失败

根因:
重构前 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/__init__.py是一个大顶层初始化脚本,里面直接写了很多顶层 import:from torch_npu.asd.checksum import _matmul_checksum as matmul_checksum import torch_npu.utils.syncbatchnorm这些 import 会产生父包属性挂载副作用:
重构后初始化逻辑被拆分到
_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
现象:

根因分析:
旧版顶层有:
from torch_npu._C._distributed_c10d import ParallelStore from torch_npu.npu.amp.sharded_grad_scaler import _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
【CheckList】