我必须在非常繁忙的GPU集群上安排作业。我真的不关心节点,更关心GPU。我的代码结构方式是,每个作业一次只能使用一个 GPU,然后它们进行通信以使用多个 GPU。我们通常安排这样的事情的方式是gpus_per_task=1
、ntasks_per_node=8
,nodes=<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 个。
关于ntasks
与cpus-per-task
:这在您的情况下无关紧要。默认情况下,一个任务获得一个 CPU。如果使用--cpus-per-tasks x
则保证 x CPU 位于一个节点上。如果你只是说--ntasks
,情况并非如此,任务是如何分散的,但 slurm 决定。文档中有一个示例。
警告:这需要一个版本的slurm>= 19.05,因为所有 --gpu 选项都已添加到那里。