我有一个程序,它使用主/salve概念进行并行化。有一个主目录和多个工作目录。我应该首先在主目录中运行执行文件,然后转到工作目录并在每个目录中运行工作执行程序。主程序等待工人完成他们的工作,并将结果发送给主程序以进行进一步的计算。工作目录的作业是相互独立的,因此它们可以在不同的机器(节点)上运行。使用TCP/IP通信协议与工作人员进行通信。
我正在处理一个由16个节点组成的集群,每个节点都有28个核心与slurm作业管理器。我可以在一个节点上与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上,等等?
发布于 2019-01-24 15:16:18
首先,您需要让Slurm为您的作业分配不同的节点,因此您需要删除--cpus-per-task
选项,而是请求18个tasks。
其次,您需要获得主机名,因为在多节点设置中,127.0.0.1
将不再有效。
第三,只需在调用srun
中的bash
之前添加parallel
。使用--exclusive -n 1 -c 1
,它将向分配中的每个CPU分派parallel
生成的工作人员的每个实例。它们可能位于同一个节点上,也可能位于其他节点上。
因此,以下内容可以正常工作(未经测试)
#!/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个工作人员,然后当以前的任务完成时,两个额外的任务将被“微调度”。
https://stackoverflow.com/questions/54317794
复制相似问题