Skip to main content

Soumettre ses travaux avec slurm

info

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

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 Mo
  • SBATCH --mem=2000M : 2000 Mo
  • SBATCH --mem=2G : 2 Go
  • SBATCH --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%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.