首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使SLURM作业步骤使用最小节点数?

如何使SLURM作业步骤使用最小节点数?
EN

Stack Overflow用户
提问于 2022-03-07 14:27:21
回答 1查看 223关注 0票数 1

我试图在一个大的多节点分配中运行许多较小的SLURM作业步骤,但我很难理解如何将作业步骤的任务分配给不同的节点。通常,我希望尽可能将一个作业步骤的任务保持在本地(相同的节点、相同的套接字),并且只在不能将所有任务放在单个节点上时溢出到下一个节点。

下面的示例显示了这样一种情况:我分配了2个节点,每个节点有4个任务,然后启动一个作业步骤,请求4个任务:

代码语言:javascript
复制
$ 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,我可以强制我的作业步骤在单个节点上运行:

代码语言:javascript
复制
$ 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标志相结合也没有效果。

代码语言:javascript
复制
$ 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作业步骤使用最小节点数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-07 21:55:29

不幸的是,没有其他办法了。你必须使用-N

即使您使用-n 1 (而不是4),也会有一个警告

代码语言:javascript
复制
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

但如果你用,

代码语言:javascript
复制
salloc -N 2 --ntasks-per-node=4 srun -l -N 1-2 --use-min-nodes -n 1 hostname

这里不会有任何警告,因为这样至少会使用一个节点。

原因: slurm将尝试在分配/请求的节点数中至少启动一个single task,除非使用-N flag (如下面的输出)另有规定。

代码语言:javascript
复制
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。可能有一些作业步骤有太多的任务不能放在一个节点上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71382578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档