Slides - indico in2p3

Transcription

Slides - indico in2p3
0<+>0
Rappel
MPI +
GE
Annexes
Le service de calcul parallèle avec GridEngine
Bernard CHAMBON
Centre de Calcul de l’IN2P3, Lyon - France
février 2012
0<+>0
Sommaire
Rappel
MPI +
GE
Annexes
Rappel
• MPI
• Configuration du cluster
• Spécificité de notre environnement
• Qui sont nos utilisateurs
MPI avec GridEngine
• Cas d’OpenMPI
• Cas MPICH2
• Cas MPI-Intel
Annexes
0<+>0
Rappel
MPI +
GE
Annexes
Rappel sur MPI
Message Passing Interface
Norme pour exploiter machines à mémoire partagée ou distribuées
Succès de MPI dû à portabilité et performance
Langage : C/C++ et Fortran
MPI-2 (depuis 1997)
Implémentations
OpenMPI
MPICH2, MVAPICH2 (pour infiniband) : Argonne National Laboratory
MPI-Intel
A propos d’OpenMP
Open Multi Processing = pour machines à mémoire partagée
Une même machine au CC, on tombe alors dans le cas des jobs dit "multicores"
(mais des utilisateurs souhaitent mixer du MPI avec du OpenMP : ex Planck)
0<+>0
Rappel
MPI +
GE
Annexes
Rappel de la configuration du cluster
Configuration machines (janvier 2012)
16 processors (2 CPU, 8 cores), Xeon E5540 @ 2.53GHz, 48 GB ram, 2 interfaces
réseau 1|10 Gb/s
Cluster de 64 machines ⇒ 1024 cores (=1024 slots)
Configuration réseau
2 interfaces réseau : ccwpge00[01-64] (1Gb/s) et ccwpge00[01-64]p (10Gb/s)
Le 2eme interface est dédié au besoins du calcul ; non accessible au ssh, GE n’en
a pas la connaissance
Disponibilité
Via GridEngine uniquement et en mode batch (pas d’accès interactif)
Réservé aux utilisateurs autorisés (autorisation via GE)
En mode "tight integration" (détaillé plus loin)
Instance de GE
Une seule instance de GridEngine pour les jobs séquentiels, parallèles, interactifs
0<+>0
Rappel des spécificités au CC
1/2
Rappel
MPI +
GE
Annexes
Token AFS
Les jobs parallèles doivent disposer d’un token AFS, y compris pour les tâches
esclaves
Cette demande est implicitement satisfaite, lorsqu’on est en mode tight
integration, ce qui est notre cas.
Redirection des stdout | stderr
Le mécanisme de redirection de l’écriture des sdtout|err localement au worker
n’est pas actif 1
En conséquence, les sdtout|err des jobs sont écrits, en cours d’exécution, dans
$HOME de l’utilisateur (si rien n’est spécifié), ou dans le répertoire ad-hoc
suivant les options -wd | -cwd | -o | -e | -j
1. Les prolog|epilog (intègrent ce mécanisme), non déployés sur les WNs parallèles, pcq WNs esclaves
0<+>0
Rappel des spécificités au CC
2/2
Rappel
MPI +
GE
Annexes
Espace ’scratch’ ($TMPDIR)
Pour la même raison 1 que précédemment, le mécanisme de contrôle, par quota,
de l’espace scratch n’est pas disponible
En conséquence l’espace disque $TMPDIR est de taille non limitée
$TMPDIR est accessible partout (WN maitre et esclave).
Accès à l’espace semi-permanent (/sps)
Contrôle inhibé pour cause d’absence d’epilog 1
⇒ /sps disponible sans condition sur les WNs parallèles (ccwpgeX)
Autre ?
1. Les prolog|epilog (intègrent ce mécanisme), non déployés sur les WNs parallèles, pcq WNs esclaves
0<+>0
Rappel des spécificités liées à GridEngine
Expression en CPU, mémoire, complex de régulation, queues d’exécution
Rappel
MPI +
GE
Annexes
CPU, mémoire et complex de régulation
L’expression en CPU et mémoire ne doit pas intégrer le nombre de tâches.
L’espace scratch $TMPDIR n’est pas limité
L’expression en complex de régulation ne doit pas intégrer le nombre de tâches,
mais la comptabilité GE (visible par qquota) en tient compte
Pour plus de détail :
http://cc.in2p3.fr/JobsMulticoresEtParalleles
Queues et objets parallèles(=PE)
Queue parallèles : pa_short | medium | long
associées aux multiples PE openmpi | mpich2 | mpiintel
⇒ spécification, à la soumission, de l’objet PE et de la queue
Les jobs tournent sur des ccwpgeX (p = parallèle)
Ex : qsub -pe mpich2 16 -q pa_short ...
Queue multicores : mc_short | medium | long | longlasting
associées au PE multicores
Objet PE uniquement pour l’allocation des slots, les jobs tournent sur des
ccwsgeX (S = séquentiel)
Spécification de la queue ET de l’objet PE à la soumission
Ex : qsub -pe multicores 16 -q mc_short ...
0<+>0
Nos utilisateurs
Rappel
MPI +
GE
Annexes
Plank et Qcd :
besoin = centaines de coeurs
Qcd : mpiintel
Plank : openmpi et openMP+openmpi
Autres groupes
Strasbourg, Subatech (ou Dchooz) : mpich2
Cral : mpich2, openmpi maintenant
Besoin en multicores
BQS : parallèle@Pistoo → GE : multicores@ccwsgeX
Autres besoins en multicores
Besoins de machines, en exclusivité, pour cms, lhcb, atlas
(queues multicores sur des hostgroups)
1. Infos de Rachid - merci
0<+>0
Les implémentations disponibles au CC
Rappel
MPI +
GE
Annexes
OpenMPI
Version 1.4.2 : facile
MPICH2
Version courante = 1.0.8p1 : délicat
Nouvelle version 1.4.1p1 (framework hydra) : plus facile
MPI-Intel
Version courante 3.0 en 32 bits (bin/) et 64 bits (bin64/) : La voie est tracée...
Version 4.x (framework hydra ?) : devrait être facile
0<+>0
Rappel
MPI +
GE
Annexes
OpenMPI en mode manuel : Syntaxe
Lancement "manuel" entre 2 machines (ccwpge0061 | 62)
Worker maitre
>more /tmp/machines
ccwpge0061 slots=1
ccwpge0062 slots=3
> mpiexec --machinefile /tmp/machines -launch-agent /usr/local/openmpi/bin/orted
> bchambon@ccwpge0062’s password: ...
(Session ssh sur ccwpge0062 pour lancement de orted)
-np 4 bin/advance_test (*)
> ps -e f -o user,pid,ppid,command
bchambon 18866 18865 |
\_ -tcsh
bchambon 8109 18866 |
\_ mpiexec --machinefile /tmp/machines -launch-agent /usr/local/openmpi/bin/orted
bchambon 8112 8109 |
\_ bin/advance_test
(*)
Nécessité de positionner
LD_LIBRARY_PATH (à /usr/local/openmpi/lib) dans un
.profile | .cshrc
Worker esclave
> ps -e f -o user,pid,ppid,command
bchambon 15796
1 /usr/local/openmpi/bin/orted --daemonize -mca ess env -mca orte_ess_jobid 1225654272 -mca orte_es
bchambon 15797 15796 \_ bin/advance_test
bchambon 15798 15796 \_ bin/advance_test
bchambon 15799 15796 \_ bin/advance_test
0<+>0
OpenMPI en mode manuel : débit réseau
Avec mpiexec --mca btl_tcp_if_include eth0 --machinefile ...
Rappel
MPI +
GE
Annexes
> dstat -n -N eth0,eth2
--net/eth0- --net/eth2recv send: recv send
1323k 118M:
0
0
1321k 118M:
0
0
1321k 118M:
0
0
On "sature" l’interface eth0, 1Gb/s
Avec mpiexec --mca btl_tcp_if_include eth2 --machinefile ... > /dev/null
> dstat -n -N eth0,eth2
--net/eth0- --net/eth2recv send: recv send
19k 4046B:2287k 1064M
19k 3936B:2302k 1064M
19k 3634B:2296k 1064M
16k
57k:2315k 1063M
On "sature" l’interface eth2, 10Gb/s
Sans précision particulière : avec mpiexec --machinefile ... > /dev/null
> dstat -n -N eth0,eth2
--net/eth0- --net/eth2recv send: recv send
1289k 118M: 251k 121M
1295k 118M: 244k 115M
1290k 118M: 258k 118M
Les deux interfaces sont utilisés, pour un max de ∼240MB/s
120 (eth0 saturé) + 120 (eth2 symétrique de eth0 ?) : à comprendre
0<+>0
Rappel
MPI +
GE
Annexes
OpenMPI dans GridEngine
Disponibilité en tight intégration
Le support de Grid Engine est intégré à OpenMPI (v >= 1.2), par compilation
avec l’option "–with-sge"
En conséquence l’objet PE est très simple
l’objet PE (à commenter)
>qconf -sp openmpi
pe_name
slots
user_lists
xuser_lists
start_proc_args
stop_proc_args
allocation_rule
accounting_summary
...
openmpi
1024
NONE
NONE
/bin/true
/bin/true
round_robin
FALSE
Exécution du code
Après positionnement des diverses var. d’env. l’exécution du code se fait par :
mpiexec
-n $NSLOTS ./bin/atest
Choix de réseau (infiniband | tcp) et l’interface (eth0 | eth2) via les paramètres
MCA (Modular Component Architecture )
Ex : mpiexec –mca btl_tcp_if_include eth2 ...
Exemples avec visualisation des processus
0<+>0
OpenMPI dans GridEngine : hiérarchie des process
Worker maitre
Rappel
MPI +
GE
Annexes
> ps -e f -o user,ppid,pid,pgrp,command
root
1 6531 6531 /opt/sge/bin/lx24-amd64/sge_execd
root
6531 6579 6531 \_ /bin/sh /usr/bin/load.sh
root
6531 14669 14669 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
root
14669 14723 14669
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
bchambon 14669 14725 14725
\_ /bin/ksh /var/spool/sge/ccwpge0003/job_scripts/1031421
bchambon 14725 14727 14725
\_ /usr/local/openmpi/bin/mpiexec --mca btl ^udapl,openib --mca btl_tcp_if_include
...
bchambon 14727 14755 14725
\_ /opt/sge/bin/lx24-amd64/qrsh -inherit -nostdin -V ccwpge0008.in2p3.fr set
bchambon 14727 14756 14725
\_ /opt/sge/bin/lx24-amd64/qrsh -inherit -nostdin -V ccwpge0009.in2p3.fr set
bchambon 14727 14824 14725
\_ ./bin/atest
bchambon 14727 14825 14725
\_ ./bin/atest
Worker esclave
root
root
root
bchambon
bchambon
bchambon
bchambon
1
6137
16060
16060
16076
16083
16252
6137
16060
16075
16076
16083
16252
16253
6137 /opt/sge/bin/lx24-amd64/sge_execd
16060 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
16060
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
16076
\_ /opt/sge/utilbin/lx24-amd64/qrsh_starter /var/spool/sge/ccwpge0009/active_jobs/1031
16083
\_ tcsh -c set path = ( /usr/local/openmpi/bin $path ) ; if ( $?LD_LIBRARY_PATH =
16083
\_ /usr/local/openmpi/bin/orted -mca ess env -mca orte_ess_jobid 2186543104 -m
16083
\_ ./bin/atest
A noter
Les process sont tous rattachés au shepherd (⇒ tight integration)
La disponibilité des tokens AFS est assuré implicitement (coshepherd)
Unicité du process groupID
Le qrsh -inherit ...
0<+>0
Rappel
MPI +
GE
Annexes
MPICH2 dans GridEngine
Avec la version courante du CC (=1.0.8x)
Nécessite le lancement préalable d’un env. d’exécution (daemon mpd)
Cette opération peut se faire via mpdboot, script dans lequel on peut passer en
paramètre un fichier de machines et une "rsh" commande
C’était la solution adopté dans BQS, (on avait défini un bqsrsh = rsh unix avec
obtention d’un token AFS (qtoken load))
Cette séquence était spécifiée dans le script de l’utilisateur (BQS fournissant les
fichiers de machines)
mpdboot -f machinefile --rsh=bqsrsh
mpiexec -f machinefile ...
mpdallexit
GridEngine fonctionne différemment, à savoir :
Le lancement du contexte d’exécution est réalisé dans le startup de l’objet PE
(n’est à faire dans le job)
Il est possible de demander l’exécution d’une remote commande via qrsh -inherit,
qui à pour atout d’associer la tâche remote à la hiérarchie des process d’un job,
sur WN esclave, pour tight intégration
qrsh -inherit hostname command
Utilisation de mpd
On va donc utiliser, non pas mpdboot, mais directement la commande mpd et
sans oublier de préciser l’interface réseau utilisé (–ifhn)
0<+>0
MPICH2 dans GridEngine
Exemple de lancement "manuel" entre 2 machines (ccwpge0001 | 02)
Rappel
MPI +
GE
Annexes
ccwpge0001
①
> mpd --ifhn=ccwpge0001 --daemon --echo
mpd_port=60438
> mpdtrace -l
ccwpge0001_60438 (134.158.175.1)
ccwpge0002
②
> mpd -h ccwpge0001 -p 60438 --ifhn=ccwpge0002 --daemon
mpd_port=58581
> mpdtrace -l
ccwpge0002_58581 (134.158.175.2)
ccwpge0001_60438 (134.158.175.1)
③
> mpdtrace -l
ccwpge0001_60438 (134.158.175.1)
ccwpge0002_58581 (134.158.175.2)
④
>more /tmp/machines
ccwpge0001:1 ifhn=ccwpge0001
ccwpge0002:1 ifhn=ccwpge0002
>mpiexec -machinefile /tmp/machines -n 2 ./bin/atest
We will exchange a buffer of 10 MB
Let’s iterate once again, master_iter = 10
Let’s iterate once again, slave_iter = 10
⑤
>dstat -n -N eth0,eth2
--net/eth0- --net/eth2recv send: recv send
0
0 :
0
0
117M 838k:
0
0
117M 1272k:
0
0
117M 1322k:
0
0
117M 1270k:
0
0
117M 1040k:
0
0
Table 1: Lancement manuel d’un code mpich2
0<+>0
MPICH2 dans GridEngine
Maintenant qu’on sait ce qu’il faut faire, on va pouvoir :
Rappel
MPI +
GE
Annexes
Définir comment le faire
Avec l’aide de "qrsh -inherit", on va intégrer la séquence des commandes
mpd --ifhn ; mpdtrace -l (master), puis mpd -h -p --ifhn (slave) dans un script
Ce sera startmpich2.sh, exécuté au startup de l’objet PE
Définir un objet PE
>qconf -sp mpich2
pe_name
start_proc_args
stop_proc_args
mpich2
/usr/local/products/sge/mpich2_mpd/startmpich2.sh
/usr/local/products/sge/mpich2_mpd/stopmpich2.sh
$pe_hostfile
...
Notez la disponibilité du fichier de machines via la pseudo variable $pe_hostfile
Plus en détail
startmpich2.sh utilise une commande qui invoque le rsh de GE
Plus précisement
execvp /usr/local/products/sge/mpich2\_mpd/rsh
Avec /usr/local/products/sge/mpich2_mpd/rsh :
$SGE_ROOT/bin/$ARC/qrsh -inherit -V -nostdin $rhost $cmd
En pratique
Ce travail a été fait et est opérationnel, y compris pour utiliser le 2eme interface
(voir annexe pour la syntaxe des commandes et le format du fichier de machines)
0<+>0
MPICH2 dans GridEngine : Hiérarchie des process
Worker maitre (ccwpge0015)
Rappel
MPI +
GE
Annexes
> ps -e f -o user,ppid,pid,pgrp,command
root
1 6119 6119 /opt/sge/bin/lx24-amd64/sge_execd
root
6119 23105 23105 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
root
23105 23118 23105
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
bchambon 23105 23119 23119
\_ /opt/sge/utilbin/lx24-amd64/qrsh_starter /var/spool/sge/ccwpge0015/active_jobs/1130
bchambon 23119 23128 23128
\_ tcsh -c mpd --ifhn=ccwpge0015p
bchambon 23128 23295 23128
\_ python2.4 mpd --ifhn=ccwpge0015p
bchambon 23295 23380 23380
\_ python2.4 mpd --ifhn=ccwpge0015p
bchambon 23380 23383 23383
|
\_ ./bin/atest
bchambon 23295 23381 23381
\_ python2.4 mpd --ifhn=ccwpge0015p
bchambon 23381 23382 23382
\_ ./bin/atest
bchambon
1 23097 23029 qrsh -inherit -V ccwpge0015 mpd --ifhn=ccwpge0015p
bchambon
1 23300 23029 qrsh -inherit -V ccwpge0011 mpd -h ccwpge0015 -p 48312 --ifhn=ccwpge0011p
bchambon
1 23302 23029 qrsh -inherit -V ccwpge0012 mpd -h ccwpge0015 -p 48312 --ifhn=ccwpge0012p
Worker esclave (ccwpge0026)
root
root
root
bchambon
bchambon
bchambon
bchambon
bchambon
bchambon
bchambon
1
6023
4506
4506
4519
4526
4695
4698
4695
4699
6023
4506
4518
4519
4526
4695
4698
4700
4699
4701
6023 /opt/sge/bin/lx24-amd64/sge_execd
4506 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
4506
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
4519
\_ /opt/sge/utilbin/lx24-amd64/qrsh_starter /var/spool/sge/ccwpge0026/active_jobs/1130
4526
\_ tcsh -c mpd -h ccwpge0015 -p 48312 --ifhn=ccwpge0026p
4526
\_ python2.4 mpd -h ccwpge0015 -p 48312 --ifhn=ccwpge0026p
4698
\_ python2.4 mpd -h ccwpge0015 -p 48312 --ifhn=ccwpge0026p
4700
|
\_ ./bin/atest
4699
\_ python2.4 mpd -h ccwpge0015 -p 48312 --ifhn=ccwpge0026p
4701
\_ ./bin/atest
A noter
Les process sont rattachés au shepherd (⇒ tight integration)
Attention aux qrsh -inherit en mode orphelin
Attention aux process group ID différents pour les process mpd
0<+>0
Rappel
MPI +
GE
Annexes
MPICH2 dans GridEngine : Tout baigne ou presque...
Multiplicité des process group ID des daemons mpd
Conséquence avec qdel (KILL -9 -pgrp)
Parade par mise en oeuvre d’un script en "terminate method" (basé sur le
additionnal groupID)
car, au fait, le additionnal groupID non opérationnel avec les tâches lancées par
qrsh, quelle poisse !...
Process utiles en fils de 1
Chasse aux zombies adaptée avec filtrage sur pattern "qrsh -inherit"
Stabilité des process mpd : long à solutionner...
Il est apparu des soucis d’instabilité des process mpd, en cours d’exécution du job
Problèmes rencontrés par nos utilisateurs et confirmés par nos essais
L’instabilité apparaissait plus ou moins rapidement selon le nombre de tâches
demandées (mais à priori pas selon le nombre de machines)
message d’erreur typique :
cwpge0026_39438 (reenter_ring 825): reenter_ring rc=0 after numTries=1
ccwpge0026_39438 (handle_rhs_input 1098): back in ring
...
ccwpge0001_48492 (handle_lhs_challenge_response 1052): INVALID msg for lhs response msg=:{}:
ccwpge0017_49314 (connect_rhs 973): invalid challenge from 134.158.175.30 39759: {}
ccwpge0017_49314 (enter_ring 868): rhs connect failed
ccwpge0026_39438 (handle_rhs_input 1093): lost rhs; re-entering ring
ccwpge0026_39438 (connect_lhs 916): bad generation from lhs; lhsgen=2 mygen=3
ccwpge0026_39438 (enter_ring 855): lhs connect failed
Solution : le framework hydra
0<+>0
Rappel
MPI +
GE
Annexes
MPICH2 dans GridEngine : Le framework Hydra
Présentation
Framework d’exécution qui jette aux oubliettes le daemon mpd
Ce framework intègre de nombreux ressources managers dont GridEngine, cool !
Compilation et installation de mpich2 1.4.p1 (hydra : mpich2 1.2, je crois)
⇒ Simplification
L’objets PE est simplifié à l’extrême, les scripts pe_start | stop ne sont plus
nécessaire (modèle identique à OpenMPI)
Choix du RM par l’option -rmk (RM Kernel)
Choix de l’interface réseau -iface
Pas nécessaire de spécifier le fichier de machines (-f machinefile)
Ex : mpiexec -rmk sge -iface eth2 ./bin/advance_test
Compilation et disponibilité
Version mpich2 1.4.1p1 installée
Mise à disposition de /usr/local/mpich2/hydra/ (compilé avec gcc, -O2, -m64)
(Procédure décrite dans le elog de GE)
Essai en mode manuel et à travers Grid Engine
0<+>0
MPICH2 - Hydra : mode manuel (connexion ssh)
sur le WN maître (ccwpge0061)
Rappel
MPI +
GE
Annexes
>more /tmp/machines
ccwpge0061:1
ccwpge0062:5
>mpiexec -verbose -f /tmp/machines -iface eth2 -n 6 bin/advance_test
>ps ...
\_ mpiexec -verbose -f /tmp/machines -iface eth2 -n 6 bin/advance_test
\_ /afs/in2p3.fr/home/b/bchambon/mpich2-1.4/bin/hydra_pmi_proxy --control-port 10.158.175.61:44699 --debug --rmk
|
\_ bin/advance_test
\_ /usr/bin/ssh -x ccwpge0062 "/afs/in2p3.fr/home/b/bchambon/mpich2-1.4/bin/hydra_pmi_proxy" --control-port 10.15
sur le WN esclave (ccwpge0062)
> ps ...
\_ tcsh -c "/afs/in2p3.fr/home/b/bchambon/mpich2-1.4/bin/hydra_pmi_proxy" --control-port 10.158.175.61:44699 --debug \_ /afs/in2p3.fr/home/b/bchambon/mpich2-1.4/bin/hydra_pmi_proxy --control-port 10.158.175.61:44699 --debug --rmk
\_ bin/advance_test
\_ bin/advance_test
\_ bin/advance_test
\_ bin/advance_test
\_ bin/advance_test
Débit réseau (sur ccwpge0061)
> dstat -n -N eth0,eth2
--net/eth0- --net/eth2recv send: recv send
4825B 110k:2021k 994M
1026B
32k:2041k 1007M
1382B
28k:2035k 1002M
630B
28k:2039k 1004M
1102B
27k:2035k 1001M
0<+>0
MPICH2 - Hydra : mode batch (= via GridEngine)
Worker maitre (ccwpge0062)
> ps -e f -o user,ppid,pid,pgrp,command
Rappel
MPI +
GE
Annexes
root
root
root
bchambon
bchambon
bchambon
bchambon
bchambon
bchambon
...
1
6079
7952
7952
7967
7968
7969
7968
7968
6079
7952
7965
7967
7968
7969
7977
7970
7971
6079 /opt/sge/bin/lx24-amd64/sge_execd
7952 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
7952
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
7967
\_ /bin/ksh /var/spool/sge/ccwpge0062/job_scripts/1720021
7967
\_ mpiexec -rmk sge -iface eth2 -n 8 ./bin/advance_test
7967
\_ /afs/in2p3.fr/home/b/bchambon/mpich2-1.4/bin/hydra_pmi_proxy --control-port
7967
|
\_ ./bin/advance_test
7967
\_ /opt/sge/bin/lx24-amd64/qrsh -inherit -V ccwpge0061.in2p3.fr "/afs/in2p3.fr
7967
\_ /opt/sge/bin/lx24-amd64/qrsh -inherit -V ccwpge0033.in2p3.fr "/afs/in2p3.fr
Worker esclave (ccwpge0033)
> ps -e f
root
root
root
bchambon
bchambon
bchambon
bchambon
-o user,ppid,pid,pgrp,command
1 6092 6092 /opt/sge/bin/lx24-amd64/sge_execd
6092 7532 7532 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
7532 7544 7532
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
7532 7545 7545
\_ /opt/sge/utilbin/lx24-amd64/qrsh_starter /var/spool/sge/ccwpge0033/active_jobs/1720
7545 7552 7552
\_ tcsh -c "/afs/in2p3.fr/home/b/bchambon/mpich2-1.4/bin/hydra_pmi_proxy" --contro
7552 7720 7552
\_ /afs/in2p3.fr/home/b/bchambon/mpich2-1.4/bin/hydra_pmi_proxy --control-port
7720 7721 7552
\_ ./bin/advance_test
A noter
Belle hiérarchie de process (on est bien en tight integration)
Plus de process orphelin
Unicité du process group ID
La partie est gagnée ou presque...
0<+>0
Rappel
MPI +
GE
Annexes
MPICH2 - Hydra : Stabilité (=f(numTasks))
1/2
Il est apparu un soucis, avec fréquence d’erreur liée aux nombre de tâches
¿ MPICH2 ?, compilation ?, configuration ?
Mode batch
Tests sur 10 jobs (5000 itérations par job), avec successivement 16, 32, 48 et 64
tâches
nombre de tâches
16
32
48
64
taux d’échec (x/10)
0
0
6/10
7/10
Table 2: Stabilité suivant le nombre de tâches
Message d’erreur typique :
pmiserv\_cb.c:215 : assert (!closed) failed
mpiu\_shm\_wrappers.h at line 889: seg\_sz > 0
Mode manuel
Soucis transposé en un bout de code manuel ⇒ soucis ssi ≥ 153 tâches !
>mpiexec -np 153 bin/advance_test
Assertion failed in file /scratch/BC/mpich2-1.4.1p1/src/util/wrappers/mpiu_shm_wrappers.h at line 889: seg_sz > 0
internal ABORT - process 0
[proxy:0:0@ccwpge0061] send_cmd_downstream (./pm/pmiserv/pmip_pmi_v1.c:80): assert (!closed) failed
[proxy:0:0@ccwpge0061] fn_get (./pm/pmiserv/pmip_pmi_v1.c:349): error sending PMI response
[proxy:0:0@ccwpge0061] pmi_cb (./pm/pmiserv/pmip_cb.c:327): PMI handler returned error
[proxy:0:0@ccwpge0061] HYDT_dmxu_poll_wait_for_event (./tools/demux/demux_poll.c:77): callback returned error status
0<+>0
MPICH2 - Hydra : Stabilité (=f(numTasks))
2/2
Rappel
MPI +
GE
Annexes
Travail avec la liste : mpich-discuss
De nombreux essais et beaucoup de temps passé ... jusqu’à :
Obtention d’un patch réglant un soucis relatif à l’allocation des segments de
mémoire partagée ⇒ suppression du problème lié aux nombres de tâches
Pointage d’un autre soucis lié à l’utilisation de -iface ⇒ deuxième patch de
correction (+ rapide), ouf !
Essais avec un grand nombre de slots
Testé avec plusieurs centaines de tâches, pendant plusieurs heures ⇒ ok
Essais via le code des utilisateurs
En cours depuis 23 janvier. Avis de Rachid ?
Conclusion
Mpich2 1.4p1 devient la version courante
Complètement "intégré" à Grid Engine, comme avec d’autres RM
0<+>0
Rappel
MPI +
GE
Annexes
MPI-Intel en mode manuel
Avec la version courante du CC (=3.0)
N’est pas intégrée avec GridEngine
Lancement analogue au modèle défini pour MPICH2 v1.x (NON hydra)
Voir annexe pour détails de syntaxe (et mesure débit réseau eth0 | eth2)
Transcription en script associé au pe_start de l’objet PE
>qconf -sp mpiintel_eth0
pe_name
mpiintel_eth0
start_proc_args
/usr/local/products/sge/mpiintel/startmpiintel.sh \
-catch_rsh $pe_hostfile /usr/local/intel/mpi/3.0/
stop_proc_args
...
allocation_rule
$round_robin
Attention
Le choix de l’interface (eth0 | eth2) est fait au lancement de mpd
⇒ définition de deux objets PE : mpiintel_eth0 | _eth2
⇒ Le choix de l’interface se fait au moment du qsub (et non pas dans le script)
Exécution du code
mpiexec -machinefile $TMPDIR/machines -n $NSLOTS
./bin/atest
Nécéssité d’avoir un fichier mpd.hosts (même vide)
Utiliser python 2.4 (2.6 génère des warning de depreciation)
0<+>0
MPI-Intel dans GridEngine : Hiérarchie des process
Worker maitre (ccwpge0061)
Rappel
MPI +
GE
Annexes
> ps -e f -o user,ppid,pid,pgrp,command
root
1 8681 8681 /opt/sge/bin/lx24-amd64/sge_execd
root
8681 23495 23495 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
root
23495 23509 23495
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
bchambon 23495 23510 23510
\_ /opt/sge/utilbin/lx24-amd64/qrsh_starter /var/spool/sge/ccwpge0062/active_jobs/5481
bchambon 23510 23519 23519
\_ tcsh -c /usr/local/intel/mpi/3.0//bin/mpd --ifhn=ccwpge0062
bchambon 23519 23688 23519
\_ /usr/local/bin/python -W ignore::DeprecationWarning /usr/local/intel/mpi/3.
bchambon 23688 23723 23723
\_ /usr/local/bin/python -W ignore::DeprecationWarning /usr/local/intel/mp
bchambon 23723 23756 23756
|
\_ bin/advance_test
bchambon 23688 23724 23724
\_ /usr/local/bin/python -W ignore::DeprecationWarning /usr/local/intel/mp
bchambon 23724 23741 23741
|
\_ bin/advance_test
...
bchambon
1 23487 23461 /opt/sge/bin/lx24-amd64/qrsh -inherit -V ccwpge0062 /usr/local/intel/mpi/3.0//bin/mpd --ifh
bchambon
1 23697 23461 /opt/sge/bin/lx24-amd64/qrsh -inherit -V ccwpge0061 /usr/local/intel/mpi/3.0//bin/mpd -h cc
Worker esclave (ccwpge0062)
> ps -e f -o user,ppid,pid,pgrp,command
root
1 18110 18110 /opt/sge/bin/lx24-amd64/sge_execd
root
18110 22378 22378 \_ /opt/sge/bin/lx24-amd64/sge_shepherd -bg
root
22378 22391 22378
\_ /opt/sge/bin/lx24-amd64/sge_coshepherd /opt/sge/util/set_token_cmd bchambon 172800
bchambon 22378 22392 22392
\_ /opt/sge/utilbin/lx24-amd64/qrsh_starter /var/spool/sge/ccwpge0061/active_jobs/5481
bchambon 22392 22399 22399
\_ tcsh -c /usr/local/intel/mpi/3.0//bin/mpd -h ccwpge0062 -p 38948 --ifhn=ccwpge0
bchambon 22399 22569 22399
\_ /usr/local/bin/python -W ignore::DeprecationWarning /usr/local/intel/mpi/3.
bchambon 22569 22580 22580
\_ /usr/local/bin/python -W ignore::DeprecationWarning /usr/local/intel/mp
bchambon 22580 22599 22599
|
\_ bin/advance_test
bchambon 22569 22581 22581
\_ /usr/local/bin/python -W ignore::DeprecationWarning /usr/local/intel/mp
bchambon 22581 22600 22600
|
\_ bin/advance_test
A noter
Les process sont rattachés au shepherd (⇒ tight integration)
Attention aux qrsh -inherit en mode orphelin et aux process group ID différents
0<+>0
MPI-Intel dans GridEngine : Conclusion
Rappel
MPI +
GE
Annexes
La version courante (=3.0), disponible via Grid Engine
Testée rapidement, et jusqu’à 256 slots, sur les deux interfaces
Garder en mémoire les problématiques
des process orphelins (chasse aux zombie avec filtrage sur pattern "qrsh -inherit")
des process groupID différents (script de nettoyage en terminate_method)
Version 4.x
Semble intégrer le framework Hydra qui apporte l’intégration avec GE
Besoins ?
Licence ?
0<+>0
Rappel
MPI +
GE
Annexes
Conclusion générale
Disponibilités
Les 3 implémentations disponibles au CC sont dispo via Grid Engine
Vérification faite de l’utilisation du 2eme interface
Pour continuer à explorer...
Job2core binding
Checkpoint
Ces 2 points déjà explorés avec les jobs séquentiels
Merci à Mattieu, Rachid, Suzanne
Visualisation des jobs parallèles
https://cctools.in2p3.fr/astreinte/GE/JobsSummary/RJS.xml
Démo ?
Exemple de construction d’une image (1024x1024) calculée via povray
De �1h si calcul monocoeur à �60 s (tâche la plus longue) si découpage en 256
tranches (tâches)
Nombre de tâches
Plus longue tâche (⇒ durée du job)
1
3700
32
226
64
130
128
91
256
63
Table 3: Evolution de la durée (s) de la plus longue tâche, en fonction du nombre de tâches
0<+>0
Annexes
Rappel
MPI +
GE
Annexes
Lancement manuel d’un code MPICH2 utilisant le deuxième interface (eth2)
Lancement manuel d’un code MPI-Intel utilisant le premier interface (eth0)
Lancement manuel d’un code MPI-Intel utilisant le deuxième interface (eth2)
Memo MPI-Intel
Autres essais
0<+>0
MPICH2 et eth2
Lancement "manuel" d’un code mpich2 utilisant le 2eme interface réseau
Rappel
MPI +
GE
Annexes
ccwpge0061
ccwpge0062
> mpd --ifhn=ccwpge0061p --daemon --echo
mpd_port=50712
>mpdtrace -l
ccwpge0062_56112 (10.158.175.62)
> mpd -h ccwpge0061 -p 50712 --ifhn=ccwpge0062p --daemon
mpd_port=56112
>mpdtrace -l
ccwpge0062_56112 (10.158.175.62)
ccwpge0061_50712 (10.158.175.61)
>mpdtrace -l
ccwpge0061_50712 (10.158.175.61)
ccwpge0062_56112 (10.158.175.62)
>more machines.eth2
(*)
ccwpge0061p:1 ifhn=ccwpge0061p
ccwpge0062p:1 ifhn=ccwpge0062p
> mpiexec -machinefile /tmp/machines.eth2 -n 2 bin/atest
(*)
Prêter attention au format du fichier machines.eth2
(doit contenir les noms de machines en ’p’)
>dstat -n -N eth0,eth2
--net/eth0- --net/eth2recv send: recv send
0
0 :
0
0
844B
23k: 968M 1912k
402B
24k: 967M 1912k
70B
67k: 968M 1914k
134B
24k: 968M 1914k
503B
21k: 968M 1914k
Table 4: mpich2 utilisant le 2eme interface réseau (10Gb/s)
0<+>0
MPI-Intel et eth0
Lancement "manuel" d’un code mpi-intel utilisant le 1er interface réseau
Rappel
MPI +
GE
ccwpge0061
ccwpge0062
>mpd --daemon --echo
mpd_port=34340
>mpdtrace -l
ccwpge0061_34340 (134.158.175.61)
>mpd -h ccwpge0061 -p 34340 --daemon --echo
mpd_port=34434
>mpdtrace -l
ccwpge0062_34434 (134.158.175.62)
ccwpge0061_34340 (134.158.175.61)
Annexes
>mpdtrace -l
ccwpge0061_34340 (134.158.175.61)
ccwpge0062_34434 (134.158.175.62)
>more /tmp/machines
ccwpge0061:1
ccwpge0062:1
>mpiexec -machinefile /tmp/machines
>mpdallexit
-n 2 bin/atest
>dstat -n -N eth0,eth2
--net/eth0- --net/eth2recv send: recv send
117M 2115k:
0
0
116M 2107k:
0
0
116M 2098k:1088B 0
116M 2105k:
0
0
116M 2099k:
0
0
>mpdallexit
Table 5: mpi-intel utilisant le 1er interface réseau (1Gb/s)
0<+>0
MPI-Intel et eth2
Lancement "manuel" d’un code mpi-intel utilisant le 2eme interface réseau
Rappel
MPI +
GE
ccwpge0061
ccwpge0062
>mpd --ifhn=ccwpge0061p --daemon --echo
mpd_port=41843
>mpdtrace -l
ccwpge0061_41843 (10.158.175.61)
>mpd -h ccwpge0061 -p 41843 --ifhn=ccwpge0062p --daemon --echo
mpd_port=55445
Annexes
>mpdtrace -l
ccwpge0062_55445 (10.158.175.62)
ccwpge0061_41843 (10.158.175.61)
>mpdtrace -l
ccwpge0061_41843 (10.158.175.61)
ccwpge0062_55445 (10.158.175.62)
>more /tmp/machines
ccwpge0061:1
ccwpge0062:1
(*)
>mpiexec -machinefile /tmp/machines
-n 2 bin/atest (*)
(*)
L’adressage de la 2eme carte réseau se fait au moment
du lancement des process mpd
mpd lancé dans le PE_start de GE,
donc choix fait via le PE (qsub -pe ...)
>dstat -n -N eth0,eth (*)
--net/eth0- --net/eth2recv send: recv send
768B 718B:1049M 2249k
134B 134B:1049M 2250k
262B 134B:1049M 2249k
346B 366B:1049M 2250k
292B 134B:1049M 2250k
>mpdallexit
>mpdallexit
Table 6: mpi-intel utilisant le 2eme interface réseau (10Gb/s)
0<+>0
MPI-Intel : Memo
Fichier $HOME/.mpd.conf
Nécessaire seulement pour le daemon mpd, son format :
Rappel
MPI +
GE
Annexes
> more ~/.mpd.conf
secretword=xxxx
Fichier devenu inutile avec hydra
Fichier mpd.hosts
Au moins en mode manuel, Il semble indispensable d’avoir un fichier mpd.hosts
(même vide = touch mpd.hosts), car sinon
>mpiexec ...
unable to open (or read) hostsfile mpd.hosts
et malgré ce qui est dit la doc MPI Intel :
The file $PWD/mpd.hosts will be used by default if it is present. If there is no
host file, the mpdboot command will start one MPD daemon on the local
machine.
Version de python
Python 2.6 génere des warning de dépreciation
DeprecationWarning: The popen2 module is deprecated.
Use the subprocess module. /usr/local/intel/mpi/3.0/bin/mpdlib.py:38:
DeprecationWarning: the md5 module is deprecated; use hashlib instead
from md5 import new as md5new
Utiliser python 2.4 ⇒ ok
0<+>0
Rappel
MPI +
GE
Annexes
Autres essais
Disponibilité des tokens AFS sur master et slave,
Verif par l’exemple = ok
Expire à + 48h, conforme à la conf de GE
ccwpge0061 (master) User’s (AFS ID 1815) tokens for [email protected] [Expires Jan
11 13 :29]
ccwpge0062 (slave) User’s (AFS ID 1815) tokens for [email protected] [Expires Jan 11
13 :29]
Disponibilité des $TMDIR sur master et slave,
ccwpge0061 (master) TMPDIR = /scratch/4069706.1.pa_long
Existance réelle ? : oui jusqu’à la fin du script du job
> ls -l /scratch/ drwxr-xr-x 2 bchambon ccin2p3 6 Jan 9 13 :29
4069706.1.pa_long
ccwpge0062 (slave) TMPDIR = /scratch/4069706.1.pa_long
Existance réelle ? : oui tant que la tâche esclave existe
> ls -l /scratch/ drwxr-xr-x 2 bchambon ccin2p3 29 Jan 9 13 :29
4069706.1.pa_long

Documents pareils