SLURM`srun` vs`sbatch`及其参数

时间:2017-05-03 18:49:40

标签: parallel-processing scheduler jobs slurm sbatch

我想了解SLURM的srunsbatch命令之间的区别。我会对一般性解释感到满意,而不是对以下问题的具体答案,但这里有一些特定的混淆点,可以作为一个起点,并让我知道我在寻找什么。

根据documentationsrun用于提交作业,而sbatch用于提交作业供以后执行,但实际差异对我来说不明确,他们的行为似乎是是相同的。例如,我有一个包含2个节点的集群,每个节点有2个CPU。如果我连续执行srun testjob.sh & 5x,它将很好地排队第五个作业,直到CPU变为可用,就像执行sbatch testjob.sh一样。

为了使问题更具体,我认为一个好的起点可能是:我可以用另一个我不能做的事情做什么,为什么?

两个命令的许多参数都是相同的。看起来最相关的是--ntasks--nodes--cpus-per-task--ntasks-per-node这些内容如何相互关联,srunsbatch的区别如何?

一个特别的区别是srun如果testjob.sh没有可执行权限即chmod +x testjob.sh会导致错误,而sbatch会愉快地运行它。 发生了什么"引擎盖下#34;导致情况如此?

文档还提到srun脚本中常用sbatch。这导致了一个问题:他们如何互相交流,什么是"规范"每个人使用它们?具体来说,我会单独使用srun吗?

2 个答案:

答案 0 :(得分:58)

文档说

srun is used to submit a job for execution in real time

sbatch is used to submit a job script for later execution.

他们都接受几乎相同的参数集。主要区别在于srun是交互式和阻塞的(您在终端中获得结果,在完成之前无法编写其他命令),而sbatch是批处理和非阻塞(结果是写入文件,你可以立即提交其他命令。

如果您在后台使用带有srun标志的&,则会删除srun的“屏蔽”功能,该功能会变为互动但无阻塞。它仍然是交互式的,这意味着输出会使您的终端混乱,srun进程会链接到您的终端。如果断开连接,您将失去对它们的控制权,否则它们可能会被杀死(取决于它们是否使用stdout或基本不使用)。如果重新启动连接到提交作业的计算机,它们将被终止。

如果您使用sbatch,则提交作业并由Slurm处理;你可以断开连接,杀死你的终端等,没有任何后果。您的工作不再与正在运行的流程相关联。

  

我可以用一个我不能用另一个做的事情做什么,为什么?

sbatch而不是srun可用的功能是job arrrays。由于srun可以在sbatch脚本中使用,因此sbatch无法做任何事情。

  

这些是如何相互关联的,它们与srun vs sbatch有何不同?

所有参数--ntasks--nodes--cpus-per-task--ntasks-per-node在两个命令中具有相同的含义。对于几乎所有参数都是如此,除了--exclusive

之外
  

导致情况发生的“引擎盖下”发生了什么?

srun立即执行远程主机上的脚本,而sbatch将脚本复制到内部存储中,然后在作业启动时将其上载到计算节点上。您可以在提交后修改提交脚本来检查;不会考虑更改(请参阅this)。

  

他们如何互相交流,每个人的“规范”用例是什么?

您通常使用sbatch在提交脚本中提交作业和srun,以便在Slurm调用它们时创建作业步骤。 srun用于启动进程。如果您的程序是并行MPI程序,srun负责创建所有MPI进程。如果没有,srun将按--ntasks选项指定的次数运行您的程序。有许多用例取决于您的程序是否并行,运行时间是否长,是否由单个可执行文件组成等。除非另有说明,否则srun默认继承相关选项它所运行的sbatchsalloc(来自here)。

  

具体来说,我会单独使用srun吗?

除了小型测试,没有。常见的用途是srun --pty bash来获取计算作业上的shell。

答案 1 :(得分:4)

这实际上并没有完全回答这个问题,但是我发现这些信息可能对将来的某些人有所帮助:

来自related thread I found的类似问题:

  

简而言之,sbatch和salloc为作业分配资源,而srun则在这些资源上启动并行任务。在作业分配中调用时,srun将在部分或全部已分配资源上启动并行任务。在这种情况下,srun默认继承它运行的sbatch或salloc的相关选项。然后,您可以(通常)提供srun不同的选项,这些选项将覆盖默认情况下接收的内容。在作业中每次调用srun都称为作业步骤。

     

srun也可以在作业分配之外调用。在这种情况下,srun会请求资源,并且在授予这些资源时,将这些资源中的任务作为单个作业和作业步骤启动。

     

有一个相对较新的网页,它详细介绍了-B和 - 独家选项。

     

DOC / HTML / cpu_management.shtml

SLURM FAQ页面中的其他信息。

  

srun命令有两种不同的操作模式。首先,如果不在现有作业中运行(即不在salloc或sbatch创建的Slurm作业分配中),则它将创建作业分配并生成应用程序。如果在现有分配中运行,则srun命令仅生成应用程序。对于这个问题,我们只讨论第一种操作模式,并比较使用sbatch和srun命令创建作业分配。

     

srun命令专为交互式使用而设计,有人监视输出。应用程序的输出被视为srun命令的输出,通常在用户的终端。 sbatch命令用于提交脚本以供以后执行,其输出将写入文件。作业分配中使用的命令选项几乎相同。选项中最明显的区别是sbatch命令支持作业数组的概念,而srun则不支持。另一个显着差异在于容错性。涉及sbatch作业的失败通常会导致作业被重新排队并再次执行,而涉及srun的失败通常会导致生成错误消息,期望用户以适当的方式响应。