我使用的是 RQ 来实现集群上的作业队列,其中的作业是用Python来管理和运行的。RQ工作者是通过 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工,确保了在第2-N个工序上的 master_program
有独占鳌头?
一个次要的问题:为什么RQ工与主程序共享进程时,速度会慢很多?在等待RQ worker的结果时,主程序并没有做任何其他事情。
回答你的主要问题,你可以使用MPI启动器来启动多个可执行文件作为同一作业的一部分。确切的语法将取决于你的作业调度器和MPI软件。
从OpenMPI mpirun手册中可以看出 https:/www.open-mpi.orgdocv4.0man1mpirun.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}