为什么我的Slurm作业步骤不能并行启动?

5
我试图弄清SLURM中“tasks”概念的含义。我在SO上找到了这个答案,它建议我使用以下作业脚本:
#!/bin/bash

#SBATCH --ntasks=2

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

作者称这项工作总共在12秒内运行,因为sleep 10和sleep 12两个步骤同时运行,但我无法复制它。
如果我将上述文件保存为slurm-test 并运行。
sbatch -o slurm.out slurm-test,

我看到我的工作运行了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不会改变结果。我做错了什么?如何让我的作业文件中的这两个调用同时运行?

2个回答

4

根据Slurm的版本,你可能需要在srun命令中添加--exclusive参数(其语义与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版本。


4

对于我来说,出现 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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接