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


100

我试图了解SLURMsrunsbatch命令之间的区别。我将对一般性的解释感到满意,而不是对以下问题的具体答案感到满意,但是这里有一些具体的混淆点,可以作为起点并给出我所寻找的想法。

根据文档srun用于提交作业,并且sbatch用于提交作业以供以后执行,但是实际区别对我来说尚不清楚,并且它们的行为似乎相同。例如,我有一个包含2个节点的群集,每个节点具有2个CPU。如果我srun testjob.sh &连续执行5次,它将很好地将第五个作业排队,直到CPU可用为止sbatch testjob.sh

为了使问题更具体,我认为一个不错的起点是:我可以对某项做些什么而对另一项做不到,为什么?

这两个命令的许多参数都是相同的。似乎最相关的那些是--ntasks--nodes--cpus-per-task--ntasks-per-node它们之间如何相互关联,以及它们与srunvssbatch有何不同?

一个特别不同的是,srun如果将导致错误testjob.sh没有执行权限,即chmod +x testjob.shsbatch会开心地运行它。导致这种情况的“幕后”发生了什么?

该文档还提到srunsbatch脚本内部常用的内容。这就引出了一个问题:它们之间如何相互作用,以及它们之间的“规范”用例是什么?具体来说,我会独自使用srun吗?

Answers:


116

该文件说

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工作arrrays。正如srun可以在sbatch脚本中使用的一样,您无法做任何事情sbatch

它们之间如何相互关联,并且它们在srun和sbatch之间有何不同?

所有参数--ntasks--nodes--cpus-per-task--ntasks-per-node在这两个命令的含义相同。几乎所有参数都适用,值得注意的例外--exclusive

导致这种情况的“幕后”发生了什么?

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

它们之间如何交互,并且每个“规范”用例是什么?

通常sbatch,您通常使用srunSlurm调用的方式提交作业,并在提交脚本中创建作业步骤。srun用于启动流程。如果您的程序是并行MPI程序,srun则负责创建所有MPI进程。如果没有,srun将按--ntasks选项指定的次数运行程序。有很多用例,取决于您的程序是否并行,运行时间是否长,是否由单个可执行文件组成,等等。除非另有说明,否则srun默认情况下继承该程序sbatchsalloc运行程序的相关选项在(从这里)下。

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

除了小测试,没有。通常的用法是srun --pty bash在计算作业上使用外壳。


6
谢谢您的回答,这比我所希望的要好。一项后续工作,因为这是我最初的困惑点之一:为什么要打扰srun提交脚本内部?也许我对“工作步骤”的含义感到困惑。例如,如果我有一个名为runjob.shcontains的脚本#!/bin/bash srun myjob.sh,那么调用(a)sbatch runjob.shvs(b)sbatch myjob.shvs(c)srun myjob.shvs(d)之间有实际区别srun runjob.sh吗?(很明显,最后一个很傻,但是我很好奇)。
dvv

3
也许您可以浏览我最近提供的培训课程的幻灯片,以了解有关如何在提交脚本中使用srun的想法:cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois

5
看起来幻灯片中的所有示例(以及CECI页面上的教程)srun都在sbatch提交脚本中使用。但是,我发现srun提交脚本中没有的命令将以相同的方式运行。我上面提到的四个调用之间实际上有区别吗?
dvv

9
仅当(1)分配用于一个CPU和(2)程序是纯粹顺序的时,所有示例才以相同的方式运行。要查看差异,请完成一项以上的任务。另一个区别是,如果您不在sbatch中使用srun,则sstat命令将不会返回任何有用的信息
damienfrancois


5

这实际上并不能完全回答问题,但是我发现了一些更多信息,这些信息将来可能会对某人有所帮助:


在一个相关的线程中,我发现了一个类似的问题:

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

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

有一个相对较新的网页,其中提供有关-B和--exclusive选项的更多详细信息。

doc / html / cpu_management.shtml


SLURM常见问题页面上的其他信息。

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

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


另一个相关的谈话在这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.