Петр распределен: Запуск команды оболочки

#python #pytorch #multiprocessing #subprocess #distributed-training

Вопрос:

Я провожу распределенное обучение pytorch. Все работает как по волшебству. Я полностью использую все графические процессоры, все процессы синхронизированы, все в порядке.
В конце каждой эпохи я хочу провести некоторую сложную оценку в новом процессе (чтобы не блокировать обучение).:

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

На этом этапе выполнение останавливается, новый процесс не запускается, и все просто останавливается.

  1. Существует ли какая-то взаимозависимость между DDP pytorch и subprocess модулем?
  2. Как я могу запустить новый сценарий оболочки ( subprocess.run / subprocess.call / subprocess.Popen ) изнутри DDP процесса?

Я также разместил этот вопрос на форуме pytorch и открыл сообщение об ошибке.


Обновление (29 июля 2021 года)
Я изменил свой код на:

 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 , препятствующий запуску модулем новых процессов.

Какая-нибудь помощь?

Комментарии:

1. Взаимозависимость с subprocess маловероятной… Взаимозависимость между вашим сценарием оценки и сценарием обучения: более вероятно. Вы должны попытаться проверить вывод stdout и stderr из вызова подпроцесса, чтобы узнать, не является ли ошибка причиной взаимоблокировки. Также subprocess.run блокируется до тех пор, пока процесс не вернется. Если вы хотите одновременного выполнения, вы, вероятно, хотите popen , а не run .

2. @Aaron Я старался так popen же хорошо, как call и не получал никаких результатов от подпроцесса

3. popen.poll сообщит вам, запущен ли исполняемый файл, и вы можете перенаправить stdout и stderr sys.stdout в конструктор, чтобы вывод шел в ту же оболочку, что и основной процесс. в противном случае вам придется установить выходные данные subprocess.PIPE и позвонить popen.communicate , чтобы все было напечатано вашим сценарием.

4. @Аарон, я не думаю, что что-то работает. Я попробовал top , но не увидел никакого нового процесса

5. если возникает ошибка, процесс может существовать всего несколько миллисекунд. Вот почему важно проверять код возврата через poll и stdout и stderr.