如何在节点上平均分配 slurm 任务?

Posted

技术标签:

【中文标题】如何在节点上平均分配 slurm 任务?【英文标题】:How to distribute slurm tasks evenly over the nodes? 【发布时间】:2018-12-12 17:20:33 【问题描述】:

我想在一个 sbatch 脚本中使用 srun 命令在集群上运行大约 200 次脚本。由于执行脚本需要一些时间,因此最好将任务均匀地分布在集群中的节点上。可悲的是,我对此有疑问。

现在,我创建了一个示例脚本(“hostname.sh”)来测试 sbatch 脚本中的不同参数:

echo `date +%s` `hostname`
sleep 10

这是我的 sbatch 脚本:

#SBATCH --ntasks=15
#SBATCH --cpus-per-task=16

for i in `seq 200`; do
    srun -n1 -N1 bash hostname.sh &
done

wait

我希望 hostname.sh 被执行 200 次(for 循环),但只有 15 个任务同时运行(--ntasks=15)。由于我最大的节点有 56 个内核,因此只有三个作业应该能够同时在该节点上运行(--cpus-per-task=16)。

从脚本的输出中,我可以看到前九个任务分布在集群的九个节点上,但所有其他任务(191 个!)同时在一个节点上执行。整个 sbatch 脚本执行只用了大约 15 秒。

我想我误解了 slurm 的一些参数,但查看官方文档并没有帮助我。

【问题讨论】:

【参考方案1】:

您需要在该上下文中使用srun--exclusive 选项:

srun -n1 -N1 --exclusive bash hostname.sh &

来自srun manpage:

默认情况下,作业步骤可以访问分配给作业的每个 CPU。 要确保为每个作业步骤分配不同的 CPU,请使用 --exclusive 选项。

另请参阅上述文档中的最后一个示例。

【讨论】:

srun 的 --exclusive 选项不仅用于在节点上专门运行作业,这对我来说是新的。这对于其他 slurm 初学者来说可能非常重要......谢谢!

以上是关于如何在节点上平均分配 slurm 任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SLURM 中的节点列表向任何 [子集] 节点提交作业?

如何使用 Slurm 在多个节点上发送循环?

使用 SLURM 上的所有 CPU

Slurm无法运行多个sbatch任务

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

如何在 Spark 上平均分配 Beam 任务?