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

dkv*_*dkv 65 parallel-processing jobs scheduler slurm sbatch

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

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

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

两个命令的许多参数都是相同的.似乎最相关的那些是--ntasks,--nodes,--cpus-per-task,--ntasks-per-node.这些是如何相互关联的,它们对于srunvs有sbatch什么不同?

一个特别不同的是,srun将导致一个错误,如果testjob.sh没有执行权限,即chmod +x testjob.shsbatch会开心地运行它."引擎盖下"发生了什么导致情况如此?

该文档还提到srunsbatch脚本中常用的文档.这导致了一个问题:它们如何相互作用,以及它们之间的"规范"用例是什么?具体来说,我会独自使用srun吗?

dam*_*ois 69

文件说

srun is used to submit a job for execution in real time
Run Code Online (Sandbox Code Playgroud)

sbatch is used to submit a job script for later execution.
Run Code Online (Sandbox Code Playgroud)

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

如果您srun在后台使用&符号,则会删除"阻止"功能srun,该功能会变为交互式但非阻塞功能.它仍然是交互式的,这意味着输出将使您的终端混乱,并且srun进程将链接到您的终端.如果断开连接,您将失去对它们的控制权,否则它们可能会被杀死(取决于它们是否使用它们 stdout).如果重新启动连接到提交作业的计算机,它们将被终止.

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

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

可用sbatch和不可用的功能srun作业arrrays.由于srun可以在内部使用sbatch的脚本,没有什么是你不能做sbatch.

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

所有参数--ntasks,--nodes,--cpus-per-task,--ntasks-per-node在这两个命令的含义相同.对于几乎所有参数都是如此,除了明显的例外--exclusive.

"引擎盖下"发生了什么导致情况如此?

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

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

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

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

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

  • 看起来幻灯片中的所有示例(以及 CECI 页面上的教程)都在 `sbatch` 提交脚本中使用了 `srun`。但是,我发现提交脚本中没有 `srun` 的命令将以相同的方式运行。我上面提到的四个调用之间实际上有区别吗? (7认同)
  • 只有当(1)分配用于一个CPU并且(2)程序是纯顺序时,所有示例才会以相同的方式运行.要查看差异,请求多个任务.另一个区别是,如果你不在sbatch中使用srun,sstat命令将不会返回任何有用的信息 (6认同)
  • 谢谢你的回答,这比我希望的更好.一个跟进,因为这是我最初的混淆点之一:为什么懒得在提交脚本中调用`srun`?也许我对"工作步骤"的含义感到困惑.例如,如果我有一个名为`runjob.sh`的脚本包含`#!/ bin/bash srun myjob.sh`,那么调用(a)`sbatch runjob.sh` vs(b)之间是否有实际区别? sbatch myjob.sh` vs(c)`srun myjob.sh` vs(d)`srun runjob.sh`?(显然最后一个是愚蠢的,但我很好奇). (4认同)
  • 也许您可以浏览我最近提供的培训课程的幻灯片,以了解有关如何在提交脚本中使用srun的想法:http://www.cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf (2认同)

dkv*_*dkv 7

这实际上并没有完全回答这个问题,但这里有一些我发现的更多信息,可能对未来的人有帮助:


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

简而言之,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 的失败通常会导致生成错误消息,并期望用户以适当的方式响应。


另一个相关的对话在这里