Soumettre ses travaux avec slurm
Les exemples donnés ici doivent éventuellement être adaptés au spécificités de chaque machine, par exemple en spécifiant l'option --partition
etc.
Soumission de scripts avec sbatch
La soumission d'un job se fait avec la commande
sbatch job.slurm
où job.slurm
est un script de soumission slurm.
Il s'agit d'un script bash qui contient des instructions pour le gestionnaire de travaux ainsi que pour le lancement de votre programme.
Les instructions pour slurm (c'est-à-dire les options de la commande sbatch
) sont typiquement inclus dans l'en-tête du script, précédé de #SBATCH
.
Par exemple, le script de soumission suivant
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --time=00:10:00
hostname
sleep 60
décrit un job qui exécutera la commande hostname
suivi de la commande sleep 60
.
Ce job single node (--nodes=1
) consiste en une seule tâche (--ntasks-per-node=1
) mono-cœur (--cpus-per-task=1
) avec un temps d'exécution d'au plus 10 minutes.
La commande sbatch job.slurm
rajoute le job à la file d'attente et retourne un numéro de job (SLURM_JOB_ID), qui permet notamment de suivre l'état du job.
En fonction des ressources demandées et l'état du cluster, slurm lance le job et redirige la sortie standard (ici le nom du nœud alloué) vers un fichier slurm-%j.out
(où %j
est le SLURM_JOB_ID) localisé dans le dossier de lancement. Le job se termine soit quand la fin du script est atteint, soit quand le temps maximal (ici 10 minutes) est atteint.
Les arguments de sbatch peuvent également être passés directement en ligne de commande. Par exemple,
sbatch --output=out.txt job.slurm
soumet le script précédent mais rajoute l'option --output
pour utiliser un fichier out.txt
à la place de slurm-%j.out
.
La documentation complète de sbatch
est disponible ici ou en consultant man sbatch
.
Nous nous limitons ici aux options les plus importantes.
--time
, -t
Exemples:
#SBATCH --time 4:00:00
pour demander 4 heures de temps.#SBATCH --time 2-12
pour 2 jours et demi#SBATCH --time 30
pour 30 minutes#SBATCH --time 30:00
pour 30 minutes aussi
La valeur par défaut et le maximum autorisé varient selon la configuration de chaque machine et dépendent souvent de la partition ou le job est soumis.
Attention: si le temps demandé dépasse la limite autorisée, alors le job restera en attente indéfiniment.
--partition
, -p
La partition où les ressources seront alloués. Éventuellement une partition défaut a été configurée sur votre machine.
#SBATCH --partition compute
demande une allocation sur la partition 'compute'.#SBATCH --partition shared,small
demande une allocation sur la partition 'shared' ou 'small', là où le job pourra démarrer en premier.
--nodes
, -N
Le nombre de nœuds demandés.
#SBATCH --nodes 4
(ou#SBATCH -N 4
) signifie qu'au moins 4 nœuds seront alloués au job - mais d'autres option peuvent augmenter ce nombre.#SBATCH --nodes 2-4
signifie qu'au moins 2 et au plus 4 nœuds seront alloués au job.
--ntasks
, -n
Indique que le job comporte --ntasks
tâches, slurm déterminera alors les ressources à demander. La notion de task dans slurm est assez proche d'un process MPI.
- sur un cluster équipé de nœuds 80-cœurs l'option
#SBATCH -n 160
demandera 2 nœuds et 160 CPUs.
--ntasks-per-node
A utiliser avec l'option --nodes
.
--cpus-per-task
Souvent utilisé pour des jobs hybrides MPI/OpenMP. Par exemple
#SBATCH --nodes 2
#SBATCH --ntasks-per-node 2
#SBATCH --cpus-per-task 16
demande 2 nœuds et 32 cœurs par nœud (pour 2 tâches par nœud utilisant 16 CPUs par tâche).
--mem
La mémoire par nœud nécessaire. Exemples:
SBATCH --mem=2000
: 2000 MoSBATCH --mem=2000M
: 2000 MoSBATCH --mem=2G
: 2 GoSBATCH --mem=1T
: 1 To
--reservation
#SBATCH --reservation=toto
alloue des ressources dans la reservation 'toto' si elle existe.
Typiquement les admins d'une machine peuvent créer des reservations en avance pour des travaux pratiques.
--gpus
, -G
L'option --gpus=3
demande l'allocation de 3 GPUs. Si différents types de GPUs sont disponible, il est possible de spécifier le type: par exemple, --gpus=ampere:5
demande l'allocation de 5 GPUs de type ampere.
Voir aussi --gpus-per-node
et et --gres
.
--gpus-per-node
Comme --gpus
, mais par nœud.
--gres
gres signifie consumable generic resources. Les gres disponibles varient selon la configuration des machines.
Le plus souvent gres
est utilisé pour réserver des GPUs :
#SBATCH --gres=gpu:2
demande une réservation de 2 GPUs par nœud.
Comme dans --gpus
et --gpus-per-node
il est possible de spécifier le type de GPU.
La commande sbatch --gres=help
permet de lister les gres disponibles.
--job-name
, -J
SBATCH --job-name=toto
fera apparaitre le nom 'toto' dans les requêtes slurm. Par defaut, le nom du job sera celui du script de soumission.
--mail-user
Activer des notifications par mail pour des événements specifié par --mail-type
.
--output
, -o
et --error
,-e
permettent de spécifier le nom des fichiers sortie. Par défaut, les deux (output et error) sont redirigés vers un seul fichier slurm-%j.out
où %j
est remplacé par le numéro de job.
Il est possible de créer des fichiers de sortie par nœud ou par tâche.
La documentation de slurm fournit plus de détails sur la création de fichiers de sortie.