分散型 pytorch トレーニングを実行しています。すべてが魅力のように機能します。すべての GPU を十分に活用しており、すべてのプロセスが同期しており、すべて問題ありません。
各エポックの終わりに、新しいプロセスで精巧な評価を実行したいと思います (トレーニングをブロックしないため)。
if args.rank == 0:
# only for the "main" rank
subprocess.run(['python3', 'my_eval_code.py', '--chk', 'checkpoint'])
この時点で、実行が停止し、新しいプロセスは開始されず、すべてが停止します。
- pytorch の DDP と
subprocess
モジュールの間に相互依存関係はありますか? - プロセス内から新しいシェル スクリプト (
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
モジュールが新しいプロセスを開始するのを妨げる根本的なメカニズムがあるようです。
何か助けはありますか?