Cluster Mode d'Emploi


quart de jet 0.2quart de jet 0.8quart de jet 1.6
animation

galerie d'images



Le centre de calcul du LMM est équipé depuis septembre 2006 d'un nouveau cluster dédié au calcul parallèle sous MPI. Ce cluster est constitué de 20 noeuds bi-Opteron 265 Dual Core, soit l'équivalent de 80 processeurs et une puissance de crête (théorique) de 288 Gigaflops, chaque noeud est pourvu de 8 Go de Mémoire.

Le système installé est la version 4.2 de Rocks Cluster  http://www.rocksclusters.org  qui repose sur la distribution Linux Centos 4.3 x86_64  http://www.centos.org . Pour la gestion des jobs parallèles on a choisi d'utiliser Sun Grid Engine  (SGE version 6.0 update 8).

Le choix des librairies MPI pour la configuration de l'environnement parallèle de SGE est MPICH2 conforme au standard MPI-2 (inclus MPI-1), MPICH2 offre pour la gestion des processus le choix parmi 3 process managers (mpd par defaut, smpd, et gforker), les librairies MPICH2 (mpich2-1.0.4p1) ont été compilées avec l'option: 

./configure --prefix=/share/apps/mpich2_smpd --with-pm=smpd --with-pmi=smpd

Comment lancer un job parallèle

1/ Configurer son compte

Il faut d'abord créer un fichier hostfile sur son compte contenant :

compute-0-0 cpu=4
compute-0-1 cpu=4
compute-0-2 cpu=4
compute-0-3 cpu=4
compute-1-0 cpu=4
compute-1-1 cpu=4
compute-1-2 cpu=4
compute-1-3 cpu=4
compute-1-4 cpu=4
compute-1-5 cpu=4
compute-1-6 cpu=4
compute-1-7 cpu=4
compute-2-0 cpu=4
compute-2-1 cpu=4
compute-2-2 cpu=4
compute-2-3 cpu=4
compute-2-4 cpu=4
compute-2-5 cpu=4
compute-2-6 cpu=4
compute-2-7 cpu=4
babbage.local cpu=0

Ensuite il faut créer un fichier .smpd avec un éditeur de votre choix, par exemple vi, vérifiez que les droits sont bien rw juste pour vous, le fichier contient seulement "phrase=votre_nom" :

[my_login@babbage ~]$ more .smpd
phrase=my_name
[my_login@babbage ~]$ ls -l .smpd
-rw-------  1  my_name my_name 14 Dec 11 12:10 .smpd
[my_login@babbage ~]$

Si les droits ne sont pas bons, changez les avec la commande chmod 600 .smpd
sinon vous ne pourrez pas démarrer vos jobs.

Une fois ce fichier créé, on ne s'occupe plus des daemons smpd, ceux-ci sont directement gérés par les scripts de démarrage de Sun Grid Engine, via la commande qsub. Vérifiez régulièrement avant de lancer des calculs le contenu de ce fichier, quand un calcul se termine normalement le fichier contient seulement la ligne "phrase=votre_nom". Au cours du calcul Sun Grid Engine ajoute dynamiquement le nom des noeuds utilisés pour le calcul et les enlève à la fin du calcul, si ce n'est le cas, rééditez le fichier et verifiez les droits comme indiqué ci-dessus.

Vérifiez le contenu des variables $PATH et $LD_LIBRARY_PATH par défaut et modifiez votre .bash_profile selon ce que vous voulez faire.

[my_login@babbage ~]$ echo $PATH
/opt/gridengine/bin/lx26-amd64:/usr/kerberos/bin:/usr/java/jdk1.5.0_05/bin:
/opt/intel/itc60/bin:/opt/intel/ita60/bin:/opt/intel/fce/9.0/bin:/opt/intel/idbe/9.0/bin:/opt/intel/cce/9.0/bin:
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/opt/apache-ant/bin:/opt/ganglia/bin:
/share/apps/mpich2_smpd/bin:/opt/rocks/bin:/opt/rocks/sbin:
/home/my_login/bin
[my_login@babbage ~]$ echo $LD_LIBRARY_PATH
/opt/gridengine/lib/lx26-amd64:
/opt/intel/cmkl/8.0/lib/em64t:/opt/intel/itc60/slib:/opt/intel/ipp41/em64t/sharedlib:/opt/intel/fce/9.0/lib:/opt/intel/cce/9.0/lib:
/share/apps/mpich2_smpd/lib
[my_login@babbage ~]$

Par exemple, pour utiliser la version préinstallée de Gerris vous pouvez ajouter /share/apps/gerris/bin dans votre PATH.

[my_login@babbage ~]$ which mpiexec
/share/apps/mpich2_smpd/bin/mpiexec
[my_login@babbage ~]$ which mpicc
/share/apps/mpich2_smpd/bin/mpicc
[my_login@babbage ~]$ mpicc -show
gcc -I/share/apps/mpich2_smpd/include -L/share/apps/mpich2_smpd/lib -lmpich -lpthread -lrt -ldl -lssl -luuid -lpthread -lrt -ldl
[my_login@babbage ~]$

