在模型运行时脚本突然卡死

问题描述

在模型运行过程中,脚本突然卡死。单卡训练过程时,表现为长时间日志不打印;多卡训练过程时,表现为其他进程由于连不上这台机器超时退出,但卡死的进程仍然存在没有退出。

问题分析

当python版本为3.8-3.11,由于Python本身问题,底层在非二进制场景下执行算子编译时,如果用户脚本侧使用fork的方式起多进程,可能出现子进程锁死,启动失败。

使用fork方式启动子进程命令如下所示:
import multiprocessing as mp

w=mp.Process(target=func, args=('xxxx',))
w.start()

处理方法

可参考以下三种处理方式,任选其一:
  • 使用spawn或者forkserver方式启动子进程 。
    将fork方式进行如下修改,即可使用spawn方式启动子进程。
    import multiprocessing as mp
    
    ctx = mp.get_context('spawn')
    w=ctx.Process(target=func, args=('xxxx',))
    w.start()

    将fork方式进行如下修改,即可使用forkserver方式启动子进程。

    import multiprocessing as mp
    
    ctx = mp.get_context('forkserver')
    w=ctx.Process(target=func, args=('xxxx',))
    w.start()
  • 使用fork方式启动子进程前,先调用torch_npu.npu.synchronize(),具体命令如下所示。
    import multiprocessing as mp
    
    torch_npu.npu.synchronize()
    w=mp.Process(target=func, args=('xxxx',))
    w.start()
  • 在模型脚本的main_worker函数中配置进程级别的开关,配置为False,打开算子二进制场景。
    torch_npu.npu.set_compile_mode(jit_compile=False)