Estou tentando entender qual é a diferença entre SLURM srun
e sbatch
comandos. Ficarei feliz com uma explicação geral, ao invés de respostas específicas para as seguintes perguntas, mas aqui estão alguns pontos específicos de confusão que podem ser um ponto de partida e dar uma ideia do que estou procurando.
De acordo com a documentação , srun
é para enviar trabalhos, e sbatch
é para enviar trabalhos para execução posterior, mas a diferença prática não é clara para mim, e o comportamento deles parece ser o mesmo. Por exemplo, tenho um cluster com 2 nós, cada um com 2 CPUs. Se eu executar srun testjob.sh &
5x seguidas, ele enfileira perfeitamente o quinto trabalho até que uma CPU fique disponível, assim como a execução sbatch testjob.sh
.
Para tornar a pergunta mais concreta, acho que um bom lugar para começar pode ser: Quais são algumas coisas que posso fazer com um e não posso fazer com o outro, e por quê?
Muitos dos argumentos para ambos os comandos são os mesmos. Os que parecem as mais relevantes são --ntasks
, --nodes
, --cpus-per-task
, --ntasks-per-node
. Como eles estão relacionados entre si e como eles diferem em relação a srun
vs sbatch
?
Uma diferença em particular é que srun
causará um erro se testjob.sh
não tiver permissão de executável, ou seja, chmod +x testjob.sh
quando sbatch
o executará sem problemas. O que está acontecendo "por baixo do capô" que faz com que isso seja o caso?
A documentação também menciona que srun
é comumente usado dentro de sbatch
scripts. Isso leva à questão: como eles interagem entre si e qual é o caso de uso "canônico" para cada um deles? Especificamente, eu usaria srun
sozinho?
srun
dentro do script de envio? Talvez eu esteja confuso sobre o significado de "etapa do trabalho". Por exemplo, se eu tiver um script chamadorunjob.sh
que contém#!/bin/bash srun myjob.sh
, há uma diferença prática entre chamar (a)sbatch runjob.sh
vs (b)sbatch myjob.sh
vs (c)srun myjob.sh
vs (d)srun runjob.sh
? (Claramente o último é bobo, mas estou curioso).