为什么我的 slurm 作业步骤没有并行启动?

Why are my slurm job steps not launching in parallel?

我想弄清楚“任务”的概念在 SLURM 中的含义。我发现 this answer on SO 向我建议了以下工作脚本:

#!/bin/bash

#SBATCH --ntasks=2

srun --ntasks=1 sleep 10 & 
srun --ntasks=1 sleep 12 &
wait

作者说这个工作运行给他总共用了12秒,因为sleep 10sleep 12运行两个步骤是并行的,但我做不到重现那个。

如果我将上面的文件保存为slurm-test和运行

sbatch -o slurm.out slurm-test,

我看到我的作业 运行s 持续了 23 秒。

这是sacct --format=JobID,Start,End,Elapsed,NCPUS -S now-2minutes的输出:

       JobID               Start                 End    Elapsed      NCPUS
------------ ------------------- ------------------- ---------- ----------
645514       2021-06-30T11:05:38 2021-06-30T11:06:00   00:00:22          2
645514.batch 2021-06-30T11:05:38 2021-06-30T11:06:00   00:00:22          2
645514.exte+ 2021-06-30T11:05:38 2021-06-30T11:06:00   00:00:22          2
645514.0     2021-06-30T11:05:38 2021-06-30T11:05:48   00:00:10          2
645514.1     2021-06-30T11:05:48 2021-06-30T11:06:00   00:00:12          2

我的slurm.out输出是

srun: Job 645514 step creation temporarily disabled, retrying (Requested nodes are busy)
srun: Step created for job 645514

sbatch 调用中明确包含 -n 2 不会更改结果。我究竟做错了什么?如何让我的作业文件中的两个调用同时调用 运行?

根据 Slurm 版本,您可能必须将 --exclusive 参数添加到 srun(其语义与 sbatch 不同):

#!/bin/bash

#SBATCH --ntasks=2

srun --ntasks=1 --exclusive -c 1 sleep 10 & 
srun --ntasks=1 --exclusive -c 1 sleep 12 &
wait

另外添加 -c 1 以使其更明确可能会有所帮助,同样取决于 Slurm 版本。

对我来说,step creation temporarily disabled, retrying (Requested nodes are busy)的原因是,第一个执行的srun命令分配了所有内存。要解决这个问题,首先可以选择(?)在 sbatch:

中指定总内存分配
#SBATCH --ntasks=2
#SBATCH --mem=[XXXX]MB

然后指定每个 srun 任务的内存使用:

srun --exclusive --ntasks=1 --mem-per-cpu [XXXX/2]MB sleep 10 & 
srun --exclusive --ntasks=1 --mem-per-cpu [XXXX/2]MB sleep 12 &
wait

我没有为 srun 指定 cpu 计数,因为在我的 sbatch 脚本中我有 #SBATCH --cpus-per-task=1。出于同样的原因,我怀疑当您的作业不是串行作业时,您应该在 srun 命令中使用 --mem 而不是 --mem-per-cpu,但我还没有测试过此配置。