首页 > 解决方案 > 在 Slurm 中,如何批量提交多个实验运行,并一个接一个地连续执行?

问题描述

在由 Slurm 管理的 gpu 集群上提交作业。

我正在做一些实验,如您所知,我们必须调整参数,这意味着我需要运行几个具有不同超参数的类似脚本。所以我编写了多个 bash 脚本(例如,名为training_n.sh)来执行,在每个脚本中它就像:

# training_n.sh
    
srun [command with specific model/training hyperparameters]

然后我sbatch用来执行这些脚本,在sbatch脚本中是这样的:

# sbatch script

bash training_1.sh
bash training_2.sh
...
bash training_n.sh

如果我的“sbatch”脚本中有一个“srun”列表,如上所示,它们是如何排列在队列中的(假设我在单个分区上运行)?所有这些“srun”是被视为一项工作还是被视为单独的工作?

换句话说,它们是否在“squeue”列表中连续排队并且将连续执行?或者相反,其他用户的作业将完全排在我正在运行的“srun”之后,而剩余的“srun”只能在这些用户的作业完成后执行?

此外,在公共使用的集群上提交一批实验脚本有什么更好的想法吗?由于很多人都在使用它,我想在轮到我的时候连续完成我设计的所有实验,而不是完成一个“srun”并等待其他用户完成来开始我的下一个。

标签: machine-learningdeep-learningcluster-computingslurmexperimental-design

解决方案


如果我的“sbatch”脚本中有一个“srun”列表,如上所示,它们是如何排列在队列中的(假设我在单个分区上运行)?所有这些“srun”是被视为一项工作还是被视为单独的工作?换句话说,它们是否在“squeue”列表中连续排队并且将连续执行?或者相反,其他用户的作业将完全排在我正在运行的“srun”之后,而剩余的“srun”只能在这些用户的作业完成后执行?

如果您srun在一个脚本中提交所有这些单个脚本/命令sbatch,您将只会得到一份工作。原因是srun在工作分配内部和外部的工作方式不同。如果您srun在作业分配中运行(例如在 sbatch 脚本中),它不会创建新作业,而只会创建作业步骤。因此,在您的情况下,您将拥有一个包含n 个作业步骤的作业,该作业将在您的分配中连续运行。

此外,在公共使用的集群上提交一批实验脚本有什么更好的想法吗?

如果这些运行完全独立,则应使用大小为 n的作业数组。这样,您可以创建n个可以在有可用资源时运行的作业。

由于很多人都在使用它,我想在轮到我的时候连续完成我设计的所有实验,而不是完成一个“srun”并等待其他用户完成来开始我的下一个。

这可能不是一个好主意。如果这些作业是独立的,您可以将它们作为数组提交。通过这种方式,他们可以利用回填调度并可能运行得更快。将他们投入到一项大工作中,您可能不会获得任何收益。


推荐阅读