SLURM `srun` vs `sbatch` 及其参数
Posted
技术标签:
【中文标题】SLURM `srun` vs `sbatch` 及其参数【英文标题】:SLURM `srun` vs `sbatch` and their parameters 【发布时间】:2017-10-01 17:55:24 【问题描述】:我试图了解 SLURM 的 srun
和 sbatch
命令之间的区别。我会对一般性的解释感到满意,而不是对以下问题的具体答案,但这里有一些具体的混淆点,可以作为起点,让我了解我在寻找什么。
根据documentation,srun
用于提交作业,sbatch
用于提交作业以供以后执行,但我不清楚实际区别,它们的行为似乎是相同的。例如,我有一个有 2 个节点的集群,每个节点有 2 个 CPU。如果我连续执行srun testjob.sh &
5x,它将很好地排队第五个作业,直到 CPU 可用,执行sbatch testjob.sh
也是如此。
为了使问题更具体,我认为一个好的起点可能是:哪些事情我可以用一个做而我不能用另一个做,为什么? p>
这两个命令的许多参数是相同的。似乎最相关的是--ntasks
、--nodes
、--cpus-per-task
、--ntasks-per-node
。 它们之间有何关联,srun
与 sbatch
有何不同?
一个特别的区别是,如果testjob.sh
没有可执行权限,即chmod +x testjob.sh
,srun
将导致错误,而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
默认继承sbatch
或 salloc
在其下运行(来自 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` 及其参数的主要内容,如果未能解决你的问题,请参考以下文章