0

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

我注意到当我只有一个进程时,所以唯一的 RQ 工作人员与程序在同一个进程上,会有很大的延迟。这可能是因为我有大量关于redis-server他们共享访问的数据。

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

目前我有

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

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

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

4

1 回答 1

1

要回答您的主要问题,您可以使用 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}
于 2020-05-05T15:00:39.913 回答