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

时间:2016-08-27 23:28:21

标签: bash slurm

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

  

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

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

  

在分配内运行将启动最多的任务数和   提供充足的资源。

我有几个问题:

  1. 我想我的第一个问题是" task"意思是差异在于" job"在SLURM环境中。我通常认为一项工作是在sbatch my_batch_job.sh下在sbatch下运行bash脚本。不确定任务意味着什么。
  2. 如果我将单词task与作业等同,那么我认为它会根据-n, --ntasks=<number>的参数多次运行相同的相同bash脚本。但是,我显然在群集中测试了它,用echo hello运行--ntask=9并且我预计sbatch将向stdout回调你好9次(这是在slurm-job_id.out中收集的,但令我惊讶的是,有一次执行我的echo hello脚本然后这个命令甚至做了什么?它似乎什么也没做,或者至少我看不到假设要做什么。
  3. 我知道多个作业存在-a, --array=<indexes>选项。这是一个不同的主题。我只是想知道--ntasks假设要做什么,理想情况下是一个例子,以便我可以在集群中测试它。

2 个答案:

答案 0 :(得分:13)

&#34; - ntasks&#34; options指定执行命令的实例数。 对于常见的群集设置,如果您使用&#34; srun&#34;这相当于MPI排名的数量。

相比之下,选项&#34; - cpus-per-task&#34;指定每个任务可以使用的CPU数量。

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

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

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

如果您的脚本看起来像

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

srun导致脚本在工作节点上运行命令,因此你应该得到8行问候。

答案 1 :(得分:5)

如果您要在同一批处理脚本中并行运行命令,则--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,否则srun命令不会继承sbatch脚本中设置的环境变量。

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