并行但不同的Slurm srun作业步骤调用无法工作

9
我希望能在多个不同的输入文件上运行相同的程序。 我可以将每个文件作为单独的 Slurm 提交,但我不想一次向队列中投入1000个任务。 相反,我一直在尝试找出如何创建一个分配并循环处理所有文件,然后使用 srun 在该分配中为每个调用提供单个核心。 问题在于,无论我做什么,只有一个工作步骤运行。 我能想到的最简单的测试案例是:
#!/usr/bin/env bash

srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &

wait

无论我分配多少核心,都没有关系:

time salloc -n 1 test
time salloc -n 2 test
time salloc -n 4 test

它总是需要4秒钟的时间。有没有可能让多个作业步骤并行执行?

3个回答

9

原来默认的每个CPU内存没有定义,因此即使是单核作业也会通过保留节点的所有RAM来运行。

设置DefMemPerCPU或指定显式的RAM预留可以解决问题。


3
我遇到了同样的问题。我用 srun 依次运行了 3 个作业,但第一个作业后就卡住了。你能分享一下你在脚本中添加了什么来解决这个问题吗? 我使用了这个代码,但仍然出现错误。#SBATCH --mem=0 export DAEMON_MEM=${SLURM_MEM_PER_CPU:=4096} export SPARK_MEM=$((${DAEMON_MEM}*(${SPARK_WORKER_CORES} -1))) - Tolga

5
请注意,在这种情况下,您需要同时测量运行时间和等待时间。您的提交脚本应该像这样:

要注意的是,在这种情况下,您需要同时测量运行时间和等待时间。您的提交脚本应该是这样的:

#!/usr/bin/env bash

time {
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
srun --exclusive --ntasks 1 -c 1 sleep 1 &
wait
}

只需简单地提交即可

salloc -n 1 test
salloc -n 2 test
salloc -n 4 test

您应该注意到区别,以及在使用 n<4 时出现类似于 srun: Job step creation temporarily disabled, retrying 的消息。

1
这些是很好的建议,非常感谢。然而,问题最终却是其他原因引起的。 - Cyclone

3

由于提问者已经解决了他的问题但没有提供代码,我将在下面分享我的看法。

在我的情况下,我遇到了错误/警告step creation temporarily disabled, retrying (Requested nodes are busy)。这是因为执行的第一个srun命令分配了所有内存,这也是提问者遇到的相同原因。要解决这个问题,首先可以选择为sbatch(如果你正在使用一个sbatch脚本)指定总内存分配量:

#SBATCH --ntasks=4
#SBATCH --mem=[XXXX]MB

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

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

在我的 sbatch 脚本中,我包含了 #SBATCH --cpus-per-task=1,因此我没有为 srun 指定 CPU 数。出于同样的原因,我怀疑你可以在 srun 命令中使用 --mem 来代替 --mem-per-cpu,但我还没有测试过这个配置。


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