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

问题描述

我正在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选项处理。如果将其设置为“ requeue”,则在给定srun / sbatch参数requeue或将JobRequeue设置为1的情况下对作业进行重新排队(请参见scontrol show config的输出)。>

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

#!/bin/bash

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

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

sbatch run.job --requeue

如果您的集群上不是这种情况,那么您仍然可以解决此问题:默认的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。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...