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

Posted

技术标签:

【中文标题】如何从 SLURM 中的节点列表向任何 [子集] 节点提交作业?【英文标题】:How to submit a job to any [subset] of nodes from nodelist in SLURM? 【发布时间】:2014-11-30 17:48:36 【问题描述】:

我有几千个作业要在具有 16 个节点的 SLURM 集群上运行。这些作业应仅在大小为 7 的可用节点的子集上运行。一些任务是并行的,因此使用单个节点的所有 CPU 能力,而其他任务是单线程的。因此,多个作业应该在单个节点上同时运行。任何任务都不应在多个节点上产生。

目前我提交的每个工作如下:

sbatch --nodelist=myCluster[10-16] myScript.sh

但是,这个参数使 slurm 等待提交的作业终止,因此有 3 个节点完全未使用,并且根据任务(多线程或单线程),当前活动节点也可能处于低负载状态CPU 能力。

sbatch 强制 slurm 在指定节点上同时运行多个作业的最佳参数是什么?

【问题讨论】:

【参考方案1】:

你可以反过来工作;而不是指定使用哪些节点,效果是每个作业都分配了所有 7 个节点,而是指定不使用哪些节点:

sbatch --exclude=myCluster[01-09] myScript.sh

Slurm 永远不会为您的作业分配超过 7 个节点。确保集群配置允许节点共享,并且您的myScript.sh 包含#SBATCH --ntasks=1 --cpu-per-task=nn 每个作业的线程数。

【讨论】:

这假设您不是管理员。否则,限制和关联就是要走的路。 “关联”是指 SLURM 词汇中的“保留”吗? 不,我的意思是associations,这是 Slurm 在帐户、服务质量、分区等方面设置限制的术语。 我在使用 =myCluster[01-09] 语法时遇到问题 :( 在这种情况下,哪些是不同的节点名称? --exclude=myCluster[01-09] 等价于--exclude=myCluster01,myCluster02,myCluster03,myCluster04,myCluster05,myCluster07,myCluster08,myCluster09,myCluster10,【参考方案2】:

一些任务是并行的,因此使用单个节点的所有 CPU 能力,而其他任务是单线程的。

我了解到您希望单线程作业共享一个节点,而并行作业应该独占分配整个节点?

多个作业应在单个节点上同时运行。

就我对 SLURM 的理解而言,这意味着您必须将 CPU 内核定义为可消耗资源(即 slurm.conf 中的 SelectType=select/cons_resSelectTypeParameters=CR_Core

然后,要限制并行作业以获取整个节点,您可以使用--exclusive 选项(但请注意分区配置优先:如果分区配置为独占访问,则不能拥有共享节点),或使用-N 1 --tasks-per-node="number_of_cores_in_a_node"(例如,-N 1 --ntasks-per-node=8)。

请注意,后者仅在所有节点具有相同数量的核心时才有效。

任何任务都不应在多个节点上产生。

这应该由-N 1保证。

【讨论】:

关键是我所有的工作总共使用不超过 7 个节点。我们集群的每个节点有 20 个核心,每个核心有 2 个线程。如果我理解正确,您建议使用sbatch --nodelist=myCluster[10-16] --ntasks-per-node=40 -N 1 myScript.sh 提交并行作业。为什么不--ntasks-per-node=1,以确保在一个节点上同时运行的作业不超过一个?那么单线程作业呢? @Faber 如果您想限制一组作业总共使用最多 7 个节点,那么分区或 QoS 设置将是可行的方法。【参考方案3】:

实际上,我认为要先设置“reservation”。根据此演示文稿http://slurm.schedmd.com/slurm_ug_2011/Advanced_Usage_Tutorial.pdf(最后一张幻灯片)。

场景:从中午开始在默认 SLURM 分区中保留 10 个节点,持续时间为每天 60 分钟。预订仅适用于用户 alan 和 brenda。

scontrol create reservation user=alan,brenda starttime=noon duration=60 flags=daily nodecnt=10
Reservation created: alan_6

scontrol show res
ReservationName=alan_6 StartTime=2009-02-05T12:00:00
    EndTime=2009-02-05T13:00:00 Duration=60 Nodes=sun[000-003,007,010-013,017] NodeCnt=10 Features=(null) PartitionName=pdebug Flags=DAILY Licenses=(null)
    Users=alan,brenda Accounts=(null)

# submit job with:
sbatch --reservation=alan_6 myScript.sh

很遗憾,我无法测试此过程,可能是由于缺乏权限。

【讨论】:

预留会阻止任何其他用户在同一组节点上运行,这就是为什么需要管理员来创建它的原因。这是你真正想要的吗?为您的专属访问预留节点? 这就是我们在(少数)用户中达成的共识。如果我们可以设置最大持续时间,为什么不呢?或者这种方法是集群使用的完全反模式? 是否可以授予普通用户设置预订的权限?

以上是关于如何从 SLURM 中的节点列表向任何 [子集] 节点提交作业?的主要内容,如果未能解决你的问题,请参考以下文章

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

子集存储在列表中的数据帧

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

如何使用 SLURM 停止计算节点?

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

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