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
.