问题描述
我必须在非常繁忙的GPU群集上安排作业。我并不真正在乎节点,而是在乎GPU。按照我的代码的结构方式,每个作业一次只能使用一个GPU,然后它们进行通信才能使用多个GPU。由于每个节点都有8个GPU,因此我们通常这样安排时间的方法是进行gpus_per_task=1
,ntasks_per_node=8
,nodes=<number of GPUs you want / 8>
。
由于并非每个人都需要8个GPU,所以经常有节点周围有几个(
例如,如果它想在一台带有2个GPU的计算机上给我2个任务,剩下的30个则分配给完全免费的节点或任何其他可行的方法以更好地利用群集。
我知道有一个ntasks
参数可以做到这一点,但是文档对此有些混乱。声明
cpus_per_task
与这有什么关系?
我也看到了
如果与--ntasks选项一起使用,则--ntasks选项将优先,并且--ntasks-per-node将被视为每个节点的最大任务数
但是我也对此互动感到困惑。这是否意味着如果我要求--ntasks=32
--ntasks-per-node=8
,它将在一台机器上最多放置8个任务,但是如果决定(基本上这就是我想要的),则可以放置更少的任务
解决方法
尝试--gpus-per-task 1
和--ntasks 32
。未指定每个节点或节点数的任务。这使得Slurm可以根据需要在节点上分配任务,并在未充分利用的节点上使用剩余的GPU。
而且不会在单个节点上放置超过8个任务,因为没有可用的8个GPU。
关于ntasks
与cpus-per-task
:在您的情况下这无关紧要。默认情况下,一个任务获得一个CPU。如果使用--cpus-per-tasks x
,则可以确保x个CPU位于一个节点上。如果您只是说--ntasks
,情况并非如此,但任务是分散的,但昧决定。文档中有一个example。
注意事项:这需要版本为slurm> = 19.05,因为所有的--gpu选项都已添加到那里。