13

我正在尝试使用批处理脚本启动大量作业步骤。不同的步骤可以是完全不同的程序,并且每个都需要一个 CPU。首先,我尝试使用 to 的--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,它们像以前一样快地完成作业步骤,其他节点上的所有进程随后都被杀死)。

这似乎是预期的行为,但我无法真正理解。为什么给定分配中的每个作业步骤都需要包含至少等于分配中包含的节点数的任务。我通常根本不关心分配中使用的节点数量。

如何实现我的批处理脚本,以便它可以可靠地在多个节点上使用?

4

1 回答 1

12

找到了!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 -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

这指定仅在一个包含单个任务的节点上运行作业。

于 2014-06-09T17:44:25.423 回答