我正在运行分布式 pytorch 培训。一切都像魅力一样。我正在充分利用所有 GPU,所有进程都同步,一切都很好。
在每个时期结束时,我想在一个新过程中运行一些详细的评估(而不是阻止训练):
if args.rank == 0:
# only for the "main" rank
subprocess.run(['python3', 'my_eval_code.py', '--chk', 'checkpoint'])
此时,执行停止,新进程没有启动,一切都停止了。
- pytorch 的 DDP 和
subprocess
模块之间是否存在一些相互依赖关系? - 如何从进程内部启动新的 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
模块启动新进程。
有什么帮助吗?