2/ Compiler un code parallèle sur le cluster

Pour compiler en C, on utilise la commande mpicc de MPICH2.
Pour compiler en C++, on utilise la commande mpicxx de MPICH2.
Pour compiler en fortran 77, on utilise la commande mpif77 de MPICH2.
Pour compiler en fortran 90, on utilise la commande mpif90 de MPICH2.

si par exemple on veut compiler en C le code Gerris avec les librairies MPICH2 :

./configure --prefix=/home/my_directory/local/gerris
--with-mpicc=/share/apps/mpich2_smpd/bin/mpicc
CPPFLAGS = -I/share/apps/mpich2_smpd/include
LDFLAGS = -L/share/apps/mpich2_smpd/lib
--disable-shared

3/ Ecrire son fichier de batch

Pour lancer un job parallèle sur le cluster vous devez impérativement le lancer avec la commande qsub ( voir les man_pages de SGE) et via un fichier de batch, par exemple :
qsub my_job.sh
Voici un exemple de batch pour lancer un calcul avec Gerris2D ( test_gerris.sh) :

#!/bin/bash
#$ -S /bin/bash
#$ -M my_login@mon_labo.jussieu.fr
#$ -m bea
#$ -o $HOME/sge.out
#$ -e $HOME/sge.err
#$ -cwd
#$ -v HOME
#$ -v LD_LIBRARY_PATH
#$ -v PE_HOSTFILE=$HOME/hostfile
# calcul parallele sur 4 processeurs
#$ -pe mpich2_smpd 4
MPI_DIR=/share/apps/mpich2_smpd
port=$((JOB_ID % 5000 + 20000))
$MPI_DIR/bin/mpiexec -n $NSLOTS -machinefile $TMPDIR/machines -port $port /share/apps/gerris/bin/gerris2D $HOME/data_gerris/half4.gfs

Ce fichier de batch envoie un email lorsque le calcul commence (b pour begin), fini (e pour end) ou échoue pour une raison quelconque (a pour abort), écris un fichier sge.err très utile pour savoir pourquoi un job ne démarre pas, un fichier sge.out pour les sorties standards, cherche les fichiers depuis le répertoire où qsub est lancé (-cwd), transmet les variables d'environnement $HOME et  $LD_LIBRARY_PATH aux scripts de lancement de SGE.
les options suivantes sont obligatoires :
la variable $PE_HOSTFILE fournit des informations sur les noeuds utilisables (nombre de processeurs par noeud), les scripts de lancement de SGE sélectionnent ensuite les noeuds adéquates en fonction des options décrites plus bas et génèrent un fichier temporaire  $TMPDIR/machines.
#$ -pe mpich2_smpd 4 précise que l'on veut lancer le calcul parallèle sur 4 processeurs en utilisant l'environnement parallèle mpich2_smpd de SGE, ce qui détermine les scripts de lancement du job par SGE. le cluster est configuré pour lancer les jobs avec cet environnement parallèle.
port=$((JOB_ID % 5000 + 20000)) précise le numero de port qui sera utilisé par les daemons smpd pour communiquer, ne pas changer cette option !
mpiexec -n ( et pas -np) est la commande qui remplace mpirun dans MPICH2 et que vous devez utiliser pour lancer vos jobs parallèles ( à ne pas confondre avec le mpiexec de LAM-MPI), les variables $NSLOTS et $TMPDIR sont fournies par les scripts de lancement de SGE.


4/ Où stocker ses données

Si vous avez des données de calcul volumineuses, vous devez les écrire dans /home/data et non dans votre répertoire perso. Vous disposez pour le moment de 1 Teraoctet commun à tous les utilisateurs dans le répertoire /home/data.

5/ Utiliser l'interface graphique de Sun Grid Engine : qmon

Vous pouvez soumettre des commandes et des jobs soit en ligne de commande, pour cela lisez les man_pages de SGE, soit via l'interface graphique de SGE :
qmon&

Vous pouvez aussi trouver la documentation de SGE ici : Grid_Engine_6_user's_guide.pdf

Interface Graphique Qmon

Soumettre un job via Qmon

controle des jobs


6/ Structure du cluster pour la soumission des jobs - Définition des queues

Le cluster comprend des queues superposées selon le schema ci-dessous pour la soumission des jobs.

Sur les 4 premiers noeuds : 
3 queues pour tester les jobs sur 4, 8, et 16 processeurs pendant 6 minutes maximum (para4_short, para8_short, para16_short).
3 queues pour lancer les jobs sur 4, 8, et 16 processeurs par tranche de 12h de temps réel (para4_long, para8_long, para16_long1).

