SLURM:由于抢占而取消的自动重新排队作业的标志?

SLURM: flag to auto-requeue jobs cancelled due to preemption?

我是 运行 SLURM 上的以下作业数组:

#!/bin/bash

#SBATCH --array=1-1000
#SBATCH --partition=scavenge
#SBATCH --mem=2g
#SBATCH --time=1:00:00

module load Python/3.6.4-iomkl-2018a
python run.py ${SLURM_ARRAY_TASK_ID}

我的许多工作都出错了:

slurmstepd: error: *** JOB 63830645 ON p08r06n17 CANCELLED AT 2020-08-18T21:40:52 DUE TO PREEMPTION ***

如果这些作业被抢占,我想自动重新排队。有可能这样做吗?非常感谢有关此查询的任何指示!

这取决于您的集群的设置方式。抢占由 PreemptMode Option. If that is set to 'requeue', jobs are requeued, if either srun/sbatch parameter requeue was given, or JobRequeue 设置为 1 处理(参见 scontrol show config 的输出)。

您可以将 requeue 参数添加到您的作业脚本中,如下所示:

#!/bin/bash

#SBATCH --requeue
#SBATCH --array=1-1000
...

或者您可以在提交作业时传递重新排队标志:

sbatch --requeue run.job

如果您的集群不是这种情况,那么您仍然可以解决这个问题:默认 KillWait 时间是 30 秒。一旦你的工作被终止(出于任何原因),SIGTERM 和 SIGKILL 信号之间会有 30 秒的延迟。所以你可以 trap sigterm 信号并手动重新排队你的工作,例如:

#!/bin/bash

#SBATCH --array=1-1000
#SBATCH --partition=scavenge
#SBATCH --mem=2g
#SBATCH --time=1:00:00

trap 'scontrol requeue ${SLURM_JOB_ID}; exit 15' 15 
module load Python/3.6.4-iomkl-2018a
python run.py ${SLURM_ARRAY_TASK_ID} &
wait

这会在 SIGTERM 到达时立即重新排队作业。缺点:如果您想正确取消此作业,您需要使用 scancel -9 <jobid>,因为 scancel 发送的默认信号是 SIGTERM。