如何通过使用worker / master概念的slurm在不同的节点上运行不同的独立并行作业?

时间:2019-01-22 23:11:54

标签: bash hpc slurm

我有一个使用主/从概念进行并行化的程序。有一个主目录和多个工作目录。我应该首先在master目录中运行执行文件,然后转到工作目录并在每个目录中运行工作执行程序。主机等待工人完成工作并将结果发送给主机进行进一步计算。工作目录的作业彼此独立,因此它们可以在不同的机器(节点)上运行。主机和工人使用TCP / IP通信协议相互通信。
我正在一个有16个节点的集群上工作,每个节点都有28个核心,具有Slurm Job Manager。我可以在1个节点上与20个工人一起工作。目前,我的Slurm脚本如下所示:

#!/bin/bash
#SBATCH -n 1               # total number of tasks requested
#SBATCH --cpus-per-task=18 # cpus to allocate per task
#SBATCH -p shortq            # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00        # run time (hh:mm:ss) - 12.0 hours in this.

cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!

cd /To-Parent 
# This is the directory that contains all worker (wrk)directories

parallel -i bash -c "cd {} ; worker.exe /h 127.0.0.1:4004" -- 
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14 
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}

我想知道如何修改此脚本以在多个节点之间划分在工人上运行的作业。例如,与wrk1到wrk5关联的作业在节点1上运行,与wrk6到wrk10关联的作业在节点2上运行,等等?

1 个答案:

答案 0 :(得分:1)

首先,您需要让Slurm为您的工作分配不同的节点,因此您需要删除--cpus-per-task选项,而要求18个任务

第二,您需要获取主机名运行的主机名,因为127.0.0.1在多节点设置中将不再有效。

第三,只需在调用srun中的bash之前添加parallel。使用--exclusive -n 1 -c 1,它将parallel派生的工作程序的每个实例分配给分配中的每个CPU。它们可能在同一节点上,也可能在其他节点上。

因此以下各项可能有效(未经测试)

#!/bin/bash
#SBATCH -n 18               # total number of tasks requested
#SBATCH -p shortq            # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00        # run time (hh:mm:ss) - 12.0 hours in this.

cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!
MASTER_HOSTNAME=$(hostname)

cd /To-Parent 
# This is the directory that contains all worker (wrk)directories

parallel -i srun --exclusive -n 1 -c 1 bash -c "cd {} ; worker.exe /h $MASTER_HOSTNAME:4004" -- 
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14 
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}

请注意,在您的示例中,有18个任务和20个要处理的目录,该作业将首先运行18个工作人员,然后在上一个任务完成时对另外两个工作人员进行“微计划”。