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

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

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

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

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

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

最佳答案

该文件说

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处理;您可以断开连接,杀死终端等,而不必担心。您的工作不再链接到正在运行的进程。



job arrrayssbatch而不是srun可用的功能。由于srun可以在sbatch脚本中使用,因此sbatch不能做任何事。



这两个命令中的所有参数--ntasks--nodes--cpus-per-task--ntasks-per-node都具有相同的含义。几乎所有参数都是如此,但--exclusive除外。


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



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



除了小测试,没有。通常使用srun --pty bash在计算作业上获取 shell 。

10-06 14:47