Exécuter des jobs avec Slurm

Slurm est un gestionnaire de charge de travail pour clusters HPC. Il alloue les ressources à des utilisateurs pour une certaine durée de temps, gère l’exécution de leurs jobs et les priorises en gérant des files d’attente.

De quoi avez-vous besoin :

  • d’éventuelles données de travail transférées dans votre dossier personnel

  • d’un programme à exécuter

  • d’un script qui aura pour tâche de préparer l’environnemnt et d’exécuter vos programmes.

Tester votre environnement d’exécution

Avant d’écrire un script et de le soumettre à Slurm, il est conseillé de tester l’environnement dans lequel votre code s’exécutera à l’aide d’une session interactive.

Vous pouvez obtenir une session interactive de cette manière :

[demo@datamaster ~]$ srun --partition debug -n 2 --mem 2G --pty /bin/bash
Il est important d’informer Slurm sur l’utilisation des ressources.
Si vous utilisez une autre partition que debug, n’oubliez pas de mettre une limite de temps avec l’option -t 2:00:00 (2 heures par exemple).
Si un GPU est requis, ajoutez cet argument : --gres="gpu:1"

Comment soumettre un job ?

Préparer un script d’exécution

Pour soumettre un job, vous devez écrire un script bash qui préparera l’environnement d’exécution et lancera votre programme avec ses paramètres.

Dans le script suivant run-tf-multigpu_cnn.bash :

Cet exemple est peut-être obsolète et à besoin d’une vérification.
run-tf-multigpu_cnn.bash
#!/bin/bash
#SBATCH --job-name=multigpu_cnn (1)
#SBATCH --partition=gpu         (2)
#SBATCH -N 1                    (3)
#SBATCH -n 4                    (4)
#SBATCH --mem=5G                (5)
#SBATCH --gres="gpu:2"          (6)
#SBATCH -t 1:00:00              (7)
#SBATCH --mail-user=your.name@umons.ac.be (8)
#SBATCH --mail-type=ALL                   (9)

# Loading Anaconda module
module load anaconda3

# Loading an Anaconda environment
conda source tensorflow-gpu-1.8

echo "DATE : $(date)"
echo "_____________________________________________"
echo " HOSTNAME             : $HOSTNAME"
echo "_____________________________________________"
echo " CUDA_DEVICE_ORDER    : $CUDA_DEVICE_ORDER"
echo "_____________________________________________"
echo " CUDA_VISIBLE_DEVICES : $CUDA_VISIBLE_DEVICES"
echo "_____________________________________________"
nvidia-smi -L
echo "_____________________________________________"

# Starting the Python program and printing the time it took to complete
time python3 $HOME/multigpu_cnn.py
1 Un nom pour le job
2 la partition (file d’attente)
3 le nombre de serveurs à utiliser
4 le nombre de CPU
5 le besoin en mémoire maximale
6 si vous avez besoin d’un GPU, ici, nous en réservons 2
7 une limite de temps d’une heure
8 l’adresse mail utilisée pour les notifications
9 le type de notification qui déclenchera l’envoi d’un email

Ce script bash doit être exécutable, donc nous le définissons comme exécutable avec la commande chmod :

$ chmod a+x run-tf-multigpu_cnn.bash

Vérifier la disponibilité des ressources

Vous pouvez affichez des informations sur l’état des files avec sinfo :

[demo@datamaster ~]$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
days         up 2-00:00:00      6   idle hpc[1-6]
week         up 7-00:00:00      6   idle hpc[1-6]
month        up 31-00:00:0      6   idle hpc[1-6]
gpu          up 1-00:00:00      3   idle deep[1-2],simu1
lgpu         up 7-00:00:00      3   idle deep[1-2],simu1
debug        up    4:00:00      9   idle deep[1-2],hpc[1-6],simu1

Signification :

Pour la partition "days", le job a une limite de temps d’exécution de 2 jours.
Il y a 6 nœuds dans la partition, de hpc1 à hpc6 et ils sont tous en état idle, c’est à dire en attente de soumissions.

Les partitions "gpu" et "lgpu" sont disponibles pour lancer des jobs de courte et de longue durée sur des serveurs équipés de GPUs pour entre autre des travaux de Deep Learning.

Enfin, "debug" est une partition de courte durée qui peut-être utilisée pour des tests.

Soumettre votre job

Étant donné que nous avons défini les options de la commande sbatch dans le script run-tf-multigpu_cnn.bash, nous n’avons pas besoin de les spécifier sur la ligne de commande.

[demo@datamaster ~]$ sbatch run-tf-multigpu_cnn.bash
Submitted batch job 5336

Dans le cas contraire, nous aurions pu le faire de cette manière :

[demo@datamaster ~]$ sbatch --partition=gpu -N 1 -n 4 --mem=5G --gres="gpu:2" -t 1:00:00 run-tf-multigpu_cnn.bash
Submitted batch job 5336

Pour plus d’informations sur les options disponibles :

[demo@datamaster ~]$ man sbatch

Vérifier l’état de la soumission

[demo@datamaster ~]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
              5336       gpu run-tf-m     demo  R       0:10      1 simu1

Le job est en cours d’exécution Running sur le nœud simu1 depuis 10 secondes dans la partition gpu.

Un autre état aurait pu être PD (pour pending) en attente.
Si RESOURCE est affiché, cela veut dire que le job attends que les ressources soient libres.

Nous pouvons voir la sortie du job en affichant le contenu du fichier slurm-5336.out qui est créé dans le répertoire courant.

[demo@datamaster ~]$ cat slurm-5336.out