J'essaie de comprendre quelle est la différence entre les commandes srun
et sbatch
de SLURM. Je serai heureux avec une explication générale, plutôt que des réponses spécifiques aux questions suivantes, mais voici quelques points de confusion spécifiques qui peuvent être un point de départ et donner une idée de ce que je recherche.
Selon documentation , srun
est destiné à la soumission de travaux et sbatch
est destiné à la soumission de travaux en vue d'une exécution ultérieure, mais la différence pratique ne m'est pas claire et leur comportement semble être le même. Par exemple, j'ai un cluster avec 2 nœuds, chacun avec 2 processeurs. Si j'exécute srun testjob.sh &
5 fois de suite, le cinquième travail sera mis en file d'attente jusqu'à ce qu'un processeur soit disponible, de même que l'exécution de sbatch testjob.sh
.
Pour rendre la question plus concrète, je pense qu’un bon point de départ pourrait être: Quelles sont les choses que je peux faire avec l’une que je ne peux pas faire avec l’autre et pourquoi?
La plupart des arguments des deux commandes sont les mêmes. Ceux qui semblent les plus pertinents sont --ntasks
, --nodes
, --cpus-per-task
, --ntasks-per-node
. Comment sont-ils liés les uns aux autres et en quoi diffèrent-ils pour srun
vs sbatch
?
Une différence particulière est que srun
provoquera une erreur si testjob.sh
n’a pas l’autorisation exécutable, c’est-à-dire que chmod +x testjob.sh
alors que sbatch
le fera fonctionner avec plaisir. Que se passe-t-il "sous le capot" pour que cela soit le cas?
La documentation mentionne également que srun
est couramment utilisé dans les scripts sbatch
. Cela conduit à la question suivante: Comment interagissent-ils les uns avec les autres et quelle est la casecade "canonique" pour chacun d'eux? Plus précisément, utiliserais-je srun
seul?
La documentation dit
srun is used to submit a job for execution in real time
tandis que
sbatch is used to submit a job script for later execution.
Tous deux acceptent pratiquement le même jeu de paramètres. La principale différence est que srun
est interactif et bloquant (vous obtenez le résultat dans votre terminal et vous ne pouvez pas écrire d'autres commandes tant qu'il n'est pas terminé), alors que sbatch
est un traitement par lots non bloquant ( les résultats sont écrits dans un fichier et vous pouvez soumettre d’autres commandes immédiatement).
Si vous utilisez srun
en arrière-plan avec le &
, vous supprimez alors la fonctionnalité 'blocage' de srun
, qui devient interactive mais non bloquante. Il reste néanmoins interactif, ce qui signifie que la sortie encombrera votre terminal et que les processus srun
sont liés à votre terminal. Si vous vous déconnectez, vous perdrez le contrôle sur eux ou ils pourraient être tués (selon qu'ils utilisent stdout
ou non). Et ils seront tués si la machine à laquelle vous vous connectez pour soumettre des travaux est redémarrée.
Si vous utilisez sbatch
, vous soumettez votre travail, qui est géré par Slurm; vous pouvez vous déconnecter, tuer votre terminal, etc. sans conséquence. Votre travail n'est plus lié à un processus en cours d'exécution.
Quelles sont les choses que je peux faire avec l'une que je ne peux pas faire avec l'autre et pourquoi?
Une fonctionnalité disponible pour sbatch
et non pour srun
est job arrrays . Comme srun
peut être utilisé dans un script sbatch
, vous ne pouvez rien faire avec sbatch
.
Comment sont-ils liés les uns aux autres, et en quoi diffèrent-ils srun vs sbatch?
Tous les paramètres --ntasks
, --nodes
, --cpus-per-task
, --ntasks-per-node
ont la même signification dans les deux commandes. Cela est vrai pour presque tous les paramètres, à l'exception notable de --exclusive
.
Qu'est-ce qui se passe "sous le capot" qui fait que cela soit le cas?
srun
exécute immédiatement le script sur l'hôte distant, tandis que sbatch
copie le script dans un stockage interne, puis le télécharge sur le nœud de calcul au démarrage du travail. Vous pouvez le vérifier en modifiant votre script de soumission après sa soumission; les modifications ne seront pas prises en compte (voir this ).
Comment interagissent-ils les uns avec les autres, et quel est le cas d'utilisation "canonique" pour chacun d'eux?
Vous utilisez généralement sbatch
pour soumettre un travail et srun
dans le script de soumission pour créer des étapes de travail à l’appel de Slurm. srun
est utilisé pour lancer les processus. Si votre programme est un programme parallèle MPI, srun
se charge de créer tous les processus MPI. Sinon, srun
exécutera votre programme autant de fois que spécifié par le --ntasks
option. Il existe de nombreux cas d'utilisation selon que votre programme est mis en parallèle ou non, qu'il dure longtemps ou non, qu'il soit composé d'un seul exécutable ou non, etc. Sauf indication contraire, srun
hérite par défaut des options pertinentes de sbatch
ou salloc
sous lequel il est exécuté (depuis ici ).
Plus précisément, utiliserais-je srun seul?
Autre que pour les petits tests, non. Une utilisation courante est srun --pty bash
pour obtenir un shell sur un travail de calcul.
En fait, cela ne répond pas complètement à la question, mais voici quelques informations supplémentaires qui pourraient être utiles à quelqu'un à l'avenir:
D'un fil lié j'ai trouvé avec une question semblable:
En un mot, sbatch et salloc allouent des ressources au travail, tandis que srun lance des tâches parallèles sur ces ressources. Lorsqu'il est appelé dans une attribution de travail, srun lance des tâches parallèles sur tout ou partie des ressources allouées. Dans ce cas, srun hérite par défaut des options pertinentes du sbatch ou du salloc sous lequel il s'exécute. Vous pouvez ensuite (généralement) fournir différentes options qui remplaceront ce qu’elle reçoit par défaut. Chaque appel de srun dans un travail est appelé une étape de travail.
srun peut également être appelé en dehors d'une attribution de travail. Dans ce cas, srun demande des ressources et, lorsque ces ressources sont allouées, lance les tâches sur ces ressources en un seul travail et en une seule étape.
Il existe une page Web relativement nouvelle qui donne plus de détails sur les options -B et - exclusive.
doc/html/cpu_management.shtml
Informations supplémentaires sur la page SLURM FAQ .
La commande srun a deux modes de fonctionnement différents. Premièrement, s’il n’est pas exécuté dans un travail existant (c’est-à-dire pas dans une attribution de travail Slurm créée par salloc ou sbatch), il créera une attribution de travail et engendrera une application. Si elle est exécutée dans une allocation existante, la commande srun génère uniquement l'application. Pour cette question, nous ne traiterons que du premier mode de fonctionnement et comparerons la création d'une attribution de travail à l'aide des commandes sbatch et srun.
La commande srun est conçue pour une utilisation interactive, avec une personne surveillant la sortie. La sortie de l'application est vue comme une sortie de la commande srun, généralement au niveau du terminal de l'utilisateur. La commande sbatch est conçue pour soumettre un script pour une exécution ultérieure et sa sortie est écrite dans un fichier. Les options de commande utilisées dans l’attribution de travail sont presque identiques. La différence la plus notable en termes d'options est que la commande sbatch prend en charge le concept de tableaux de travaux, contrairement à srun. Une autre différence significative concerne la tolérance aux pannes. Les échecs impliquant des travaux sbatch entraînent généralement la remise en file d'attente et l'exécution du travail, tandis que les échecs impliquant srun entraînent généralement la génération d'un message d'erreur avec l'espoir que l'utilisateur répondra de manière appropriée.