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

2023-12-06

服务器刚刚从 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}

这是第二个作业数组事后1仅在第一个作业数组的每个元素之后开始events1已完成。然而,我真正想要的是i- 第二个作业数组的第一个元素仅取决于i-第一个作业数组的第一个元素(实际上,两个数组始终具有相同的大小)。我知道对于 CONDOR,这可以通过使用 DAG 来完成。

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

Edit: 根据达米安·弗朗索瓦的答案,关键词后校正就是我一直在寻找的。我有一个后续问题。

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

提前谢谢了!


从 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以获得简短的介绍和指导。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