我试图在一个大的多节点分配中运行许多较小的SLURM作业步骤,但我很难理解如何将作业步骤的任务分配给不同的节点。通常,我希望尽可能将一个作业步骤的任务保持在本地(相同的节点、相同的套接字),并且只在不能将所有任务放在单个节点上时溢出到下一个节点。
下面的示例显示了这样一种情况:我分配了2个节点,每个节点有4个任务,然后启动一个作业步骤,请求4个任务:
$ salloc -N 2 --ntasks-per-node=4 srun -l -n 4 hostname
salloc: Granted job allocation 9677936
0: compute-3-6.local
1: compute-3-6.local
2: compute-3-7.local
3: compute-3-7.local
salloc: Relinquishing job allocation 9677936我希望这4个任务转移到其中一个节点,以便第二个作业步骤可以声明另一个节点,但情况并非如此:第一个作业步骤在两个节点之间均匀分布。如果我启动了包含4个任务的第二个作业步骤,那么它也会分布在各个节点上,从而导致大量不必要的节点间网络通信,这是很容易避免的。
我已经发现,通过显式地包含作业步骤启动的-N 1,我可以强制我的作业步骤在单个节点上运行:
$ salloc -N 2 --ntasks-per-node=4 srun -l -N 1 -n 4 hostname
salloc: Granted job allocation 9677939
0: compute-3-6.local
1: compute-3-6.local
2: compute-3-6.local
3: compute-3-6.local
salloc: Relinquishing job allocation 9677939但是,在我的情况下,启动的作业步骤数和每个作业步骤的任务数取决于用户的输入,所以我不能仅仅强制所有这些步骤的-N 1。可能有一些作业步骤有太多的任务不能放在单个节点上。
阅读srun手册时,我首先认为--distribute=block:block选项应该对我起作用,但它不起作用。这个选项似乎只在决定了作业步骤要使用的节点数之后才起作用。
我的另一个想法是,作业步骤可能只是继承分配中的-N 2参数,因此也被迫使用两个节点。我尝试为作业步骤设置-N 1-2,以便至少允许SLURM将作业步骤分配给单个节点,但这对我没有任何影响,即使与--use-min-nodes标志相结合也没有效果。
$ salloc -N 2 --ntasks-per-node=4 srun -l -N 1-2 --use-min-nodes -n 4 hostname
salloc: Granted job allocation 9677947
0: compute-3-6.local
1: compute-3-6.local
2: compute-3-7.local
3: compute-3-7.local
salloc: Relinquishing job allocation 9677947如何使SLURM作业步骤使用最小节点数?
发布于 2022-03-07 21:55:29
不幸的是,没有其他办法了。你必须使用-N。
即使您使用-n 1 (而不是4),也会有一个警告
salloc -N 2 --ntasks-per-node=4 srun -l -n 1 hostname
srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1但如果你用,
salloc -N 2 --ntasks-per-node=4 srun -l -N 1-2 --use-min-nodes -n 1 hostname这里不会有任何警告,因为这样至少会使用一个节点。
原因: slurm将尝试在分配/请求的节点数中至少启动一个single task,除非使用-N flag (如下面的输出)另有规定。
srun -l -N 1-2 --use-min-nodes -m plane=48 -n 4 hostname
0: compute-3-6.local
1: compute-3-6.local
2: compute-3-6.local
3: compute-3-7.local您可以看到,一个任务在节点2中启动,而剩下的任务仅在另一个节点中启动。这是因为,您的分配请求两个节点(salloc)。如果您想在一个节点上运行,您必须使用-N变量指定它,以强制它只使用单个节点。
我想你可以即时计算-N来解决你的问题。因为您知道节点中可能存在的最大任务(假设它是一个同构的系统),那么您可以在使用srun启动任务之前计算应用程序所需的节点数。
但是,在我的例子中,启动的作业步骤数和每个作业步骤的任务数取决于用户的输入,所以我不能仅仅强制执行
1。可能有一些作业步骤有太多的任务不能放在一个节点上。
。
https://stackoverflow.com/questions/71382578
复制相似问题