在 Slurm 中,如何批量提交多个实验运行,并一个接一个地连续执行?

Posted

技术标签:

【中文标题】在 Slurm 中,如何批量提交多个实验运行,并一个接一个地连续执行?【英文标题】:In Slurm, how to submit multiple experimental runs in a batch, and excute them consecutively one-by-one? 【发布时间】:2021-12-25 07:12:24 【问题描述】:

在由 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”并等待其他用户完成来开始我的下一个。 p>

【问题讨论】:

【参考方案1】:

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

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

另外,有没有更好的办法在公共集群上提交一批实验脚本?

如果这些运行完全独立,您应该使用job array,大小为n。通过这种方式,您可以创建 n 个作业,只要有可用资源就可以运行。

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

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

【讨论】:

我认为“将它们放入一个大作业中”(将多个 srun 放入一个 sbatch 脚本中)会使其他人无法插入我的作业数组,因此我可以在无需等待的时间。真的吗? slurm中的sbatch是这样工作的吗? 是和不是。你是对的,如果你把他们都打包到一份工作中,其他人就不会介入你的计算。但另一方面,如果你有一个大作业,队列中等待它开始之前的等待时间很可能会显着延长,而对于许多小作业,它们通常可以很快开始。但这也取决于集群上的 Slurm 是如何配置的。也许问问你的系统管理员,他们喜欢什么。

以上是关于在 Slurm 中,如何批量提交多个实验运行,并一个接一个地连续执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 收集多个表单提交并一次提交给猫鼬模型?

如何使用同一个 GPU 设备在 SLURM 中定义多个 gres 资源?

Slurm 作业不能为多个节点请求 GPU 资源

如何在多个 GPU 节点上获取分配给 SLURM 作业的 GPU ID?

如何跨 Slurm 集群上的多个节点运行 MPI Python 脚本?错误:警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为 1

Slurm 作业数组提交严重未充分利用可用资源