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. プロセス内から新しいシェル スクリプト ( 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