Slurm GPU集群批量提交实验并保障连续执行的问题咨询
现有脚本的调度逻辑
- 你通过
sbatch提交的外层批量执行脚本,会被Slurm识别为1个独立作业,仅会在squeue中生成1条排队记录。脚本内调用的所有srun命令属于该作业下的子作业步,不会单独进入调度队列。 - 当这个作业被调度、分配到对应的资源后,脚本内的
srun命令会按照编写顺序依次串行执行。只要你不主动终止作业、且作业没有触发集群的超时规则,所有实验会连续执行完成,中间不会被其他用户的作业抢占资源,不存在“跑完一组要等其他用户作业”的问题。
公共集群批量实验的优化方案
根据你的实验规模和集群规则,可以选择以下更灵活的方案,都可以实现实验连续执行不被插队的需求:
方案1:单作业串行/并行执行(最简便)
就是你当前写法的优化版本,适合总耗时不超过集群单作业最长时限的场景:
- 在外层
sbatch脚本头部正确声明需要的资源和总运行时长即可,比如申请单卡、总运行时长48小时的配置如下:
# 外层sbatch脚本头部配置 #SBATCH --partition=你的分区名称 #SBATCH --gres=gpu:1 #SBATCH --time=48:00:00 # 需大于所有实验的总耗时之和 # 按顺序执行所有训练脚本 bash training_1.sh bash training_2.sh ... bash training_n.sh
- 如果你申请了多卡资源,想同时并行跑多组实验,可以调整为以下写法,充分利用资源:
# 外层sbatch申请4卡:#SBATCH --gres=gpu:4 for i in {1..4}; do # 每个srun分配1张卡,后台执行 srun --gres=gpu:1 --exclusive bash training_${i}.sh & done # 等待所有后台任务执行完成 wait
方案2:Slurm作业数组(适合大规模/长耗时实验)
如果你的实验总耗时超过集群单作业最长时限,或者实验数量较多,推荐使用作业数组方案,避免单作业超时被强制终止:
- 编写作业数组提交脚本如下,配置
%1参数控制同时仅跑1个任务,结合singleton依赖保证任务按顺序执行,不会被其他用户作业插队:
# submit_array.sh #SBATCH --partition=你的分区名称 #SBATCH --gres=gpu:1 #SBATCH --time=24:00:00 # 单组实验的最长耗时 #SBATCH --array=1-20%1 # 1-20为实验序号范围,%1表示同时仅调度1个任务 #SBATCH --dependency=singleton # 同组作业数组任务按顺序执行 bash training_${SLURM_ARRAY_TASK_ID}.sh
- 提交时直接执行
sbatch submit_array.sh即可,20组实验会按序号依次执行,每组实验是独立作业,不会触发单作业超时规则。
注意:无论选择哪种方案,都需要提前评估实验的运行时长,给
--time参数预留足够的冗余量,避免作业运行到一半被集群自动终止。
内容的提问来源于stack exchange,提问作者JINJIE NI
相关产品推荐
相关产品推荐

