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

Posted

技术标签:

【中文标题】SLURM `srun` vs `sbatch` 及其参数【英文标题】:SLURM `srun` vs `sbatch` and their parameters 【发布时间】:2017-10-01 17:55:24 【问题描述】:

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

根据documentation,srun 用于提交作业,sbatch 用于提交作业以供以后执行,但我不清楚实际区别,它们的行为似乎是相同的。例如,我有一个有 2 个节点的集群,每个节点有 2 个 CPU。如果我连续执行srun testjob.sh & 5x,它将很好地排队第五个作业,直到 CPU 可用,执行sbatch testjob.sh 也是如此。

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

这两个命令的许多参数是相同的。似乎最相关的是--ntasks--nodes--cpus-per-task--ntasks-per-node它们之间有何关联,srunsbatch 有何不同?

一个特别的区别是,如果testjob.sh 没有可执行权限,即chmod +x testjob.shsrun 将导致错误,而sbatch 会愉快地运行它。 “幕后”发生了什么导致这种情况发生?

文档还提到srun 经常在sbatch 脚本中使用。这就引出了一个问题:它们如何相互交互,它们各自的“规范”用例是什么?具体来说,我会单独使用srun 吗?

【问题讨论】:

【参考方案1】:

文档说

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 arrays。由于srun 可以在sbatch 脚本中使用,所以sbatch 没有什么不能做的。

这些是如何相互关联的,它们对于 srun 和 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。

【讨论】:

感谢您的回答,这比我所希望的要好。一个跟进,因为这是我最初的困惑之一:为什么还要在提交脚本中调用srun?也许我对“工作步骤”的含义感到困惑。例如,如果我有一个名为 runjob.sh 的脚本包含 #!/bin/bash srun myjob.sh,那么调用 (a) sbatch runjob.sh 与 (b) sbatch myjob.sh 与 (c) srun myjob.sh 与 (d) @ 之间是否存在实际区别987654364@? (显然最后一个很傻,但我很好奇)。 也许您可以浏览我最近提供的培训课程的幻灯片,了解如何在提交脚本中使用 srun:cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf 看起来幻灯片中的所有示例(以及 CECI 页面上的教程)都在 sbatch 提交脚本中使用了 srun。但是,我发现提交脚本中没有srun 的命令将以相同的方式运行。我上面提到的四种调用实际上有区别吗? 只有在 (1) 分配给一个 CPU 并且 (2) 程序是纯顺序的时,所有示例都将以相同的方式运行。要查看差异,请请求多个任务。另一个区别是,如果你在 sbatch 中不使用 srun,sstat 命令将不会返回任何有用的信息 @Atcold 这个版本可能会更新:github.com/damienfrancois/slurm-helper/blob/master/slurm.vim【参考方案2】:

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


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

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

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

有一个相对较新的网页,其中详细介绍了 -B 和 --exclusive 选项。

doc/html/cpu_management.shtml


来自SLURM FAQ 页面的其他信息。

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

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


另一个相关对话here

【讨论】:

以上是关于SLURM `srun` vs `sbatch` 及其参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 SLURM 上的所有 CPU

如何使用 SLURM 提交并行作业步骤?

如何在节点上平均分配 slurm 任务?

超算平台 SLURM 作业调度系统使用

Slurm 作业不能为多个节点请求 GPU 资源

SLURM sbatch 是不是会自动跨节点复制用户脚本?