我有一个程序,使用一个输入文件来描述一系列初始条件,并输出一系列最终条件。我还有一个批处理脚本,通过将输入文件中的初始条件范围分成较小的块并将它们提供给程序的独立实例,从而“并行化”程序。只要我仅尝试在一个节点上运行批处理脚本,这似乎就可以正常工作,但是如果我请求多个节点,则该程序的每个实例在每个节点上都是 duplicate 。
这是我正在使用的批处理脚本的简化版本,可以解决此问题:
---my_job_splitter.sh---
#!/bin/env bash
#SBATCH --job-name Test
#SBATCH --output=%x_%j_%t.csv
#SBATCH --error=log.err
#SBATCH --mail-type=END,FAIL
#SBATCH --nodes=4
#Read the command line input
if [ "$#" -ge 4 ]; then
numtasks=${1}
inptrangestart=${2}
inptrangeend=${3}
inptrangenum=${4}
fi
#Calculate the size of the chunks to break the range into
chunksize=$((inptrangenum/numtasks))
#Run a separate instance my_program to process each smaller chunk of the input range
for ((ii=0;ii<numtasks;ii++)); do
stp=`echo "scale=4;($inptrangeend-$inptrangestart)/($inptrangenum-1)" | bc`
a=`echo "$chunksize*$stp*$ii" | bc`
b=`echo "$a+($chunksize-1)*$stp" | bc`
srun my_program.sh $a $b $chunksize &
done
wait
出于说明目的,my_program
只是一个bash脚本,它接受输入范围并将其作为csv行写入到stdout
中:
---my_program.sh---
#!/bin/env bash
echo "$1,$2,$3"
如果一切都在做我想要的,如果我运行命令
sbatch my_job_splitter 32 0 1000 4000
输出文件应该是包含32个条目的CSV文件,每个条目的范围为0:1000的1/32,但是我却得到了一个包含96个条目的CSV文件,每个范围块都重复了3次。我想我了解发生了什么-每次运行srun时,它都会看到我分配了3个节点,并假设每个节点要1个任务,因此它只是重复执行该任务,直到为每个节点分配了1个任务为止-但是我不知道如何解决它,或者一开始这不是一个愚蠢的方法。
我尝试过的其他事情:
--exclusive
上的srun
标志:这只会导致srun
仅使用一个节点,而忽略其他分配的节点srun
:这似乎与使用srun --exclusive
的效果相同答案 0 :(得分:0)
所以我最终要做的是在批处理脚本中使用srun
并使用以下选项:
srun --exclusive --cpus-per-task=1 --ntasks=1 my_program.sh $a $b $chunksize &
这似乎将所有单个任务分散在所有分配的节点上,而没有任何重复。