Указание, какие процессы реализуют RQ работника, используя mpirun - PullRequest
0 голосов
/ 27 апреля 2020

Я использую 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 разделяет процесс с мастер-программой? В ожидании результата от работника RQ мастер больше ничего не делает.

1 Ответ

1 голос
/ 05 мая 2020

Чтобы ответить на ваш главный вопрос, вы можете использовать средство запуска MPI для запуска нескольких исполняемых файлов в рамках одного и того же задания. Точный синтаксис будет зависеть от вашего планировщика заданий и программного обеспечения MPI.

Из справочной страницы 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}
...