如何在 slurm 作业(从 srun 开始)完全完成之前暂停脚本?

How to hold up a script until a slurm job (start with srun) is completely finished?

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

#!/bin/bash

#SBATCH ... other options ...

#SBATCH --array=0-1000%200

srun ./job_slurm_script.py    

echo 'open' > status_file.txt

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

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

到目前为止,我认为 srun 会在整个作业数组完成之前保留脚本。但是,有时 srun "returns" 脚本会在作业完成之前转到 echo 语句,因此所有后续作业都会从集群中反弹,因为它超出了提交限制。

那么如何使 srun "hold up" 直到整个作业数组完成?

您可以使用wait bash 命令。它将等到上面的任何代码行完成。因此你的脚本应该是这样的:

#!/bin/bash

#SBATCH ... other options ...

#SBATCH --array=0-1000%200

srun ./job_slurm_script.py    

wait

echo 'open' > status_file.txt

您可以将标志 --wait 添加到 sbatch

查看 sbatch 的手册页以获取有关 --wait 的信息。

您可以结合使用 sbatch 中的 --wait 选项和 bash 中的 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"