使用 mpirun 指定哪些进程实现 RQ worker

Specifying which processes implement RQ worker using mpirun

我正在使用 RQ 在集群上实现作业队列,其中管理作业,运行 和 Python。 RQ worker 通过 mpirun 启动,然后是一个 Python 程序,该程序将作业添加到队列中。

我注意到当我只有一个进程时,所以唯一的 RQ worker 与程序在同一个进程上,会有明显的延迟。这可能是因为我在他们共享访问权限的 redis-server 上有大量数据。

在具有单个作业的测试用例中,使用 2 个进程总体上会加快速度。因此,我认为最好为程序(主程序)设置一个进程,它只是将工作放在工人的队列中。

目前我有

mpirun -np $NUM_WORKERS -machinefile $confile rq worker $WORKER_ID -u $REDIS_URL
python3 master_program.py

我的主要问题是:如何修改 mpirun 命令以在第 2-N 个进程上启动 RQ worker,确保 master_program 仅使用第一个进程?

第二个问题:为什么RQ worker和master程序共享进程会慢很多?在等待 RQ worker 的结果时,master 没有做任何其他事情。

要回答您的主要问题,您可以使用 MPI 启动器启动多个可执行文件作为同一作业的一部分。确切的语法将取决于您的作业调度程序和 MPI 软件。

来自 OpenMPI mpirun 联机帮助页https://www.open-mpi.org/doc/v4.0/man1/mpirun.1.php - 使用冒号分隔各种可执行文件:

Multiple Instruction Multiple Data (MIMD) Model:

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}