Sur les 16 autres noeuds :
1 queue pour lancer les jobs par tranche de 12h sur 64 processeurs (para64_long)
2 queues pour lancer les jobs par tranche de 12h sur 32 processeurs (para32_long1 et para32_long2)
2 queues supplémentaires pour lancer les jobs par tranche de 12h sur 16 processeurs (para16_long2 et para16_long3)

ce que l'on peut schematiser ainsi :

para16_short + para16_long1 para64_long
para8_short para8_long para32_long1 para32_long2
para4_short               para4_long                para16_long2                 para16_long3                

les priorités entre les queues se font ainsi,  si une queue dans le schéma est au-dessus d'une autre, alors elle est prioritaire sauf pour les para4_short et para8_short qui peuvent toujours démarrer. Une queue n'accepte qu'un seul job sauf si celui-ci n'occupe pas les processeurs à 100%, les critères s'appliquent en termes de charge des processeurs.

Pour pouvoir accéder aux différentes queues, il faut utiliser les options suivantes dans son fichier de batch, d'abord spécifier le nom de la queue via l'option :

#$ -l q=le_nom_de_la_queue

les noms possibles pour cette option sont para4_st, para8_st, para16_st, para4_lg, para8_lg, para16_lg1, para16_lg2, para16_lg3, para32_lg1, para32_lg2, para64, night80, et all. 

pour les queues long (long=12h temps réel), il faut ajouter l'option :

#$ -l h_rt_min=une valeur plus grande que 360  (secondes !)

A titre d'essai, il existe deux queues supplémentaires, all.q et night80_long.q, qui utilisent les 80 processeurs, all.q ne fonctionne que le week-end pendant 48h max et n'a aucune priorité, night80_long.q ne fonctionne qu'entre 18h et 6h du matin du lundi au vendredi et est prioritaire sur toutes les paraxx_long, sauf para4_long.q qui ne fonctionne qu'entre 6h et 18h.

queues du cluster

Comment fonctionne Sun Grid Engine

1/ Schéma de fonctionnement

Le fonctionnement de Sun Grid Engine repose principalement sur les daemons suivants :
-sur le master : sge_qmaster et sge_schedd
-sur les noeuds de calcul : sge_execd et sge_shepherd
Les demandes des client (via qsub ou autre) sont gérées par qmaster et schedd sur le frontal du cluster et ensuite transmises à execd sur les noeuds de calcul, mais le daemon qui nous interesse le plus  et qui au final contrôle les jobs est, comme son nom l'indique, le daemon shepherd, lui même sous le contrôle de execd.

schema_sge

2/ Fonctionnement des scripts pour mpich2_smpd

Avant qu'un calcul parallèle puisse être lancé, il y a un certain nombre de tâches préparatoires à effectuer, ce travail est réalisé par les scripts de démarrage qui vont par exemple démarrer les daemons smpd nécessaire pour les communications entre les noeuds, c'est l'équivalent des commandes "lamboot" ou "mpdboot" que vous tapez généralement à la main, sauf qu'ici les scripts vous garantissent un contrôle sûr des jobs et des daemons smpd, si vous faites un qdel il ne restera ni jobs ni daemons smpd sur les noeuds, c'est ce qu'on appelle "Tight Integration". Si vous voulez savoir ce que font exactement ces scripts lisez les Howtos de Sun Grid Engine.

scripts_sge

3/ SGE à la loupe !

Pour mieux comprendre voici quelques exemples ...

un_noeud

un_noeud2

un_noeud3

trois noeuds

trois noeuds 2

trois noeuds 3

trois noeuids 4

Où stocker mes données ?

Le frontal du cluster Babbage dispose de deux partitions en Raid 5, la première /home sur laquelle vous travaillez par défaut et qui est montée en NFS sur les noeuds, la deuxième /data pour le stockage temporaire des données afin de libérer de la place sur le /home et sur laquelle vous êtres libre de créer des répertoires. Pour le stockage à plus long terme ou pour le traitement de vos données vous devez utiliser  la machine Tycho selon la procédure suivante :
Le réseau actuel de l'Institut en 100 Mbs est trop lent pour transférer de gros volumes de données, vos données sont donc automatiquement transféré chaque nuit sur tycho via un lien local gigabit :
-babbage: /home est transféré sur tycho:/data0/home
-babbage:/data est transféré sur tycho:/data1/data
Vous n'avez donc pas à les transférer, vous vous connectez simplement sur tycho dans votre repertoire home qui est vide par défaut, vous récupérez ce qui vous intéresse pour le traiter en le copiant depuis /data0/home ou /data1/data vers votre répertoire home. Vous pouvez ensuite supprimer ces données sur le frontal babbage, par synchronisation des répertoires les données seront aussi supprimées dans les répertoires /data0/home et /data1/data la nuit suivante, mais les données que vous aurez mises sur votre home tycho, elles, seront conservées. A cause des volumes de données il est important de traiter vos données au fur et à mesure car il n'est pas possible de tout conserver indéfiniment !