Utilisation du gestionnaire de ressources Slurm

Slurm est un gestionnaire de ressources physiques pour machines multi-utilisateurs, séquentielles et parallèles. Il assure l’ordonnancement et la planification des travaux.

La soumission des jobs à Slurm se fait soit en mode interactif soit en mode batch. Lors de la soumission, Slurm indique le numéro d’identification du job qui permettra de le suivre et d’interagir avec lui.

En mode interactif, vous devrez vous connecter en ssh au premier noeud que Slurm vous aura réservé. En mode batch, il faut spécifier un script lors de la soumission qui sera exécuté sur le(s) noeud(s) réservé(s).

Les options Slurm permettent dans ces deux modes de définir des paramètres tels que : la partition, la durée du job, le nombre de nœuds, de cœurs, la quantité de mémoire, le nom du job, les noms des fichiers de sortie, etc…

La documentation complète de SLURM est ici.

Les partitions disponibles au mésocentre :

Les ressources matérielles sont regroupées en partitions. Chaque partition agrégeant des machines ayant des caractéristiques communes, une même ressource pouvant appartenir à plusieurs partition.

Nom de la PartitionNom des nœudsType de machineNom du scratch
skylake skylake[001-158]PowerEdge C6420/scratch, /scratchfast
westmerewestmere[001-096]PowerEdge C6100/scratchw
devdev[01-02]PowerEdge C6420/scratch, /scratchfast
smp-opa  smp005PowerEdge R940/scratch, /scratchfast
smpsmp[002-004]Dell R720/scratchw
phi phi001SuperMicro 7047GR/scratchw
kepler      gpu[004-010]PowerEdge C4130/scratch, /scratchfast
pascal      gpu[011-012]PowerEdge C4130/scratch, /scratchfast
voltagpu[013-017]PowerEdge C4140/scratch, /scratchfast
visuvisu001PowerEdge R740/scratch, /scratchfast

Les principales variables Slurm :

Slurm utilise des variables d’environnement ($SLURM_xxxx) qui peuvent être utilisées lors de l’exécution des jobs. Les principales sont :

  • $SLURM_JOB_ID : numéro du job.
  • $SLURM_JOB_USER : utilisateur.
  • $SLURM_SUBMIT_DIR : répertoire initial de soumission.
  • $SLURM_NODELIST : fichier contenant les nœuds attribués. à utiliser par exemple pour se connecter au premier noeud alloué durant l’exécution d’un job interactif.
  • $SLURM_JOB_NAME : nom du job.
  • $SLURM_ARRAY_TASK_ID :

La liste complète des variables est accessible à la page https://slurm.schedmd.com/sbatch.html#lbAG”.

