如何阻止脚本直到 slurm 作业(从 srun 开始)完全完成?

Mar*_*ses 6 cluster-computing slurm

我正在使用 SLURM 运行一个作业数组,其中包含以下作业数组脚本(我使用它运行sbatch job_array_script.sh [args]

#!/bin/bash

#SBATCH ... other options ...

#SBATCH --array=0-1000%200

srun ./job_slurm_script.py $1 $2 $3 $4

echo 'open' > status_file.txt
Run Code Online (Sandbox Code Playgroud)

为了解释一下,我想job_slurm_script.py作为一个数组作业运行 1000 次,最多并行 200 个任务。当所有这些都完成后,我想写 'open' 到status_file.txt. 这是因为实际上我有超过 10,000 个作业,这高于我的集群的 MaxSubmissionLimit,所以我需要将它拆分成更小的块(在 1000 个元素的作业数组中)并一个接一个地运行它们(仅当前一个完成)。

但是,为了使其工作,echo 语句只能在整个作业数组完成后触发(除此之外,我有一个循环来检查status_file.txt作业是否完成,即当内容是字符串“open”时) .

到目前为止,我认为srun将脚本保留到整个作业数组完成。然而,有时srun“返回”并且脚本会在作业完成之前转到 echo 语句,因此所有后续作业都会从集群中反弹,因为它超出了提交限制。

那么如何srun在整个作业数组完成之前“保持”状态?

小智 12

您可以将标志添加--waitsbatch

查看sbatch的手册页以获取有关--wait.

  • 这不是一个有用的答案,您只需链接到专门针对“sbatch”的一般文档:https://slurm.schedmd.com/sbatch.html (2认同)
  • @DylanMadisetti 您可以[建议编辑](https://stackoverflow.com/posts/49509245/edit) 来改进帖子! (2认同)

irr*_*rom 8

您可以在 bash 中结合使用--waitoption in将作业发送到集群,暂停脚本执行直到这些作业完成,然后继续。例如sbatchwait

#!/bin/bash
set -e
date

for((i=0; i<5; i++)); do
    sbatch -W --wrap='echo "hello from $SLURM_ARRAY_TASK_ID"; sleep 10' &
done;
wait

date
echo "I am finished"
Run Code Online (Sandbox Code Playgroud)