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

How to run different independent parallel job on different nodes using slurm using worker/master concept?

我有一个使用 master/salve 概念进行并行化的程序。有一个主目录和多个工作目录。我应该先 运行 主目录中的执行文件,然后转到工作目录和每个目录中的 运行 工作执行文件。 master 等待 worker 完成他们的工作并将结果发送给 master 进行进一步计算。工作目录的作业相互独立,因此它们可以 运行 在不同的机器(节点)上。 master 和 worker 使用 TCP/IP 通信协议相互通信。
我在一个有 16 个节点的集群上工作,每个节点有 28 个内核和 slurm 作业管理器。我可以 运行 我的工作在 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}

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

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

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

第三,在调用parallel中的bash前加上srun即可。使用 --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 个工人,然后两个额外的 'micro-scheduled' 每当前一个任务完成时。