Courses

Le cluster Baobab

Baobab est un cluster de calcul de l'Université de Genève

Utilisation

# Pour vous connecter au cluster:
ssh username@baobab2.hpc.unige.ch
 
# Si vous souhaitez utiliser des applications 
# graphiques sur baobab, vous pouvez 
# vous y connecter de la façon suivante:
ssh -Y username@baobab2.hpc.unige.ch

Modules

Afin de pouvoir compiler du code MPI et CUDA et de disposer d'un compilateur récent, il faut charger les modules foss et CUDA, cela se fait via la commande :

module load foss (e.g. foss/2019a - see Baobab Documentation)
module load CUDA

Vous pouvez ajouter cette ligne dans le fichier .bashrc se trouvant à la racine de votre dossier utilisateur afin que les modules soient chargés à chaque connexion.

# Vous pouvez essayer aussi
module list
module spider "appToLoad"
module purge "appToRemove"

Soumettre un job

Job MPI

Baobab utilise le système de queuing slurm. Pour soumettre un job, vous pouvez utiliser la commande srun ou écrire un script spécifiant la configuration d'exécution que vous soumettrez avec sbatch.

Il ne faut JAMAIS exécuter un programme sur une machine partagée sans passer par le système de queuing. Lorsque vous êtes connecté à baobab, rappelez vous de TOUJOURS utiliser la commande sbatch et JAMAIS la commande mpirun ou mpiexec directement.

Voici un exemple de script pour sbatch :

#!/bin/sh
#SBATCH --job-name=NomDuJob
#SBATCH --output=NomOutput.o%j
#SBATCH --ntasks=20
#SBATCH --partition=partition1,partition2,etc (run in Baobab : scontrol show part, to see the available partitions)
#SBATCH --time=01:00:00
 
echo $SLURM_NODELIST
 
srun ./MonProgramme

Si vous enregistrez ce script dans un fichier nommé script.sh, vous pouvez le soumettre sur le cluster avec la commande :

sbatch script.sh

Monitorer et gérer les jobs

# Afin de voir les jobs en attente et en cours d'exécution,
# vous pouvez utiliser la commande squeue. Pour limiter 
# l'affichage à vos jobs, vous pouvez utiliser:
squeue -u username
#
scontrol show <jobid>
#
sacct -j <job_id>
 
# Pour supprimer un job, vous pouvez utiliser 
# la commande scancel. Soit avec:
scancel jobid
 
# ou 
scancel jobname 
 
# ou encore
scancel -u username 

Il existe également une interface web disponible ici qui vous permet de voir l'état du cluster et des jobs.

Mesure de performances

Dans le cas où vous souhaitez effectuer des mesures de performance, il faut se limiter à des noeuds de même génération. L'exemple de script suivant permet d'imposer cette limitation :

#!/bin/sh
#SBATCH -J heat
#SBATCH -o heat.o%j
#SBATCH --ntasks=20
#SBATCH -p shared,cui
#SBATCH -t 01:00:00
#SBATCH --constraint=E5-2630V4
 
echo $SLURM_NODELIST
 
srun ./laplace 2000 2000 1000 /scratch/heat.dat

Pour finir, vous remarquez que le résultat est écrit dans la partition /scratch/. Cette partion est locale à chaque noeud, ceci permet donc de mesurer des temps d'écriture sans dépendre de l'utilisation du stockage partagé.

Partition debug

Il existe une partition debug qui compte deux noeuds et dont le temps d'exécution est limité à 15 minutes. Cette partition est pratique car elle vous permet d'effectuer des tests rapides de votre code avant de l'envoyer pour exécution sur la partition shared.

Exemple d'utilisation de la partition debug :

#!/bin/sh
#SBATCH -J heat
#SBATCH -o heat.o%j
#SBATCH --ntasks=16
#SBATCH -p debug
#SBATCH -t 00:15:00
 
echo $SLURM_NODELIST
 
srun ./laplace 2000 2000 1000 /scratch/heat.dat

Job threads

#!/bin/sh
#SBATCH -J heat
#SBATCH -o heat.o%j
#SBATCH --ntasks=1
#SBATCH --nodes=1
#SBATCH --cpus-per-task=4
#SBATCH -p shared,cui
#SBATCH -t 01:00:00
 
echo $SLURM_NODELIST
 
srun ./laplace_threads 2000 2000 1000 /scratch/heat.dat $SLURM_CPUS_PER_TASK

Dans le cas d'un job utilisant des threads, il faut changer légérement la configuration d'exécution. En effet, dans ce cas slurm ne doit créer qu'un seul processus (d'où le paramètre ntasks=1) et le programme créera plusieurs threads. Il faut transmettre cette information à slurm pour qu'il puisse faire l'allocation correctement. Ici, on met le paramètre cpus-per-task à 4 et on transmet cette information à l'executable via la variable d'environnement $SLURM_CPUS_PER_TASK.