Определение того, какие процессы реализуют 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}
Другие вопросы по тегам