如何在 slurm 作业(使用 srun 开始)完全结束前暂停脚本?

12

我正在使用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

为了解释清楚,我希望以数组作业的形式运行job_slurm_script.py1000次,最多并行运行200个任务。当所有这些都完成后,我想要在status_file.txt中写入“open”。这是因为实际上我有超过10,000个作业,这超过了我的集群最大提交限制,因此我需要将其拆分成较小的块(每个包含1000个作业数组),并逐个运行它们(只有在上一个作业完成后才可以运行下一个作业)。
但是,为了使这项工作顺利进行,echo语句只能在整个作业数组完成后触发(除此之外,我还有一个循环检查status_file.txt是否已经完成作业,即内容为字符串“open”时)。
到目前为止,我认为srun会一直保持脚本运行到整个作业数组完成。然而,有时srun“返回”,脚本在作业完成之前就到达echo语句,因此所有后续作业都会从集群反弹,因为它超过了提交限制。
那么,如何使srun一直“挂起”,直到整个作业数组完成?

1
作业数组中的每个任务都是独立的,因此srun无法影响它。您可以使用依赖项在所有数组步骤完成后启动作业。 - Carles Fenoy
在这个上下文中,依赖项是什么? - Marses
1
依赖关系将阻止作业启动,直到它所依赖的作业完成为止。 - Carles Fenoy
3个回答

22

您可以在 sbatch 命令中添加标志 --wait

有关 --wait 的详细信息,请查阅 sbatch 的手册页面。


4
这并不是一个有帮助的回答,你只是提供了与sbatch无关的一般文档链接: https://slurm.schedmd.com/sbatch.html。 - Dylan Madisetti
2
@DylanMadisetti,您可以建议编辑来改进帖子! - ti7

8
您可以在bash中使用wait命令,结合sbatch--wait选项将作业发送到集群,暂停脚本执行直至作业完成,然后继续执行。例如:
#!/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"

-4
你可以使用 wait 命令。它会等待上面的代码行执行完毕后再继续执行。因此,你的脚本应该像这样:
#!/bin/bash

#SBATCH ... other options ...

#SBATCH --array=0-1000%200

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

wait

echo 'open' > status_file.txt

这似乎不起作用,并且出现了与之前相同的问题。 - Marses
你正在运行哪个版本的SLURM,并在什么样的系统上? - rmdcoding
slurm 17.02.7。另外,您所说的系统是什么意思?从我看到的情况来看,srun不会立即跳过并执行下一条命令。通常情况下,srun会保持/等待相当长的时间。但随后会发生一些事情使其跳过。我不确定是什么,尽管有一件事我怀疑是,当所有阵列作业任务都处于挂起状态时,就会发生这种情况。 - Marses

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