RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the ‘spawn’ start method`

用户在 Jupyter Notebook、VS Code Interactive Shell、IPython 等交互式环境中使用 notebook_launcher 启动多进程训练。典型调用方式如下:

RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method`

RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the ‘spawn’ start method

快速结论:该报错通常在使用 notebook_launcher 启动多进程训练时,因主进程中已有 CUDA 被隐式初始化(即使 torch.cuda.is_initialized() 返回 False)而触发。优先排查是否将所有可能调用 CUDA 的代码(包括模型加载、tokenizer 等)完全移入 training function 内部,并确认 accelerate 版本是否 >=1.12。

问题场景

用户在 Jupyter Notebook、VS Code Interactive Shell、IPython 等交互式环境中使用 notebook_launcher 启动多进程训练。典型调用方式如下:

def main():
    import torch
    print(torch.cuda.is_initialized())
    from accelerate import Accelerator
    accelerator = Accelerator()

if __name__ == '__main__':
    from accelerate import notebook_launcher
    notebook_launcher(main, num_processes=2)

该代码在 main() 内部创建 Accelerator() 时抛出错误。用户还报告了在 H200 GPU、CUDA 13.1、torch 2.8.1 环境下出现此问题,但相同代码在 H100、CUDA 12.4.1、torch 2.7.1 下可正常工作。

报错原文

RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method

原因分析

可能原因:当调用 notebook_launcher 时,如果主进程中已经有任何 CUDA 上下文被隐式初始化(例如 cublascudnn 底层初始化,或第三方库如 pynvml 的调用),即使 torch.cuda.is_initialized() 返回 False,fork 出的子进程也会因 CUDA 运行时无法被重新初始化而报错。用户使用 pynvml 测试也显示 CUDA “未初始化”,这表明问题的根源不在于 torch 层面,而在于底层 CUDA 驱动状态。

另一点重要线索:该错误从 accelerate >= 1.12.0 开始出现,accelerate 1.11.0 可正常工作。可能与 accelerate 内部对子进程启动方式的修改有关。此外,torch 2.9.1+cu126 环境下也会触发此问题。

环境排查

  • Python 版本(例如 3.12, 3.13)
  • torch 版本与 CUDA 版本(例如 torch 2.7.1+cu124 vs 2.9.1+cu126)
  • accelerate 版本(特别注意是否 >= 1.12.0)
  • 操作系统与交互环境(WSL2 + Ubuntu + Conda + IPython/VS Code Interactive Shell)
  • GPU 型号(H100 vs H200)
  • 检查所有 import 语句和全局代码中是否有任何可能触发 CUDA 初始化的操作(如 torch.cuda.device_count()、模型加载、tokenizer 下载等)

解决步骤

  1. 优先尝试方案一:将所有可能调用 CUDA 的代码完全移入 training_function 内部 —— 包括 import 语句、模型定义、tokenizer、Optimizer 以及 Accelerator() 创建。不要在主进程中执行任何与 CUDA 相关的操作。
  2. 尝试方案二:主动设置进程启动方式 —— 在调用 notebook_launcher 之前添加:
    import multiprocessing as mp
    mp.set_start_method("spawn", force=True)
  3. 尝试方案三:降级 accelerate 到 1.11.0 —— 如果可能,回退到已知可工作的版本组合(例如 accelerate==1.11.0, torch==2.7.1+cu124)。注意:1.11.0 可能不支持 FSDP 2.0。
  4. 尝试方案四:升级 accelerate 到修复版本 —— Issue 评论区确认 PR #4059 的修复有效。可安装 git 版本:
    pip install git+https://github.com/huggingface/accelerate.git@fix-notebook

    (注意:评论中第一次尝试该修复无效,因为作者忘记推送提交,需确保使用的版本包含完整修复。)

验证方法

运行最小复现代码(见问题场景中的 main() 函数),确认不再抛出 RuntimeError,且训练/推理正常启动。如果使用修复版本,注意检查 accelerate.__version__ 确认版本号。

参考来源

huggingface/accelerate #3925

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 8256

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注