在 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 资源?
如何在多个 GPU 节点上获取分配给 SLURM 作业的 GPU ID?
如何跨 Slurm 集群上的多个节点运行 MPI Python 脚本?错误:警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为 1