Определение того, какие процессы реализуют RQ worker с помощью mpirun
Я использую RQ для реализации очереди заданий в кластере, где задания управляются и выполняются с помощью Python. Рабочие RQ запускаются черезmpirun
, а затем программа Python, которая добавляет задания в очередь.
Я заметил, что когда у меня есть только один процесс, поэтому единственный работник RQ находится в том же процессе, что и программа, возникает значительная задержка. Это может быть связано с тем, что у меня есть большой объем данных оredis-server
они имеют общий доступ к.
В тестовом примере с одним заданием использование двух процессов в целом ускоряется. Поэтому я думаю, что было бы лучше иметь один процесс для программы (мастер), который просто помещает задания в очередь для рабочих.
В настоящее время у меня есть
mpirun -np $NUM_WORKERS -machinefile $confile rq worker $WORKER_ID -u $REDIS_URL
python3 master_program.py
Мой главный вопрос: как изменить mpirun
команда для запуска RQ-воркеров на 2-м процессах, обеспечивая master_program
имеет единственное использование первого?
Второстепенный вопрос: почему он работает намного медленнее, когда RQ worker разделяет процесс с главной программой? Ожидая результата от RQ worker, мастер больше ничего не делает.
1 ответ
Чтобы ответить на ваш основной вопрос, вы можете использовать средство запуска MPI для запуска нескольких исполняемых файлов как части одного и того же задания. Точный синтаксис будет зависеть от вашего планировщика заданий и программного обеспечения MPI.
Из man-страницы OpenMPI mpirun https://www.open-mpi.org/doc/v4.0/man1/mpirun.1.php - используйте двоеточия для разделения различных исполняемых файлов:
Модель с несколькими инструкциями и несколькими данными (MIMD):
mpirun [ global_options ] [ local_options1 ] <program1> [ <args1> ] : [ local_options2 ] <program2> [ <args2> ] : ... : [ local_optionsN ] <programN> [ <argsN> ]
Пример сценария задания для Torque и OpenMPI может выглядеть так:
#!/bin/bash
#PBS -l nodes=2:ppn=16,walltime=00:10:00
module load openmpi
OMPI_DEBUGGING_OPTS="--display-map --tag-output"
# Reserve one task for the master_program
NUM_WORKERS=$(($PBS_NP - 1))
# Application specific setup
REDIS_URL=<whatever>
WORKER_ID=<whatever>
# Change to submission dir
cd ${PBS_O_WORKDIR}
# Serial and parallel job
mpirun ${OMPI_DEBUGGING_OPTS} \
-np 1 \
python3 master_program.py \
: \
-np ${NUM_WORKERS} \
rq worker ${WORKER_ID} -u ${REDIS_URL}