Les commandes Slurm de base :

  • sinfo : Affiche la liste des paritions.
  • srun -p NOM_DE_LA_PARTITION -A PROJET --time=2:30:0 -N 2 -n 4 --pty bash -i : soumission d’un job en interactif. Si les options --time, -N et --ntasks-per-node ne sont pas utilisées, un seul coeur sera réservé pour 30mn. Vous serez connecté en ssh au noeud alloué. Taper exit pour revenir au shell de soumission.
  • sbatch ./mon_script.slurm : soumission d’un job à partir d’un script slurm. Le script permet de définir l’environnement de travail et de manipuler les variables Slurm.
  • squeue -u NOM_DU_USER : affichage de la liste des jobs en cours. Cette commande permet en particulier de connaitre la valeur des JOB_ID de vos jobs en cours.
  • smap : affichage graphique de la liste des jobs en cours d’exécution.
  • scontrol show job JOB_ID : affichage d’informations détaillées sur le job en cours JOB_ID.
  • sacct --format=jobid,jobname,elapsed,ncpus,ntasks,start,end,state : affichage de l’historique de vos jobs. (Pour plus d’informations sur la commande sacct et son format d’affichage, vous pouvez consulter la page https://slurm.schedmd.com/sacct.html.
  • scancel JOB_ID : arrêt du job JOB_ID en cours d’exécution.
  • sacctmgr list association where users=NOM_DU_USER format=account,user,qos : permet de connaître les projets auquel l’utilisateur NOM_DU_USER participe.
  • sacctmgr show user NOM_DU_USER user,defaultaccount : permet de connaître le projet par défaut de l’utilisateur NOM_DU_USER. C’est ce projet qui sera utilisé si #SBATCH -A NOM_PROJET n’est pas précisé. Le projet par défaut peut être modifié sur simple demande auprès de l’équipe technique.

Les principales directives Slurm :

Les directives suivantes peuvent être utilisées dans les scripts de lancement et en option de la commande srun.

  • #SBATCH -J # donne un nom au job.
  • #SBATCH -p NOM_DE_LA_PARTITION  # NOM_DE_LA_PARTITION pouvant être skylake pour utiliser les noeuds fins, kepler pour les gpu…
  • #SBATCH -N N # réserve N noeuds.
  • #SBATCH -n N # réverve N coeurs par noeud
  • #SBATCH -t JJ-HH:MM:SS # définit le walltime. Le walltime maximum est de 7 jours. Si rien n’est précisé, le walltime par défaut de 30 minutes sera utilisé. Le format doit être sous la forme “minutes”, “minutes:secondes”, “heures:minutes:secondes”, “jours-heures”, “jours-heures:minutes” ou “jour-heures:minutes:secondes”
  • #SBATCH -A NOM_PROJET# NOM_PROJET est le projet sur lequel les heures cpu seront décomptées. Pour l’utilisation des machines westmere, les heures n’étant pas décomptées, il faut indiquer comme nom de projet westmere.
  • #SBATCH -o FICHIER_D_OUTPUT# indique le nom du fichier d’output. Par exemple %j.out
  • #SBATCH -e FICHIER_D_ERREUR# indique le nom du fichier d’erreur. Par exemple %j.err
  • #SBATCH --mail-type=BEGIN,END # définit à quelles étapes Slurm enverra un message.
  • #SBATCH --mail-user=adresse@mail&nbsp # définit à quelles étapes Slurm enverra un message.
  • #SBATCH --requeue # Cette option est à utiliser avec précaution, elle permet, en cas de problème sur un noeud en cours d’exécution d’un job, de le remettre automatiquement en queue.
  • #SBATCH --array=1-200%20 # Les job arrays permettent, dans un seul fichier batch, de générer un grand nombre de jobs similaires lancés en parallèle (1000 au maximum), en précisant éventuellement le nombres de jobs devant tourner en même temps (%x).

Exemples de script Slurm :

Pour l’utilisation de six coeurs pendant 2 heures sur les machines aux processeurs westmere

#!/bin/sh
#SBATCH -J Job_westmere
#SBATCH -p westmere
#SBATCH -n 6
#SBATCH -A westmere
#SBATCH -t 2:00:00
#SBATCH -o ./%N.%x.out
#SBATCH -e ./%N.%x.err
#SBATCH --mail-type=BEGIN,END
#SBATCH --mail-user=adresse@mail
# chargement des modules
module purge
module load userspace/all
module load …
# déplacement sur le répertoire de travail
cd /scratchw/$SLURM_JOB_USER/
~

Pour l’utilisation de deux noeuds pendant 2 jours et 12 heures sur les machines aux processeurs skylake

#!/bin/sh
#SBATCH -J Job_skylake
#SBATCH -p skylake
#SBATCH -N 2
#SBATCH -n 32
#SBATCH -A b001
#SBATCH -t 2-12
#SBATCH -o ./%N.out
#SBATCH -e ./%N.err
#SBATCH --mail-type=BEGIN,END
#SBATCH --mail-user=adresse@mail

# chargement des modules
module purge
module load userspace/all
module load …
# déplacement sur le répertoire de travail
cd /scratch/$SLURM_JOB_USER/

echo “Running on: $SLURM_NODELIST”

~

Pour l’utilisation de 2 gpu kepler et 10 coeurs pendant 10 heures

#!/bin/sh
#SBATCH -J Job_gpu
#SBATCH -p kepler
#SBATCH --gres=gpu:2
#SBATCH --gres-flags=enforce-binding # active l’affinité CPU:GPU
#SBATCH -n 10
#SBATCH -A b001
#SBATCH -t 10:00:00
#SBATCH -o %x.out
#SBATCH -e %x.err
# chargement des modules
module purge
module load userspace/all
module load cuda/9.1
module load …
# déplacement sur le répertoire de travail
cd /scratch/$SLURM_JOB_USER/
~

Pour l’utilisation de /scratchfast sur noeud skylake

#!/bin/sh
#SBATCH -J Job_scratchfast
#SBATCH -p skylake
#SBATCH -N 1
#SBATCH -L scratchfast:10 #10Go
#SBATCH -A b001
#SBATCH -t 10:00:00
#SBATCH -o %x.out
#SBATCH -e %x.err
# chargement des modules
module purge
module load userspace/all
module load …
# déplacement sur le répertoire de travail
cd /scratchfast/$SLURM_JOB_USER/$SLURM_JOB_ID/
~

Pour lancer 10 jobs identiques en parallèle utilisant chacun 4 cœurs

#!/bin/sh
#SBATCH -J 10_Jobs
#SBATCH -N 1
#SBATCH -A b001
#SBATCH -n 4
#SBATCH -t 10:00:00
#SBATCH --array=0-9
#SBATCH -p skylake
#SBATCH -o Array_job.%A_%j.out
#SBATCH -e Array_job.%A_%j.err
# déplacement sur le répertoire de travail
cd /scratch/$SLURM_JOB_USER/
echo “My SLURM_ARRAY_TASK_ID: ” $SLURM_ARRAY_TASK_ID
./mon_programme $SLURM_ARRAY_TASK_ID
~

Pour lancer 10 jobs paramétriques en indiquant une valeur de paramètre pour chaque job :

#!/bin/sh
#SBATCH -J Mes_Jobs_Paramétriques
#SBATCH -A b001
#SBATCH -N 1
#SBATCH –ntasks-per-node=1
#SBATCH -t 10:00:00
#SBATCH –array=0-9%5 # 10 jobs, 5 jobs maximum tournant simultanément
#SBATCH -p skylake
#SBATCH Do Array_job.%A_%j.out
#SBATCH -e Array_job.%A_%j.err

# déplacement sur le répertoire de travail
cd /scratch/$SLURM_JOB_USER/

VALEURS=(0 1 1 2 3 5 8 13 21 34) # liste des paramètres (le nombre de valeurs doit correspondre au nombre de jobs)
mpirun /mon/programme ${VALEURS[$SLURM_ARRAY_TASK_ID]}

Suivi de consommation des heures allouées :

Le mésocentre alloue des heures par projet.
Un utilisateur n’a qu’un seul compte de login même lorsqu’il participe à plusieurs projets.

La commande rheticus_info liste les projets auxquels l’utilisateur participe ainsi que le décompte des heures utilisées / accordées pour chaque projet.

rheticus_info 

Recent jobs:
[2018-09-12 16:25:28] 235851 'CDensL1.5' b032/skylake (23:42:54)
[2018-09-12 16:23:28] 235850 'CDensL2Fast' b032/skylake (23:44:54)
[2018-09-12 16:21:29] 235848 'CylDensL3' b073/skylake (23:46:53)
[2018-09-11 14:45:15] 235733 'SXRTA005' b073/skylake (2-01:23:07)
[2018-09-11 14:19:35] 235726 'S100RT15' b031/skylake (2-01:48:47)

Relevant projects:
b002: 30261 hours have been consumed (Used 24.2% of 125021 hours)
b031: 2016 hours have been consumed (Used 2.7% of 73335 hours)
b032: 944 hours have been consumed (Used 1.7% of 55723 hours)
b073: 8072 hours have been consumed (Used 13.4% of 60185 hours)
h111: 686 hours have been consumed (Used 3.4% of 20000 hours)

Transition guide from OAR to SLURM.

COMMANDOARSLURM
Submit a passive/batch joboarsub -S [script]sbatch [script]
Start an interactive joboarsub -Isrun -p skylake --pty bash -i
Queue statusoarstatsqueue
User job statusoarstat -u [user]squeue -u [user]
Specific job status (detailed)oarstat -f -j [jobid]scontrol show job [jobid]
Delete (running/waiting) joboardel [jobid]scancel [jobid]
Hold joboarhold [jobid]scontrol hold [jobid]
Resume held joboarresume [jobid]scontrol release [jobid]
Node list and propertiesoarnodesscontrol show nodes

SPECIFICATIONOARSLURM
Script directive#OAR#SBATCH
Nodes request-l nodes=[count]-N [min[-max]]
Cores request-l core=[count]-n [count]
Cores-per-node request-l nodes=[ncount]/core=[ccount]-N [ncount] --ntasks-per-node=[ccount] -c 1
OR
-N [ncount] --ntasks-per-node=1 -c [ccount]
Walltime request-l [...],walltime=hh:mm:ss-t [min] OR -t [days-hh:mm:ss]
Job array--array [count]--array [specification]
Job name-n [name]-J [name]
Job dependency-a [jobid]-d [specification]
Property request-p "[property]='[value]'"-C [specification]

ENVIRONMENT VARIABLEOARSLURM
Job ID$OAR_JOB_ID$SLURM_JOB_ID
Resource list$OAR_NODEFILE$SLURM_NODELIST #List not file! See note
Job name$OAR_JOB_NAME$SLURM_JOB_NAME
Submitting user name$OAR_USER$SLURM_JOB_USER
Task ID within job array$OAR_ARRAY_INDEX$SLURM_ARRAY_TASK_ID
Working directory at submission$OAR_WORKING_DIRECTORY$SLURM_SUBMIT_DIR

Note: you can easily create a nodefile in the style of OAR, from a SLURM job with srun hostname | sort -n > hostfile.

This page is based on the excellent guide created by University of Luxembourg HPC Team.


Dernière mise à jour : 22 septembre 2021 mesocentre-techn@univ-amu.fr

+33 (0)4 13 94 58 29 / (0)4 13 94 58 27