Pull Request已成功合入, 合并人@ascend-robot
(感谢 黄桂军 的贡献)变更摘要
此 PR 将 NPU 的 Dynamo/Inductor 编译器集成从 import torch_npu 时的立即初始化改为懒加载模式。核心思路是:import torch_npu 不再导入 torch._dynamo、torch._inductor、torch_npu._inductor 等重型模块,仅在用户实际调用 torch.compile() 或触发图捕获时才按需初始化。实现手段包括 setuptools entry points、meta_path finder、run_once 并发安全装饰器,以及多个子模块的 __getattr__ 懒加载。同时将 MarkStepBox 和 RNG prim 补丁等状态/逻辑拆分到独立轻量模块,避免级联导入。
主要改动
-
Dynamo/Inductor 懒加载机制:新增
_DynamoPostImportFinder(meta_pathfinder)在torch._dynamo首次被导入时自动触发_lazy_dynamo_setup();新增_lazy_inductor_setup()仅在 Inductor 类后端被选用时才初始化torch_npu._inductor;setup.py新增torch_dynamo_backendsentry points(npu、npugraph_ex、npugraphs),由 Dynamo 框架在需要时回调。 -
注册时机调整与
run_once并发安全:registry_manager._register_components()中移除_register_dynamo(),改为_register_rng_prims(),Dynamo 后端注册延迟到_lazy_dynamo_setup中执行。run_once装饰器增加threading.Condition并发等待、os.register_at_forkfork 后重置、失败时释放标记等机制,确保首次调用在多线程/fork 场景下正确。 -
MarkStepBox与 RNG prim 补丁拆分为独立模块:MarkStepBox和mark_step_begin()从torch_npu/npu/_graph_tree.py移至新文件torch_npu/npu/_graph_tree_state.py;_max_unpoolnd_patch、patch_philox_rand_offset等 RNG 补丁从torch_npu/utils/_inductor.py移至新文件torch_npu/utils/_rng_prims_patch.py,原_inductor.py仅保留重导出。两者均避免导入时拉入重型依赖。 -
子模块按需导入:
torch_npu.npu.__init__.py通过__getattr__对npugraph_ex实现懒加载;torch_npu.distributed.__init__.py通过__getattr__对fsdp子模块实现懒加载;torch_npu/dynamo/__init__.py中_install_lazy_torchair()按需注册torchair懒代理模块。 -
transfer_to_npu.py显式导入与setattr替换:将原先依赖import torch_npu副作用触发的 Dynamo/Inductor 模块导入改为显式import语句;将直接属性赋值(如torch._inductor.utils.get_gpu_type = ...)改为setattr调用,避免触发模块的__getattr__/描述符等副作用。




同步 v2.9.0_import 的 import 优化到 master
核心改动
将 NPU 的 Dynamo/Inductor 初始化从
import torch_npu时立即执行改为懒加载:import torch_npu时不导入torch._dynamo、torch._inductor、torch_npu._inductortorch.compile()或触发 graph capture 时才初始化 Dynamo 集成适配说明(master PyTorch 2.13+)
make_config_entry兼容封装(MIN_SUPPORTED >= 2.10)_patch_flex_attention_device和_dump_snapshotnew_init(name=None)签名详见
master_syn.md中的逐文件分类和冲突解决记录