我正在尝试使用批处理脚本启动大量作业步骤。不同的步骤可以是完全不同的程序,并且每个步骤只需要一个CPU。首先,我尝试使用--multi-prog
参数srun
来执行此操作。不幸的是,当以这种方式使用分配给我的作业的所有CPU时,性能会大幅降低。运行时间几乎增加到序列化值。通过订阅我可以改善这一点。我无法在网上找到有关此问题的任何内容,因此我认为这是我正在使用的群集的配置问题。
所以我试着走另一条路。我实现了以下脚本(通过sbatch my_script.slurm
启动):
#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48
NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
#My call looks like this:
#srun --exclusive -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
srun --exclusive -n1 hostname &
pids[${PROC}]=$! #Save PID of this background process
done
for pid in ${pids[*]};
do
wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done
我知道,在我的案例中并不真正需要--exclusive
参数。调用的shell脚本包含不同的二进制文件及其参数。我的脚本的其余部分依赖于所有进程已完成wait
的事实。我更改了调用行,使其成为一个最小的工作示例。
起初这似乎是解决方案。不幸的是,当增加我的作业分配中使用的节点数量时(例如,通过将--ntasks
增加到大于我的集群中每个节点的CPU数量的数量),脚本不再按预期工作,返回
srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1
继续只使用一个节点(在我的情况下是48个CPU,它们像以前一样快速完成作业步骤,其他节点上的所有进程随后被杀死)。
这似乎是预期的行为,但我无法理解它。为什么给定分配中的每个作业步骤都需要包含与分配中包含的节点数相等的最小任务数。我通常根本不关心我的分配中使用的节点数。
如何实现我的批处理脚本,以便可以在多个节点上可靠地使用它?
答案 0 :(得分:7)
#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48
NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
#My call looks like this:
#srun --exclusive -N1 -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
srun --exclusive -N1 -n1 hostname &
pids[${PROC}]=$! #Save PID of this background process
done
for pid in ${pids[*]};
do
wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done
这指定仅在包含单个任务的一个节点上运行作业。