HPC Job Dependency

HPC任务依赖的解决方案。

Motivation

在HPC集群中,有时候我们的任务会依赖于其他任务的完成。比如,我们需要先生成数据,然后再跑两个算法,最后再可视化对比结果。这时候,我们就需要让第二个任务等待第一个任务的完成。这就是任务依赖。

这里提供一个example repo:Compare EM LDSC

我们希望能有一个pipeline bash脚本,能够自动地提交任务,并且能够处理任务依赖。

Solution

Dependency 参数可以用来指定任务之间的依赖关系。可以指定任务完成后再运行,或者任务失败后再运行。

1
2
3
4
id_1=$(sbatch --parsable job_1.sh)
id_21=$(sbatch --parsable --dependency=afterok:${id_1} job_21.sh)
id_22=$(sbacth --parsable --dependency=afterok:${id_1} job_22.sh)
sbatch --dependency=afterok:${id_21}:${id_22} job_3.sh

这里我们先获取第一个任务的job id,’–parsable’ 参数可以让 sbatch 输出job id。然后在后续任务中指定依赖关系。

常用的依赖关系有:

  1. after: 任务在指定任务之后运行
  2. afterok: 任务在指定任务成功后运行
  3. afterany: 任务在指定任务完成后运行
  4. afternotok: 任务在指定任务失败后运行
  5. aftercorr: 任务在指定任务完成后运行,但是不会等待任务成功
  6. expand: 任务在指定任务完成后运行,但是会等待所有任务成功
  7. singleton: 任务在指定任务完成后运行,但是只会运行一次
  8. afterokarray: 任务在指定任务数组完成后运行

更多信息可以’man sbatch’。

此外,如果任务是array job,只需要指定一个job id,就可以等待所有任务完成。

1
2
jid=$(sbatch --parsable --array=1-100 job_arr.sh)
sbatch --dependency=afterok:${jid} job_post.sh

Reference

https://hpc-unibe-ch.github.io/slurm/dependencies.html