什么是-ntasks或-n任务在SLURM中做什么?

Cha*_*ker 22 bash slurm

我正在使用SLURM来使用一些计算集群,它有-ntasks或者-n.我显然已经阅读了它的文档(http://slurm.schedmd.com/sbatch.html):

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

具体部分我不明白它的含义是:

在分配内运行将启动最多数量的任务并提供足够的资源.

我有几个问题:

  1. 我想我的第一个问题是"任务"这个词是什么意思,而不同之处在于SLURM环境中的"作业"这个词.我通常认为一项工作是在sbatch下运行bash脚本sbatch my_batch_job.sh.不确定任务意味着什么.
  2. 如果我将单词task与job相等,那么我认为它会根据参数多次运行相同的相同bash脚本-n, --ntasks=<number>.但是,我明明测试了它的集群中,跑了echo hello--ntask=9和我预期的sbatch将回声你好9次到stdout(被收集在slurm-job_id.out,但让我惊讶的是,那里是我的回声你好脚本的单次执行那么,什么是这个甚至命令呢?似乎它什么也没做,或者至少我看不到假设要做什么.

我知道-a, --array=<indexes>多个工作的选项存在.这是一个不同的主题.我只是想知道--ntasks想要做什么,理想情况下是一个例子,以便我可以在集群中测试它.

小智 14

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

相反,选项"--cpus-per-task"指定每个任务可以使用的CPU数量.

你的输出也让我感到惊讶.您是在脚本中还是通过srun启动了命令?你的脚本看起来像:

#!/bin/bash
#SBATCH --ntasks=8
## more options
echo hello
Run Code Online (Sandbox Code Playgroud)

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

如果您的脚本看起来像

#!/bin/bash
#SBATCH --ntasks=8
## more options
srun echo hello
Run Code Online (Sandbox Code Playgroud)

srun导致脚本在工作节点上运行命令,因此您应该获得8行hello.

  • 这个答案与@Alexis Lucattini 的答案相矛盾 (3认同)

Ale*_*ini 11

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

例如

使用默认的ntasks = 1

#!/bin/bash

#SBATCH --ntasks=1

srun sleep 10 & 
srun sleep 12 &
wait
Run Code Online (Sandbox Code Playgroud)

将抛出警告:

暂时禁用作业步骤创建,然后重试

默认情况下,任务数指定为一个,因此第二个任务要等到第一个任务完成后才能启动。这项工作将在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
Run Code Online (Sandbox Code Playgroud)

在这里,任务0开始和完成(在12秒内),然后是任务1(在10秒内)。使用户总时间为22秒。

要同时运行这两个命令:

#!/bin/bash

#SBATCH --ntasks=2

srun --ntasks=1 sleep 10 & 
srun --ntasks=1 sleep 12 &
wait
Run Code Online (Sandbox Code Playgroud)

运行与上面指定的相同的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
Run Code Online (Sandbox Code Playgroud)

在这里,整个工作耗时12秒。由于批处理脚本中已指定任务数量,因此作业没有等待资源的风险,因此作业具有立即运行许多命令的资源。

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

继承批处理参数的任务的另一个警告是将if --export=NONE指定为批处理参数。在这种情况下,--export=ALL应该为每个srun命令指定,否则srun命令不会继承sbatch脚本中设置的环境变量。

附加说明:
使用bash管道时,可能有必要指定--nodes = 1来防止命令在管道的任一侧在单独的节点上运行。
&用于同时运行命令时,wait至关重要。在这种情况下,如果没有wait成功执行任务1,则任务0将自行取消。

  • 这是一个很好的问题 Paloha,sbatch 内的 srun 可以让您控制批处理调用内各个任务的 cpu 和内存分配。否则,如果批处理调用中的每个进程都按顺序运行,则不需要。srun 将为该任务生成自己的指标,这样您就可以收集每个进程的 mem 和 cpu 指标,而不仅仅是整个批处理调用的指标 (3认同)
  • 似乎有时“srun”也需要“--exclusive”,如[SO的这个答案](/sf/answers/4773802071/)中详述。它有两种不同的含义。当开始一个新作业时,它会独占该节点。但是,如果运行作业*steps*(批处理脚本中的`srun`),它允许同时运行作业步骤:“在现有资源分配中启动多个作业步骤时也可以使用此选项......,其中您希望单独的处理器专用于每个工作步骤。” ([来自文档](https://slurm.schedmd.com/srun.html)) (2认同)

Sep*_*rvi 6

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

例如,

#SBATCH --ntasks=2
#SBATCH --cpus-per-task=2
Run Code Online (Sandbox Code Playgroud)

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

srun --ntasks=2 --cpus-per-task=2 step.sh
Run Code Online (Sandbox Code Playgroud)

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

srun --ntasks=1 --cpus-per-task=4 step.sh
Run Code Online (Sandbox Code Playgroud)

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

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

#!/bin/bash
#SBATCH --ntasks=1
step1.sh & 
step2.sh &
wait
Run Code Online (Sandbox Code Playgroud)

如果您想使用启动作业步骤srun并并行运行两个不同的步骤,那么您的作业需要分配两项任务,而您的作业步骤只需请求一项任务。您还需要向 提供--exclusive参数srun,以便作业步骤使用单独的资源。

#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 --exclusive step1.sh & 
srun --ntasks=1 --exclusive step2.sh &
wait
Run Code Online (Sandbox Code Playgroud)

  • @RémyHosseinkhanBoucher 我无法推荐一个好的信息来源。我只见过在我看来不太擅长解释这些概念的手册页。我已经使用 SLURM 十年了,并且了解了命令背后的某种逻辑。 (2认同)