【问题标题】:Chain multiple SLURM jobs with dependency链接多个具有依赖关系的 SLURM 作业
【发布时间】:2021-01-18 23:22:58
【问题描述】:

previous question 中,我询问了如何将作业 B 排在作业 A 之后开始,这已完成

sbatch --dependency=after:123456:+5 jobB.slurm

其中123456 是作业 A 的 ID,:+5 表示它将在作业 A 后五分钟开始。 我现在需要为几份工作做这件事。工作 B 应该依赖工作 A,工作 C 依赖于 B,工作 D 依赖于 C。

sbatch jobA.slurm 将返回 Submitted batch job 123456,我需要将作业 ID 传递给除第一份作业之外的所有作业的调用。由于我使用的是一个繁忙的集群,因此我不能依赖将作业 ID 加一,因为有人可能会在两者之间排队。

因此,我想编写一个脚本来接收作业脚本(*.slurm) 我想作为参数运行,例如

./run_jobs.sh jobA.slurm jobB.slurm jobC.slurm jobD.slurm

然后,该脚本应该运行,对于传递给它的所有作业脚本,

sbatch jobA.slurm # Submitted batch job 123456
sbatch --dependency=after:123456:+5 jobB.slurm # Submitted batch job 123457
sbatch --dependency=after:123457:+5 jobC.slurm # Submitted batch job 123458
sbatch --dependency=after:123458:+5 jobD.slurm # Submitted batch job 123459

使用 bash 执行此操作的最佳方法是什么?

【问题讨论】:

  • 依赖的本质是什么?工作脚本有多相似?只是因为,根据这些问题的答案,只需将sbatch <next script> 放在每个脚本的末尾或类似内容的末尾,就可能更容易实现目标。
  • 这将是一个解决方案,但我需要它们在时间上间隔约 5 分钟,如果我要从 jobA 调用 jobB 则不会出现这种情况。为了回答你的问题,我不能同时开始两份工作,因为这会导致他们失败(没有办法改善这种情况)。
  • 在提交脚本的开头或结尾插入sleep 300 是否可行?如果是这样,您可以按照建议进行操作,或者使用相同的作业名称和--dependency=singleton 选项提交它们
  • dependency=singleton 不可行,因为我希望这些作业并行运行,因为有些可能需要几天才能完成。
  • 至于sleep延迟提交,作业被放入队列,有时会同时开始,即使它们是在时间上分开提交的。

标签: slurm sbatch


【解决方案1】:

你可以使用--parsable选项来获取之前提交的job的jobid:

#!/bin/bash

ID=$(sbatch --parsable $1)
shift 
for script in "$@"; do
  ID=$(sbatch --parsable --dependency=after:${ID}:+5 $script)
done

【讨论】:

  • 这似乎工作得很好,正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多