SLURM中的--ntasks或-n tasks是什么意思?

85

我使用SLURM来使用一些计算群集,其中有-ntasks-n选项。我已经阅读了它的文档(http://slurm.schedmd.com/sbatch.html):

sbatch不会启动任务,它请求分配资源并提交批处理脚本。此选项建议Slurm控制器在分配内运行作业步骤时启动最大数量的任务,并提供足够的资源。默认情况下,每个节点一个任务,但请注意,--cpus-per-task选项将更改此默认值。

我不理解的具体部分是:

run within the allocation will launch a maximum of number tasks and to provide for sufficient resources.

我的几个问题:

  1. 我猜我第一个问题是什么是“任务”意味着以及在SLURM上下文中与“作业”的区别是什么。通常,我认为作业是在sbatch下运行bash脚本,例如sbatch my_batch_job.sh。不确定任务是什么意思。
  2. 如果我将单词“任务”等同于“作业”,那么我认为它将根据-n,--ntasks=<number>的参数多次运行同一标识符的bash脚本。然而,在群集中进行了测试,用--ntask=9echo hello运行,我期望sbatch会将hello打印到stdout 9 次(这被收集在slurm-job_id.out中),但出乎意料地,只有一个echo hello脚本的单个执行。那么这个命令到底是做什么的?它似乎什么也没做,或者至少我看不到它应该做什么。

我知道有-a,--array = <indexes>选项可以用于多个作业。但这是另一个话题。我只是想知道--ntasks应该做什么,最好附带一个示例,以便我可以在集群中测试它。

3个回答

80

--ntasks参数非常有用,如果您想在同一个批处理脚本中并行运行多个命令。这可能是由&分隔的两个单独的命令或在bash管道(|)中使用的两个命令。

例如:

使用默认的ntasks=1

#!/bin/bash

#SBATCH --ntasks=1

srun sleep 10 & 
srun sleep 12 &
wait

将引发警告:

任务步骤创建暂时禁用,正在重试

默认情况下指定了一个任务,因此第二个任务直到第一个任务完成后才能开始。 此作业将在大约22秒内完成。为了更好地解释:

sacct -j515058 --format=JobID,Start,End,Elapsed,NCPUS

        JobID               Start                 End    Elapsed      NCPUS
------------ ------------------- ------------------- ---------- ----------
515058       2018-12-13T20:51:44 2018-12-13T20:52:06   00:00:22          1
515058.batch 2018-12-13T20:51:44 2018-12-13T20:52:06   00:00:22          1
515058.0     2018-12-13T20:51:44 2018-12-13T20:51:56   00:00:12          1
515058.1     2018-12-13T20:51:56 2018-12-13T20:52:06   00:00:10          1

任务0开始并完成(用了12秒),接着是任务1(用了10秒)。总用户时间为22秒。

要同时运行这两个命令:

#!/bin/bash

#SBATCH --ntasks=2

srun --ntasks=1 sleep 10 & 
srun --ntasks=1 sleep 12 &
wait

执行与上述指定的相同的sacct命令

    sacct -j 515064 --format=JobID,Start,End,Elapsed,NCPUS
    JobID               Start                 End    Elapsed      NCPUS
    ------------ ------------------- ------------------- ---------- ----------
    515064       2018-12-13T21:34:08 2018-12-13T21:34:20   00:00:12          2
    515064.batch 2018-12-13T21:34:08 2018-12-13T21:34:20   00:00:12          2
    515064.0     2018-12-13T21:34:08 2018-12-13T21:34:20   00:00:12          1
    515064.1     2018-12-13T21:34:08 2018-12-13T21:34:18   00:00:10          1

这里的总作业时间为12秒。由于批处理脚本中指定了任务数量,因此不存在等待资源的风险,因此该作业有足够的资源来同时运行这么多命令。

每个任务继承批处理脚本指定的参数。这就是为什么需要为每个srun任务指定--ntasks=1,否则每个任务将使用--ntasks=2,因此第二个命令要等到第一个任务完成后才能运行。

另一个需要注意的地方是任务继承批处理参数时如果批处理参数指定了--export=NONE,则每个srun命令都应该指定--export=ALL,否则在sbatch脚本中设置的环境变量将无法被srun命令继承。

额外注意事项:
使用bash管道时,可能需要指定--nodes=1以防止管道两侧的命令在不同节点上运行。
使用&同时运行命令时,wait非常重要。在这种情况下,如果没有wait命令,任务0将取消自身,因为任务1已经成功完成。


2
似乎有时候在使用srun时也需要加上--exclusive,详见这个Stack Overflow的回答。它有两种不同的含义。当启动一个新作业时,它会独占节点。但是如果运行作业步骤(批处理脚本中的srun),它允许同时运行作业步骤:“此选项还可用于在现有资源分配内启动多个作业步骤...,其中您希望将单独的处理器专用于每个作业步骤。”(来自文档 - akraf
没有压力,只是想知道我是否需要更改这个或者最新版本的Slurm是否已经默认为预期输出?sinfo --version会产生什么结果? - Alexis Lucattini
在我的电脑上,它是v20.11.5。 - akraf
1
为什么在批处理脚本中要使用srun?我不能只使用例如eval吗?使用srun的优势是什么? - Paloha
3
这是个好问题,Paloha。在 sbatch 中运行 srun 可以让你控制批处理调用中每个任务的 CPU 和内存分配。否则,如果批处理调用中的每个进程都是按顺序运行的,则不需要使用 srun。srun 将为每个任务生成自己的指标,因此您可以收集每个进程的内存和 CPU 指标,而不仅仅是整个批处理调用的指标。 - Alexis Lucattini
显示剩余3条评论

34

"--ntasks"选项指定要执行命令的实例数。 对于常见的集群设置,如果您使用"srun"启动您的命令,则对应于MPI等级的数量。

相反,“--cpus-per-task”选项指定每个任务可以使用多少个CPU。

你的输出也让我感到惊讶。你是在脚本中启动了命令还是通过srun启动的? 你的脚本是否像这样:

#!/bin/bash
#SBATCH --ntasks=8
## more options
echo hello

这应该始终只输出一行,因为脚本仅在提交节点上执行而不是在工作者节点上执行。

如果您的脚本看起来像

#!/bin/bash
#SBATCH --ntasks=8
## more options
srun echo hello

srun会导致脚本在工作节点上运行您的命令,结果您应该会得到8行“hello”。


嘿,你介意看一下我的后续问题吗?链接在这里:https://dev59.com/i7Dma4cB1Zd3GeqPA8HI?这是关于如何在并行运行作业时分配资源的问题。 - StephenChen
8
好的,我将尽力完成您的翻译请求。以下是需要翻译的内容:This answer contradicts the one by @Alexis Lucattini. - aaronsnoswell
不一定是@aaronosnoswell。我没有尝试过,但如果没有明确说明“--n-tasks”开关,则srun可能会隐式运行<ntasks>次任务。 - moritzschaefer

5

任务是作业在一个或多个节点中并行执行的过程。“sbatch”为您的作业分配资源,但即使您请求多个任务的资源,它也只会在单个进程和单个节点中启动您的作业脚本。“srun”用于从批处理脚本启动作业步骤。“--ntasks=N”指示“srun”执行N个作业步骤的副本。

例如:

#SBATCH --ntasks=2
#SBATCH --cpus-per-task=2

这意味着您想要并行运行两个进程,并使每个进程访问两个CPU。 sbatch 将为您的作业分配四个CPU,然后在单个进程中启动批处理脚本。在批处理脚本中,您可以使用并行作业步骤创建一个并行作业。

srun --ntasks=2 --cpus-per-task=2 step.sh

这将并行运行两个进程,它们都执行step.sh脚本。从同一作业中,您还可以运行

srun --ntasks=1 --cpus-per-task=4 step.sh

这将启动一个可以访问所有四个GPU的单个进程(尽管它会发出警告)。

值得注意的是,在分配的资源范围内,您的作业脚本可以自由地执行任何操作,并且不必使用srun来创建作业步骤(但您需要srun在多个节点上启动作业步骤)。例如,以下脚本将同时运行两个步骤:

#!/bin/bash
#SBATCH --ntasks=1
step1.sh & 
step2.sh &
wait

如果您想使用srun启动作业步骤,并且有两个不同的步骤并行运行,那么您的作业需要分配两个任务,并且您的作业步骤只需要请求一个任务。您还需要在srun中提供--exclusive参数,以便作业步骤可以使用单独的资源。
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 --exclusive step1.sh & 
srun --ntasks=1 --exclusive step2.sh &
wait

这个信息在文档的哪里给出了?@SeppoEnarvi - Rémy Hosseinkhan Boucher
1
@RémyHosseinkhanBoucher 我无法推荐一个好的信息来源。我只看过man手册,但我认为它们并不擅长解释这些概念。我使用SLURM已经有十年了,并且学到了一些命令背后的逻辑。 - Seppo Enarvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接