我的R分析由三部分组成(partA
,partB
和partC
)。我将每个部分提交给SLURM(例如sbatch partA
),并且每个部分都通过#SBATCH --array=1-1500
进行并行化。这些部件是串行的,所以我需要在开始下一个之前等待一个完成。现在我手动开始每项工作,但这不是一个好的解决方案。
我想自动执行三个sbatch调用。例如:
sbatch partA
partA
时,sbatch partB
partB
时,sbatch partC
我使用this solution获取partA
的职位ID,并将其传递给strigger
以完成上述第2步。但是,我仍然坚持这一点,因为我不知道如何从partB
获取strigger
的工作ID。这是我的代码的样子:
#!/bin/bash
# step 1: sbatch partA
partA_ID=$(sbatch --parsable partA.sh)
# step 2: sbatch partB
strigger --set --jobid=$partA_ID --fini --program=/path/to/partB.batch
# step 3: sbatch partC
... ?
如何完成第3步?
答案 0 :(得分:2)
heroku certs:auto
不是实现该目标的正确工具,它更多地针对管理员而非常规用户。只有strigger
才能实际设置触发器(请参阅strigger manpage中的"重要说明")。
在您的情况下,您应该一次提交所有三个作业,并在其中设置依赖项。
例如:
slurm user
这将提交三个作业数组,但第二个仅在第一个作业完成后才开始。而第三个只会在第二个工作完成后才开始。
替代方案可以是
$ partA_ID=$(sbatch --parsable partA.sh)
$ partB_ID=$(sbatch --parsable --dependency=afterany:${partA_ID} partB.sh)
$ partC_ID=$(sbatch --parsable --dependency=afterany:${partB_ID} partC.sh)
这将提交三个作业数组,但第二个作业中的所有作业将不会启动,直到第一个作业中的相应作业(即具有相同$ partA_ID=$(sbatch --parsable partA.sh)
$ partB_ID=$(sbatch --parsable --dependency=aftercorr:${partA_ID} partB.sh)
$ partC_ID=$(sbatch --parsable --dependency=aftercorr:${partB_ID} partC.sh)
的作业)完成。并且第三个作业中的所有作业只有在第二个作业中的相应作业完成时才会开始。
有关详细信息,请参阅sbatch manpage中的$SLURM_ARRAY_TASK_ID
部分。