SLURM 计划任务不受节点约束



我必须在非常繁忙的GPU集群上安排作业。我真的不关心节点,更关心GPU。我的代码结构方式是,每个作业一次只能使用一个 GPU,然后它们进行通信以使用多个 GPU。我们通常安排这样的事情的方式是gpus_per_task=1ntasks_per_node=8nodes=<number of GPUs you want / 8>因为每个节点都有 8 个 GPU。

由于不是每个人都需要 8 个 GPU,因此经常有一些节点有一些 (<8) 个 GPU,使用我的参数是不可调度的。既然我不关心节点,有没有办法告诉 slurm 我想要 32 个任务,我不在乎你用多少个节点来做这件事?

例如,如果它想在一台机器上给我 2 个任务,剩下 2 个 GPU,剩下的 30 个在完全空闲的节点或任何其他可行的节点之间分配,以更好地利用集群。

我知道有一个ntasks参数可以做到这一点,但文档对此有点令人困惑。它指出

默认值为每个节点一个任务,但请注意,--cpus-per-task 选项将更改此默认值。

cpus_per_task与这有什么关系?

我也看到了

如果与 --ntasks 选项一起使用,则 --ntasks 选项将优先,并且 --ntasks-per node 将被视为每个节点的最大任务计数

但我也对这种互动感到困惑。这是否意味着如果我要求--ntasks=32--ntasks-per-node=8它将在一台机器上最多放置 8 个任务,但如果它决定这样做,它可以放得更少(基本上这就是我想要的)

尝试--gpus-per-task 1--ntasks 32。每个节点未指定任务数或节点数。这允许 slurm 根据需要在节点之间分配任务,并在未充分利用的节点上使用剩余的 GPU。 而且它不会在单个节点上放置超过 8 个任务,因为可用的 GPU 不会超过 8 个。

关于ntaskscpus-per-task:这在您的情况下无关紧要。默认情况下,一个任务获得一个 CPU。如果使用--cpus-per-tasks x则保证 x CPU 位于一个节点上。如果你只是说--ntasks,情况并非如此,任务是如何分散的,但 slurm 决定。文档中有一个示例。

警告:这需要一个版本的slurm>= 19.05,因为所有 --gpu 选项都已添加到那里。

最新更新