130

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

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

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

这两个命令的许多参数是相同的。看起来最相关的是--ntasks, --nodes, --cpus-per-task, --ntasks-per-node这些是如何相互关联的,它们对于srunvs有何不同sbatch

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

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

4

2 回答 2

155

文件说

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的背景中使用,那么您将删除 的“阻塞”功能,该功能变为交互式但非阻塞。虽然它仍然是交互式的,这意味着输出会使您的终端混乱,并且进程链接到您的终端。如果断开连接,您将失去对它们的控制,或者它们可能会被杀死(取决于它们是否 基本使用)。如果您连接以提交作业的机器重新启动,它们将被杀死。&srunsrunstdout

如果你使用sbatch,你提交你的工作,它由 Slurm 处理;您可以断开连接,终止您的终端等,而不会产生任何后果。您的作业不再链接到正在运行的进程。

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

一个可用于sbatch和不可用于的功能srun作业数组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在(从这里)运行。

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

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

于 2017-05-05T07:56:23.840 回答
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 的失败通常会导致生成错误消息,期望用户将以适当的方式响应。


这里的另一个相关对话

于 2017-05-05T16:39:37.890 回答