Vous trouverez ci-dessous un certain nombre d’exemples de scripts pouvant être utilisés comme modèle pour créer vos propres scripts de soumission SLURM.
Simple scripts de soumission
Les jobs nécessitent un fichier de script que SLURM interprète et exécute.
Le fichier SBATCH contient à la fois des commandes spécifiques à SLURM à interpréter ainsi que des programmes à exécuter. Vous trouverez ci-dessous un exemple simple d’un job pour exécuter un fichier Stata do.
Script
Ce fichier est nommé myscript.sbatch :
#!/bin/bash |
Script détaillé
Le même script avec les lignes commentées :
## Indique au shell comment exécuter le script |
Appel d’un script python
Exemple avec un script python :
#!/bin/bash |
Lancer un job
Vous pouvez envoyer le job avec la commande suivante qui entraînera la mise en file d’attente du job en attendant que les ressources soient disponibles (ce qui varie en fonction du nombre d’autres jobs exécutés sur le cluster). :
# sbatch monscript.sbatch |
Vous pouvez voir l’état de vos jobs avec la commande suivante :
# squeue -u $USER |
Enfin, vous pouvez lire la sortie de votre job dans le fichier slurm-<job_ID>.out
produit en exécutant votre job. C’est là que se trouvent les journaux concernant l’exécution de votre job, y compris les erreurs ou les messages système. Vous pouvez imprimer le contenu à l’écran à partir du répertoire contenant le fichier de sortie avec la commande suivante :
# cat slurm-<job_ID>.out |
Jobs interactifs
La majorité des jobs sur un cluster sont soumis avec la commande sbatch
et exécutés en arrière-plan mais il existe des méthodes pour les exécuter interactivement via la commande srun
.
Les jobs interactifs permettent aux utilisateurs de saisir des commandes et des données via le terminal (ou dans une interface graphique).
Il est possible en mode interactif de :
- Éditer des fichiers
- Compiler et débuger le code
- Explorer les données
- Obtenir des fenêtres graphiques
- Exécuter d’autres logiciels
Les jobs interactifs permettent également d’éviter les problèmes avec les nœuds. Si vous joblez sur un nœud et que votre job est trop gourmand en IO, il peut être supprimé sans préavis. L’exécution de jobs inteinteractifs sur des nœuds n’impacte généralement pas beaucoup d’utilisateurs et permet donc d’accéder à des ressources qui ne serait pas disponibles en temps normal, comme l’accès interactif aux GPU, la mémoire, l’accès exclusif à toutes les ressources, etc.
Lancer un job interactif
Dans les exemples ci-dessous, on lance une session shell avec --pty /bin/bash
. Par défaut ici, la ressource allouée est 1 seul processeur et 2 Go de mémoire pendant 1h.
# srun --pty /bin/bash |
Pour demander 4 processeurs, 4 Go de mémoire et une durée d’exécution de 2h, on ajoute les arguments suivants :
# srun --cpus-per-task=4 --time=2:00:00 --mem=4000 --pty /bin/bash |
Pour utiliser le GPU, 3 Go de mémoire et une durée de fonctionnement de 1h30, vous pouvez ajouter les éléments suivants :
# srun --time=1:30:00 --mem=3000 --gres=gpu:1 --pty /bin/bash |
Une fois le job lancé, l’invite de commande change, ici on passe de master-3
à mynode80
, donc on ne se trouve plus sur le master mais sur le noeud mynode80
, on peut maintenant charger des modules/logiciels et les exécuter interactivement sans impacter le cluster :
[martymcfly@master-3 ~]# srun --pty /bin/bash |
Exemple avec R
Exemple : étapes pour démarrer une session interactive et lancer R, là encore on lance le job depuis le master, on se retrouve connecté sur le noeud, on paramètre les module, on lance R et la commande exit
nous fait revenir sur le master :
[emmetbrown@master-1 ~]# srun --cpus-per-task=1 --pty /bin/bash |
Job MPI
MPI (Message Passing Interface) est géré par un programme comme OpenMPI pour coordonner le code et les ressources dans le cluster HPC afin qu’un job puisse s’exécuter en parallèle (en lançant des precessus en parallèle).
Pour utiliser MPI il faut utiliser un compilateur MPI, exemple avec Greene, qui prend en charge 2 versions d’OpenMPI, Intel et GCC.
Module
Pour appeller le module OpenMPI avec Intel :
# module load openmpi/intel/4.1.1 |
Avec GCC :
# module load openmpi/gcc/4.1.1 |
Exemple
Exemple de compilation d’un script en C pour MPI. A placer dans votre répertoire de travail sous le nom de hellompi.c
:
#include <stdio.h> |
Puis charger le module et compiler :
# module load openmpi/intel/4.1.1 |
Ensuite on crée le script, nommé hellompi.sbatch
:
#!/bin/bash |
Lancer le script
Pour lancer votre script, on utilise simplement sbatch
:
# sbatch hellompi.sbatch |
Après l’exécution du job, lancer cat hellompi.out
pour voir que vos processus ont été exécutés sur plusieurs nœuds. Il peut y avoir des erreurs, mais votre sortie doit contenir quelque chose comme ce qui suit, indiquant que le processus a été exécuté en parallèle sur plusieurs nœuds :
Process 0 on mynode05.hpc.cluster out of 4 |
Job GPU
Pour utiliser la GPU, il faut préciser dans le script la directive SBATCH
suivante :
#SBATCH --gres=gpu:1 |
Pour demander une GPU spécifique, par exemple une RTX 800 :
#SBATCH --gres=gpu:rtx800:1 |
Script
Le contenu du script de travail “run-amber.s” doit être le suivant :
#!/bin/bash |
Lancer le script
Pour soumettre un job “Amber” (progiciel de dynamique moléculaire) :
# sbatch run-amber.s |
Lorsque le job est terminé, plusieurs fichiers de sortie sont générés. Vérifiez celui nommé mdout
:
|--------------------- INFORMATION ---------------------- |
Job Array
Les jobs array permettent de soumettre de nombreux jobs similaires avec des exigences de travail (presque) identiques et réduire les charges pour les utilisateurs et l’ordonnanceur.
Les obs array ne peuvent être utilisés qu’avec sbatch
.
Script
Dans cet exemple il y 5 fichiers d’entrée sample-1.txt
à sample-5.txt
.
Contenu du répertoire :
# mkdir -p /scratch/$USER/myjarraytest |
Les jobs array créent la variable d’environnement SLURM_ARRAY_TASK_ID
qui est unique pour chaque job array. Les options %A
et %a
indiquent l’ID du job et l’ID de l’index du tableau.
Le contenu du script ‘run-jobarray.s’ est le suivant :
#!/bin/bash |
Lancer le script
Pour soumettre la tâche sur le cluster, En exécutant la commande sbatch --array=1-5 run-jobarray.s
, on soumet 5 jobs pour traiter chaque fichiers d’entrée individuellement. :
# sbatch --array=1-5 run-jobarray.s |
Documentation
https://help.rc.ufl.edu/doc/Sample_SLURM_Scripts
https://help.jasmin.ac.uk/article/4890-how-to-submit-a-job-to-slurm
https://docs-research-it.berkeley.edu/services/high-performance-computing/user-guide/running-your-jobs/scheduler-examples/
https://slurm.schedmd.com/sbatch.html
https://sites.google.com/nyu.edu/nyu-hpc/training-support/tutorials/slurm-tutorial?pli=1
https://sites.google.com/nyu.edu/nyu-hpc/training-support/general-hpc-topics/slurm-submitting-jobs