问题描述
我正在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。