SLURM中两个作业数组之间的一对一依赖关系

时间:2017-06-25 00:09:32

标签: slurm

服务器刚从CONDOR切换到SLURM,所以我正在学习并尝试将我的提交脚本翻译成SLURM。

我的问题如下,我有两个工作阵列。第二个取决于第一个。目前,我的内容如下:

events1=$(sbatch --job-name=events --array=1-3 --output=z-events-%a.stdout myfirst.sh)
jobid_events1=`echo ${events1} | sed -n -e 's/^.*job //p' `
echo "The job ID of the events is "${jobid_events1}

postevents1=$(sbatch --job-name=postevents --dependency=afterany:${jobid_events1} --array=1-3 mysecond.sh)
jobid_postevents1=`echo ${postevents-cftables1} | sed -n -e 's/^.*job //p' `
echo "The job ID post-event calculations is "${jobid_postevents1}

此处第二个作业数组 postevents1 仅在第一个作业数组 events1 中的每个元素完成后才会启动。但是,我确实想要的是第二个作业数组的 i -th元素仅取决于第一个作业数组的 i -th元素(实际上,两者都是数组总是具有相同的大小)。我知道这可以通过在CONDOR的情况下使用DAG来完成。

我意识到我可以手动打破第二个作业阵列并单独进行匹配。但是,由于我必须打破第二个作业阵列,如果第三个作业依赖于第二个作业数组的所有元素,对我来说变得越来越不方便。

修改:根据 damienfrancois 的回答,关键字 aftercorr 就是我想要的。我有一个后续问题。

虽然,第一眼看到,"成功完成"确实很有道理。但是,如果其中一个任务(在第一个作业数组中)未成功完成,则必须手动删除第二个数组中的相应任务?如果是这样,那么它可能很复杂的是,如果第一个作业数组中的任何任务失败,那么依赖于第二个作业数组任务的部分完成的任何其他作业都将挂在那里(这在我的实践中很常见) )。在这种情况下,如何实现" afterany"选项?

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

从版本16.05开始,Slurm可以选择--dependency=aftercorr:job_id[:jobid...]

  

此作业数组的任务可以在相应的后开始执行   指定作业中的任务ID已成功完成(运行到   退出代码为零完成。

它可以满足您的需求。

然而,它有你描述的缺点;如果第一个数组中的相应作业崩溃,第二个数组中的作业将无限期地等待。你有几个行动方案,其中没有一个是完美的:

  1. 如果可以在提交脚本中检测到作业崩溃,并且崩溃是随机的,您只需使用scontrol requeue $SLURM_JOB_ID重新排队作业,以便它再次运行。

  2. 否则,您可以在第二个数组中的作业结尾处添加一段Bash代码,该代码将检查第一个数组中的任何作业是否仍在队列中,如果不是,则取消全部第二个阵列中剩余的工作;像这样的东西(未经测试) [[ $(squeue --noheader --name events | wc -l) == 0 ]] && scancel $SLURM_JOB_ID

  3. 最后,最后一个选择是使用全功能工作流程系统。有关简短介绍和指示,请参阅this