web-dev-qa-db-fra.com

SLURM `srun` vs` sbatch` et leurs paramètres

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?

57
dkv

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.

64
damienfrancois

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.

4
dkv