You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理中间作业动态生成时的SLURM作业依赖问题

解决SLURM动态生成作业的流水线依赖问题

要让job_3.sh仅在动态生成的job_2.sh执行完成后运行,有两种可行的方案,以下是具体实现:

方案一:动态更新job3的依赖关系

先提前提交处于挂起状态的job3,待job2提交后,修改job3的依赖规则。

修改pipeline.sh

#!/bin/bash

# 提交job1,负责生成job2.sh
job1_id=$(sbatch --parsable job_1.sh)

# 先提交job3,用无效依赖(afterok:0)让它处于挂起状态
job3_id=$(sbatch --parsable --dependency=afterok:0 job_3.sh)
echo $job3_id > job3_id.txt

# 提交job1_5,传入job1的ID和job3的ID作为参数
job1_5_id=$(sbatch --parsable --dependency=afterok:$job1_id job_1_5.sh $job1_id $job3_id)

修改job_1_5.sh

#!/bin/bash
#SBATCH --job-name=job1_5
#SBATCH --output=job1_5_%j.out
#SBATCH --time=00:05:00

# 接收传入的参数:$1是job1的ID,$2是job3的ID
job1_id=$1
job3_id=$2

# 提交job2并记录其ID
job_2_id=$(sbatch --parsable job_2.sh)
echo $job_2_id > job2_id.txt

# 更新job3的依赖,改为等待job2执行成功后再运行
scontrol update jobid=$job3_id dependency=afterok:$job_2_id

# 若需要同时等待job1_5完成,可改为:
# scontrol update jobid=$job3_id dependency=afterok:$SLURM_JOB_ID,$job_2_id

方案二:让job1_5负责提交job3(推荐)

调整流水线逻辑,让中间作业job1_5在提交job2后,直接提交job3并指定依赖关系,无需提前提交job3。

修改pipeline.sh

#!/bin/bash

# 提交job1,负责生成job2.sh
job1_id=$(sbatch --parsable job_1.sh)

# 提交job1_5,仅依赖job1执行成功
job1_5_id=$(sbatch --parsable --dependency=afterok:$job1_id job_1_5.sh)

修改job_1_5.sh

#!/bin/bash
#SBATCH --job-name=job1_5
#SBATCH --output=job1_5_%j.out
#SBATCH --time=00:05:00

# 提交job2并记录其ID
job_2_id=$(sbatch --parsable job_2.sh)
echo $job_2_id > job2_id.txt

# 提交job3,指定依赖job2执行成功
job3_id=$(sbatch --parsable --dependency=afterok:$job_2_id job_3.sh)
echo $job3_id > job3_id.txt

注意事项

  1. 方案二中无需提前提交job3,逻辑更简洁,出错概率更低,优先推荐。
  2. 方案一中使用scontrol update需要确保你有修改自身作业的权限(通常用户对自己提交的作业有此权限)。
  3. 移除job_1_5.sh中原有的#SBATCH --dependency=afterok:$1行,避免与sbatch命令中的依赖规则冲突。

内容的提问来源于stack exchange,提问作者desert_ranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:47:34