0

我正在运行分布式 pytorch 培训。一切都像魅力一样。我正在充分利用所有 GPU,所有进程都同步,一切都很好。
在每个时期结束时,我想在一个过程中运行一些详细的评估(而不是阻止训练):

if args.rank == 0:
  # only for the "main" rank
  subprocess.run(['python3', 'my_eval_code.py', '--chk', 'checkpoint'])

此时,执行停止,新进程没有启动,一切都停止了。

  1. pytorch 的 DDP 和subprocess模块之间是否存在一些相互依赖关系?
  2. 如何从进程内部启动新的 shell 脚本 ( subprocess.run/ subprocess.call/ subprocess.Popen) DDP

我还在pytorch 的论坛上发布了这个问题,并打开了一个错误报告


更新(2021 年 7 月 29 日)
我将代码更改为:

proc = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
print(f'\t{proc}={proc.poll()}')
try:
  proc_o, proc_e = proc.communicate(timeout=120)
  print(f'successfully communicated o={proc_o} e={proc_e} poll={proc.poll()}')
except subprocess.TimeoutExpired:
  proc.kill()
  proc_o, proc_e = proc.communicate()
  print(f'time out o={proc_o} e={proc_e} poll={proc.poll()}')

不好:Popen命令被阻塞,命令的打印poll永远不会执行,更不用说communicate.
当我检查工作时top,我看到:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
37924 bagon     39  19   23640   2796    880 S  15.8  0.1   0:15.34 python3

查看实际运行的过程:我看到了:

UID        PID  PPID  C STIME TTY      STAT   TIME CMD
bagon    37924 37065  1 08:00 ?        SNl    0:15 /home/bagon/.conda/envs/my_env/bin/python3 -c from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=50, pipe_handle=54) --multiprocessing-fork

似乎有一些底层机制阻止subprocess模块启动新进程。

有什么帮助吗?

4

0 回答 0