我试图了解SLURM的 srun
和 sbatch
命令之间的区别。我将对一般性的解释感到满意,而不是对以下问题的具体答案满意,但这里有一些特定的混淆点,可以作为起点并给出我所寻找的想法。
根据documentation,srun
用于提交作业,sbatch
用于提交作业以供以后执行,但是我不清楚实际的区别,并且它们的行为似乎是相同的。例如,我有一个包含2个节点的群集,每个节点具有2个CPU。如果我连续执行srun testjob.sh &
5x,它将像执行sbatch testjob.sh
一样很好地排队第五个作业,直到CPU可用。
为了使问题更具体,我认为一个不错的起点是:我可以对某项做些什么而对另一项做不到,为什么?
这两个命令的许多参数都是相同的。似乎最相关的是--ntasks
,--nodes
,--cpus-per-task
和--ntasks-per-node
。 它们之间如何相互关联,以及srun
和sbatch
有何区别?
一个特殊的区别是,如果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 arrrays是
sbatch
而不是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
默认继承sbatch
或salloc
的相关选项它在下运行(来自here)。除了小测试,没有。通常使用
srun --pty bash
在计算作业上获取 shell 。