#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'])
На этом этапе выполнение останавливается, новый процесс не запускается, и все просто останавливается.
- Существует ли какая-то взаимозависимость между DDP pytorch и
subprocess
модулем? - Как я могу запустить новый сценарий оболочки (
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 и stderrsys.stdout
в конструктор, чтобы вывод шел в ту же оболочку, что и основной процесс. в противном случае вам придется установить выходные данныеsubprocess.PIPE
и позвонитьpopen.communicate
, чтобы все было напечатано вашим сценарием.4. @Аарон, я не думаю, что что-то работает. Я попробовал
top
, но не увидел никакого нового процесса5. если возникает ошибка, процесс может существовать всего несколько миллисекунд. Вот почему важно проверять код возврата через
poll
и stdout и stderr.