已合并
fix: 修复 inductor 编译子进程重复初始化 NPU 的问题 #44922
dingdairong创建于 7 天前
fix: 修复 inductor 编译子进程重复初始化 NPU 的问题 #44922
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 dingdairong 的贡献)7 天前 创建了 pull request,commit edee93e7
ascend-robot
7 天前 评论:
7 天前 评论:
atomgit-bot
7 天前 评论:
7 天前 评论:
变更摘要
本 PR 针对 torch_npu/_inductor/__init__.py 模块导入流程做出修复:在侧车(sidecar)进程预热 AsyncCompile 线程池之前,临时关闭环境变量 TORCH_DEVICE_BACKEND_AUTOLOAD,从而避免在 fork 出的子进程中触发 NPU 初始化,预热完成后再恢复该环境变量的原始值。改动仅涉及 1 个文件,纯新增逻辑,无删除。
主要改动
- 临时禁用后端自动加载:新增
os导入,并通过os.getenv("TORCH_DEVICE_BACKEND_AUTOLOAD", "1")保存原始值,随后将TORCH_DEVICE_BACKEND_AUTOLOAD设置为"0",防止后续导入过程中自动初始化设备后端。 - 预热
AsyncCompile线程池:在环境变量关闭状态下导入torch._inductor.async_compile.AsyncCompile并调用AsyncCompile.warm_pool(),确保预热过程在 fork 出的子进程中不会触发 NPU 初始化。 - 恢复环境变量原始值:预热结束后通过
os.environ["TORCH_DEVICE_BACKEND_AUTOLOAD"] = ORG_AUTOLOAD将环境变量恢复为模块导入前的取值,避免影响后续正常流程。


atomgit-bot
7 天前 评论:
7 天前 评论:
7 天前 添加了label:ascend-cla/yes
此处折叠了92条消息 查看更多
薛鹏
5 天前 评论:
5 天前 评论:
/approve


5 天前 添加了label:approvedlgtm
5 天前 合入了pull request
ascend-robot
5 天前 评论:
5 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#14393 [ commitID:aae46525 ] 已完成


【合入来源】
【修改方案】
问题原因
直接原因:inductor 编译子进程(sidecar)在 fork worker 前,因 import torch 时自动加载了 torch_npu 并初始化了 NPU,导致 fork 出的 worker 触发 "Cannot re-initialize NPU in forked subprocess" 错误。
为什么部分版本有问题:torch_npu 在 v2.7.1 时通过 PR !30476 修复了此问题(在创建 sidecar 前临时禁用 TORCH_DEVICE_BACKEND_AUTOLOAD,防止 sidecar 自动加载 torch_npu)。该修复已同步到 v2.9.0 和 v2.10.0 分支,但遗漏了 v2.11.0 和 v2.12.0 分支,导致这两个版本存在此问题。
解决方案
在 torch_npu/_inductor/init.py 文件开头补充 ORG_AUTOLOAD + AsyncCompile.warm_pool() 逻辑,确保 sidecar 进程继承 TORCH_DEVICE_BACKEND_AUTOLOAD=0,避免 sidecar 中自动加载 torch_npu 触发 NPU 初始化。该修改与 v2.9.0/v2.10.0 保持一致。
【资料变更】
【接口变更】
【功能验证】
【CheckList】