~~SLIDESHOW yatil~~
====== Slurm, l'ordonnanceur de travaux ======
Cet article est une introduction à //slurm//, l'ordonnanceur de travaux (//jobs//) sur CALI. Vous trouverez les recettes pratiques pour commencer à travailler sur CALI :
* comment soumettre un //job//
* comment voir l'état de vos travaux
===== Avant-propos =====
Sur un cluster de calcul, vous ne travaillez pas comme sur votre PC personnel. Vous ne pouvez pas lancer un programme inter-actif qui utiliserait immédiatement les ressources du cluster.
Pour exécuter un programme, vous devez le soumettre à l’ordonnanceur (//scheduler//). Le logiciel utilisé comme ordonnanceur sur notre cluster est // [[http://slurm.schedmd.com/ | slurm]]//. Il exécutera votre programme (//job//) en différé, quand les ressources (CPU, mémoire) nécessaires à votre travail seront disponibles "quelque part" dans le cluster, sur un des nœuds dédiés aux calculs.
===== Premier exemple pratique =====
==== Fichier batch et soumission ====
Nous créons un fichier texte ''mon_programme.batch'' (n'importe quel nom est admissible) :
#!/bin/bash
#SBATCH --partition=rapide
#SBATCH --ntasks=1
#SBATCH --mem-per-cpu=100
#SBATCH --time=00:30:00
./mon_programme
Ensuite, on indique à slurm que l'on veut lancer ce job :
sbatch mon_programme.batch
Et voilà, votre code ''mon_programme'' sera exécuté dès que le cluster aura des //ressources// disponibles ! Nous allons maintenant détailler le contenu du fichier //batch// et comment slurm travaille..
==== Explications ====
Le fichier texte ''mon_programme.sbatch'' est de type //shell script//.
Mais il possèdes des //commentaires// spéciaux, commençant par ''#SBATCH '', placés en première partie du fichier. Ces directives destinées à slurm indiquent :
* la //partition// voulue (plus de détails ci-après)
* les ressources nécessaires : nombre de processus qui seront lancés, quantité de mémoire, nombre de CPU
* le temps d’exécution maximum prévu
Dans notre exemple :
* ''%%--%%partition=rapide'' sélectionne la //partition// nommée ''rapide''
* ''%%--%%ntasks=1'' donne le nombre de processus qui sera exécuté dans le batch -- En général, on met "1" pour un programme séquentiel ou multi-threadé, une valeur > 1 seulement pour les programmes MPI
* ''%%--%%mem-per-cpu=100'' donne la **quantité de mémoire en Mo** pour chaque CPU. Le job sera tué si la quantité consommée excède la valeur demandée :!:
* ''%%--%%time=00:30:00'' donne la durée maximale du job, au format JOUR-HH:MM:SS . Le job sera tué si la quantité consommée excède la valeur demandée :!:
Dans sa seconde partie, le fichier contient la ou les commandes à exécuter.
La commande ''sbatch'' permet de soumettre le fichier batch, autrement dit de créer un //job// slurm qui sera exécuté dès que les ressources demandées seront disponibles. ''sbatch'' a affiché le //Job ID//, un numéro unique associé au job soumis.
Toutes les directives (''#SBATCH ...'') sont en pratique des //options// de la commande ''sbatch''. Il est simplement plus facile de les inscrire dans le fichier //batch// que de les taper sur la ligne de commande.
===== Où est mon job ? Comment l'arrêter ? =====
Une fois votre //job// soumis, vous pouvez examiner la //queue//, c'est-à-dire la liste des travaux en attente ou en cours d'éxécution.
Pour voir tous les jobs dans la file :
squeue -l
Les //job// ont un //état// associé -- Les 2 principaux sont :
* ''PENDING'' : en attente
* ''RUNNING'' : en cours d'exécution
Vous pouvez stopper un job en cours avec :
scancel
Pour plus d'informations, consultez le contenu de la rubrique dédiée à [[start | slurm ]]
==== Où sont stockés les résultats du job ? ====
Slurm exécute le job depuis le dossier où vous étiez quand vous avez soumis le job.
Par défaut, les sorties standards et d'erreur (qui s'affichent sur le terminal) sont redirigées vers le fichier ''slurm-.out''
==== Dépassement des ressources ====
Si votre job dépasse certaines quantités demandées (mémoire, temps d'exécution), il sera automatiquement tué par slurm.
===== Les partitions slurm =====
Un élément est **primordial** quand vous soumettez un job : la //partition//
* c'est un groupe de nœuds de calcul du cluster, avec une priorité
* des //limites// sont associées à chacune : temps maximal d'exécution, nombre de CPU utilisables (au total ou par utilisateur)
* certaines sont //pré-emptibles// : un job en cours pourra être suspendu s'il faut libérer des ressources pour un autre, plus prioritaire :!:
Vous pourrez par la suite consulter la liste complète des [[partitions| partitions utilisables]], ou la page [[:gpu:utilisation | utilisation des noeuds GPU]]. Nous présentons ci-après les choix les plus usuels.
==== Travaux de très courte durée ====
Utilisez ''partition=rapide''
* pour les travaux très courts (< 1 heure) : mise au point du code, tests
* limites d'usage basses
==== Travaux "normaux" ====
Utilisez ''partition=normal''
* pour les jobs les plus communs (**2 jours maximum**)
==== Points d'attention sur les ressources ====
* Vous **devez** indiquer les ressources mémoire et temps nécessaires, car les valeurs par défaut sont très basses et ne permettraient certainement pas à votre travail de se terminer
* Les quantités demandées en temps, CPU, mémoire doivent être compatible avec la //partition//, sinon ils ne seront pas acceptés lors de la soumission
* Un job consommant plus de mémoire ou de temps que demandé sera tué