我在 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}
Run Code Online (Sandbox Code Playgroud)
我的许多工作都出现错误:
slurmstepd: error: *** JOB 63830645 ON p08r06n17 CANCELLED AT 2020-08-18T21:40:52 DUE TO PREEMPTION ***
Run Code Online (Sandbox Code Playgroud)
如果这些作业被抢占,我想自动重新排队。可以这样做吗?任何有关此查询的指示将不胜感激!
小智 7
这取决于您的集群的设置方式。抢占由PreemptMode选项处理。如果设置为“requeue”,则作业将重新排队(如果requeue指定了 srun/sbatch 参数,或者JobRequeue设置为 1)(请参阅 的输出scontrol show config)。
您可以将requeue参数添加到作业脚本中,如下所示:
#!/bin/bash
#SBATCH --requeue
#SBATCH --array=1-1000
...
Run Code Online (Sandbox Code Playgroud)
或者您可以在提交作业时传递重新排队标志:
sbatch --requeue run.job
Run Code Online (Sandbox Code Playgroud)
如果您的集群不是这种情况,那么您仍然可以解决此问题:默认的KillWait时间为 30 秒。一旦您的作业被终止(出于任何原因),SIGTERM 和 SIGKILL 信号之间会有 30 秒的延迟。因此,您可以发出trapsigterm 信号并手动重新排队您的作业,例如:
#!/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
Run Code Online (Sandbox Code Playgroud)
一旦 SIGTERM 到达,就会重新排队作业。缺点:如果您想正确取消此作业,则需要使用scancel -9 <jobid>,因为 scancel 发送的默认信号是 SIGTERM。