1. INF442 : Traitement des donn´ees massives
A2 : Le regroupement plat et le regroupement hi´erarchique
Frank Nielsen
X2013
15 avril 2015
2. Administratif
dernier d´epˆot des TDs : le dimanche soir `a 23h59m59s suivant le
mercredi du TD
´election du d´el´egu´e de cours : ? ? ?
TD1 : ok, f´elicitations !
TD2 commence par l’exercice MPI du TD1.
tutorat langage C++ mis en place par la DE.
Deux cr´eneaux : le mardi et le jeudi de 18h `a 20h (Ivan Ustinov)
Voir les planches du memento C++ sous moodle
Rassurez-vous, TD 3 (d´etecteur de pourriels) et TD 4 (chiffrement de
Hill) sont bien moins copieux !
3. Projet informatique
responsable PIs : Claudia D’Ambrosio
dambrosio@lix.polytechnique.fr
3 choix pour le 20 avril 2015
PI valid´e le 23 avril 2015
Date de remise sous Moodle : ≤ 22 mai 2015
Soutenance PI : entre le 1er juin et le 12 juin 2015
Sujets/difficult´es (* : facile , ** : moyen, *** : difficile) :
442-1 * Lancer de rayon (image de synth`ese) S. Redon
442-2 * PageRank (matrices) P.L. Poirion
442-3 ** CASP : Assessment Protein Structure Prediction A. H´eliou
& P. Chassignet
442-4 ** Graphes & arbres recouvrants (most vital edge) S. Toubaline
442-5 *** D´etecteur de Viola Jones (vision) J.-B. Bordes
442-6 *** Repliement des prot´eines (biologie) P. Chassignet
442-7 ? Projet au choix, sujet `a r´ediger et valider ?
442-7 : Projet au choix en C++ (sans MPI) ´egalement possible.
4.
5. HPC : quelques cas pour le Super-Computing (SC)
HPC = on recherche l’ efficacit´e !
Utiliser des mod`eles pour de la simulation parce que sinon c’est
trop difficile `a construire (souffleries)
trop cher `a construire (crash d’avion/voiture)
trop lent `a attendre (´evolution du climat, galaxies)
trop dangereux (armes, drogues, pollutions, ´epid´emies)
Avoir des r´esultats rapides voire en ligne
on-line, incremental :
valeur temporelle du r´esultat (m´et´eo)
ˆetre le premier `a avoir le r´esultat (bourse, trading HFT)
ˆetre le premier `a avoir “une analyse” (incluant le coˆut de d´evelopement)
Donn´ees massives, le Big Data :
analyse du g´enome/d’une famille de g´enomes
recherche d’intelligence extraterrestre (SETI)
6. Acc´el´eration, efficacit´e et scalabilit´e
tseq : temps ´ecoul´e par le programme s´equentiel
tP : ... par programme parall`ele sur P proc.
t1 : ... par le programme parall`ele ex´ecut´e en s´equentiel, P = 1
bien sˆur, t1 ≥ tseq sinon on aurait un meilleur algo. s´equentiel
Acc´el´eration : speedup(P) =
tseq
tP
, souvent
tseq
tP
t1
tP
Efficacit´e : e(P) = speedup(P)
P =
tseq
P×tP
par rapport au speed-up lin´eaire, e(P) = 1 ⇔ tP =
tseq
P
Speed-up, efficiency
7. Loi d’Amdahl (1967) : un frein au parall´elisme ?
gain de performance id´eal :
α = fraction du code parall`elisable
αseq = fraction du code non-parall`elisable
avec αseq + α = 1
speedup(P) =
t1
tn
=
(αseq + α )t1
(αseq +
α
P )t1
=
1
αseq +
α
P
lim
P→∞
speedup(P) =
1
αseq
=
1
1 − α
⇒ acc´el´eration born´ee par la fraction de code αseq non-parall`elisable (celle
qui est intrins´equement s´equentielle)
9. Loi d’Amdahl : un exemple visuel pour concr´etiser
αseq = 20% et donc α = 80%
Temps
P = 1 P=2 P=4 P=8
S = 1 S = 5
3
S = 2
5
S = 10
3
S = 5
P → ∞
seq
par
...
lim
P→∞
speedup(P) =
1
αseq
=⇒ speedup ≤ ×5
Est-ce alors int´eressant d’avoir des grands clusters de machines ?
10. Loi de Gustafson : scale speed-up, `a la rescousse !
Simulation : taille des mailles d’une grille 2D/3D = fonction de P
Vid´eo : SD, HD, 4K, 8K, etc.
Concept = Charge de travail (workload) grandit lin´eairement avec P
n n’est pas fix´e ! (= cas d’Amdahl)
t1(P) = αseqtP + P × (α × tP)
speedupGustafson(P) = αseq + P × (1 − αseq)
Gustafson = parall´elisme de donn´ees
.
11. Loi de Gustafson : un exemple visuel
Loi de Gustafson : speedup(P) = αseq + P × α . scale speed-up
P = 1 P = 2 P = 4 P = 8
n 2n 4n 8n
temps
la taille des donn´ees n augmente
seq
par
speedup(P) = 0.2 + 0.8 × P
Parfois, en pratique, on obtient un speed-up super-lin´eaire (hyper-lin´eaire),
qui s’explique par le cache hi´erarchique des donn´ees
Pensez au cheminement complexe des donn´ees vers le processeur dans le
mat´eriel !
12. Comparaison des lois d’Amdahl et de Gustafson
Amdahl : tP est une fonction de (t1, α , P)
Gustafson : t1 est une fonction de (tP , α , P)
efficacit´e(P) =
acc´el´eration(P)
P
efficacit´e asymptotique d’Amdahl : limP→∞ eAmdahl(P) = 0.
Acc´el´eration toujours born´ee .
efficacit´e asymptotique de Gustafson : limP→∞ eGustafson(P) = α .
Acc´el´eration non-born´ee asymptotiquement.
... pas de contradiction car αseq de Gustafson = αseq d’Amdahl.
13. Loi de Moore (1975)
En fait, une loi empirique , une conjecture... que l’industrie essaye de
satisfaire!
nombre de transistors des processeurs double tous les 18 mois
14. Cluster de machines : une architecture `a m´emoire
distribu´ee
espace m´emoire local associ´e `a chaque processeur
processeurs connect´e par un r´eseau d’interconnexion
acc`es m´emoire aux autres processeurs explicite par ´echanges de
messages sur le r´eseau
le r´eseau d’interconnexion d´etermine la vitesse d’acc`es aux donn´ees
caract´eristiques du r´eseau :
transmission avec mod`ele de coˆut α + τ × Longueur(message) :
latence : temps pour initier une communication (α)
bande passante : vitesse de transfert des donn´ees (τ)
topologie : architectures physique (mat´eriel) et logique (utilis´e par les
algorithmes //)
15. Processus
Les syst`emes d’exploitation modernes sont multi-tˆaches : plusieurs
applications non-bloquantes peuvent tourner en “mˆeme temps” (time-slicing).
un seul processus en cours d’ex´ecution sur le CPU `a un instant donn´e,
un ordonnanceur de tˆaches qui alloue les processus aux CPUs/cœurs,
´etat d’un processus : en cours d’ex´ecution, prˆet en attente de CPU,
bloqu´e (suspendu/attente de r´eveil).
Cadre th´eorique : un processus tourne sur un processeur (mono-cœur) qui
constitue un nœud du cluster. P/Proc. (= processus, = processeur)
16. Tˆaches (jobs) sous UNIX
[france ~]$ sleep 10000 &
[1] 12027
[france ~]$ sleep 15000 &
[2] 12065
[france ~]$ jobs
[1]- Running sleep 10000 &
[2]+ Running sleep 15000 &
[france ~]$ kill %1
[1]- Terminated sleep 10000
[france ~]$ fg %2
sleep 15000
On suspend une tˆache avec Ctrl-Z , et on la fait passer dans le fond avec bg
% (background)
Une tˆache peut lancer plusieurs processus (souvent c’est un seul)
18. Programmer avec la Message Passing Interface (MPI)
Multiple Program Multiple Data : MPMD
Single Program Multiple Data : SPMD
Taxonomie de Flynn (1972). SPMD (GPU), MPMD (Playstation R 3).
19. MPI : le standard/la biblioth´eque
Outre les calculs locaux sur chaque processus, on a aussi :
des mouvements de donn´ees via des envois et r´eceptions de messages
(broadcast, scatter, gather, all-to-all, etc.),
de la synchronisation (barri`ere o`u tous les processus s’attendent avant
de pouvoir continuer),
du calcul global (comme des op´erations de sommes cumul´ees, reduce et
scan ou parallel prefix).
20. MPI : Les communications collectives usuelles
Concernent tous les processus d’un groupe de communication (souvent
WORLD)
diffusion
broadcast
Mi
M1 M2 M3
M
M M M
M
diffusion
personnalis´ee
scatter
M1 M2 M3
rassemblement
gather
Mi
M1 M2 M3
2 3 1 r´eduction
reduce
2 3 1
6
processus appelant
AVANT APR`ES
P0
P1 P2 P3
message
messages personnalis´es M1, M2, M3 `a envoyer
Mi
messages personnalis´es M1, M2, M3 re¸cus
21. MPI : Les communications collectives
un `a tous (one-to-all) :
La diffusion, Broadcast : MPI Bcast, message entier
La difusion personnalis´ee, Scatter : MPI Scatter, message partitionn´e en
morceaux
tous `a un (all-to-one) :
La r´eduction, Reduce : MPI Reduce, op´eration comme MPI SUM, etc.
Le rassemblement, Gather : MPI Gather, assemble le message `a partir des
messages par morceaux
tous `a tous (all-to-all, total exchange), le comm´erage : MPI Alltoall
22. MPI : les deux op´erations de base send et receive
Communications bloquantes
send(&data, n, Pdest) :
Envoie n donn´ees point´ees par &data au processeur Pdest
receive(&data,n, Psrc) :
Re¸coit n donn´ees `a l’adresse point´ee par &data du processeur Psrc
Que se passe t’il dans ce petit exemple ?
P0 P1...
a=442;
send(&a, 1, P1);
a=0;
...
receive(&a, 1, P0);
cout << a << endl;
24. MPI Init(&argc ,& argv ) ;
MPI Comm size (MPI COMM WORLD,&numprocs ) ;
MPI Comm rank(MPI COMM WORLD,&myid ) ;
tag =442; source =0; d e s t i n a t i o n =1; count =1;
i f ( myid == source ) {
b u f f e r =2015;
MPI Send(& buffer , count , MPI INT , d es t i n a t i on , tag ,
MPI COMM WORLD) ;
p r i n t f ( ”Le p r oces s eu r %d a envoye %dn” , myid ,
b u f f e r ) ;
}
i f ( myid == d e s t i n a t i o n ) {
MPI Recv(& buffer , count , MPI INT , source , tag ,
MPI COMM WORLD,& s t a t u s ) ;
p r i n t f ( ”Le p r oc e s s e u r %d a recu %dn” , myid ,
b u f f e r ) ;
}
25. . . .
tag =442; source =0; d e s t i n a t i o n =1; count =1;
i f ( myid == source ) {
b u f f e r =2015;
MPI Send(& buffer , count , MPI INT , d es t i n a t i on , tag ,
MPI COMM WORLD) ;
p r i n t f ( ”Le p r oces s eu r %d a envoye %dn” , myid ,
b u f f e r ) ;
}
i f ( myid == d e s t i n a t i o n ) {
MPI Recv(& buffer , count , MPI INT , source , tag ,
MPI COMM WORLD,& s t a t u s ) ;
p r i n t f ( ”Le p r oc e s s e u r %d a recu %dn” , myid ,
b u f f e r ) ;
}
. . .
Le processeur 0 a envoye 2015
Le processeur 1 a recu 2015
26. Minimiser les temps d’attente
Pour des communications bloquantes, on cherche donc `a minimiser le temps
d’attente (on verra plus tard l’´equilibrage de charge, le load balancing).
27. Temps d’attente pour le receveur
Receveur prˆet avant l’envoyeur (communications bloquantes)
28. MPI : les situations de blocages (deadlocks)
Que se passe t’il dans cet exemple ?
P0 P1
send(&a, 1, P1);
receive(&b, 1, P1);
send(&a, 1, P0);
receive(&b, 1, P0);
Envoyeur P0 attend le “OK pour envoi” de P1
Envoyeur P1 attend le “OK pour envoi” de P0
C¸a bloque. On est en situation de deadlock !
(Ctrl-C pour tuer le programme...)
Programmer avec MPI peut-ˆetre complexe `a d´eboguer
29. MPI : les blocages (deadlocks)
Les communications bloquantes sont n´ecessaires pour assurer la
consistence (s´emantique) des programmes mais font apparaˆıtre des
situations ind´esirables de blocage.
Pour le send, on peut pr´e-allouer un espace m´emoire “buffer donn´ees”
(Data buffer, DB) `a chaque processus, puis envoyer les donn´ees en deux
temps :
Envoi sur le Data Buffer DB,
Sur le processeur receveur, recopie le DB `a l’endroit &data,
Implant´e soit mat´eriellement soit par un protocole logiciel.
N´eanmoins, il subsiste toujours une situation de blocage lorsque le buffer
de donn´ees DB devient plein
30. MPI : les blocages (deadlocks)
Mˆeme si on g`ere bien les appels send, le probl`eme du deadlock subsiste.
Le probl`eme des receive...
P0 P1
receive(&a, 1, P1);
send(&b, 1, P1);
receive(&a, 1, P0);
send(&b, 1, P0);
⇒ blocage
31. MPI : Send/Receive non-bloquantes et non-bufferis´ees
Comment envoyer/recevoir des messages avec des communications
non-bloquantes...
L’envoyeur poste un message “Demande d’envoi” (pending message) et
continue l’ex´ecution de son programme,
Le receveur poste un “OK pour envoi”, et le transfert de donn´ees
s’effectue,
Quand le transfert de donn´ees est fini, un check status indique qu’on
peut toucher aux donn´ees sans danger
⇒ communications non-bloquantes
32. commnonbloq442.cpp
MPI Status s t a t u s ; MPI Request r eq u es t ;
MPI Init(&argc ,& argv ) ;
MPI Comm size (MPI COMM WORLD,&numprocs ) ;
MPI Comm rank(MPI COMM WORLD,&myid ) ;
tag =442; source =0; d e s t i n a t i o n =1; count =1;
r e q u e s t=MPI REQUEST NULL ;
i f ( myid == source ) {
b u f f e r =2015;
MPI Isend(& buffer , count , MPI INT , d es t i n a t i on , tag ,
MPI COMM WORLD,& r e q u e s t ) ;
}
i f ( myid == d e s t i n a t i o n ) {
MPI Irecv(& buffer , count , MPI INT , source , tag ,
MPI COMM WORLD,& r e q u e s t ) ;
}
33. MPI Wait(&request ,& s t a t u s ) ;
p r i n t f ( ” [ proc %d ] s t a t u s de MPI WAIT : %dn” , myid ,
s t a t u s ) ;
i f ( myid == source ) {
p r i n t f ( ”Le p r oces s eu r %d a envoye %dn” , myid ,
b u f f e r ) ;
}
i f ( myid == d e s t i n a t i o n ) {
p r i n t f ( ”Le p r oc e s s e u r %d a bien recu %dn” , myid
, b u f f e r ) ;
}
attente avec MPI_WAIT ...
attente avec MPI_WAIT ...
[proc 0] status de MPI_WAIT : 0
Le processeur 0 a envoye 2015
[proc 1] status de MPI_WAIT : 0
Le processeur 1 a bien recu 2015
34. MPI : Les six routines standards sont...
proc´edures , types de donn´ees et constantes sont pr´efix´ees par MPI
(fichier mpi.h)
100+ proc´edures dont les six principales sont :
MPI Init Initialisation de la biblioth`eque
MPI Finalize Termine l’utilisation de MPI
MPI Comm size Donne le nombre de processus
MPI Comm rank ´Etiquette du processus appelant
MPI Send Envoi un message (bloquant)
MPI Recv Re¸coit un message (bloquant)
Ces proc´edures retournent MPI SUCCESS en cas de succ`es, sinon un code
d’erreur.
35. Quelques hypoth`eses sur la concurrence
le processeur (ou PE) peut effectuer plusieurs “choses” en mˆeme temps
Par exemple, on peut supposer
MPI IRecv(), non-bloquant
MPI ISend(), non-bloquant
+ calcul local
il faut donc que ces 3 op´erations soient ind´ependantes !
donc on ne peut pas envoyer le r´esultat du calcul
on ne peut pas forwarder = envoyer ce que l’on re¸coit
en pseudo-code, on note les activit´es concurrentes par ||
(une double barre)
Activit´e1||Activit´e2||Activit´e3
36. MPI : Les types de donn´ees enMPI
Ce qu’on envoie/re¸coˆıt... MPI_Commande(&buffer,count,MPI_INT, ...)
Type MPI Type dans le langage C
MPI CHAR signed char
MPI SHORT signed short int
MPI INT signed int
MPI LONG signed long int
MPI UNSIGNED CHAR unsigned char
MPI UNSIGNED SHORT unsigned short int
MPI UNSIGNED unsigned int
MPI UNSIGNED LONG unsigned long int
MPI FLOAT float
MPI DOUBLE double
MPI LONG DOUBLE long double
MPI BYTE
MPI PACKED
37. MPI : La primitive send
https://www.open-mpi.org/doc/v1.4/man3/MPI_Send.3.php
Syntaxe en C :
#i n c l u d e <mpi . h>
i n t MPI Send ( void ∗buf , i n t count , MPI Datatype
datatype , i n t dest , i n t tag , MPI Comm comm)
Syntaxe en C++ (plus mis `a jour depuis MPI-2) :
#i n c l u d e <mpi . h>
void Comm : : Send ( const void ∗ buf , i n t count , const
Datatype& datatype , i n t dest , i n t tag ) const
tag : Message tag (integer), utile pour la filtration et l’appariemment des
op´erations send/receive. Par d´efault, tag=0
On utilise la syntaxe d’appel en C du MPI dans nos programmes C++
38. MPI : les communications non-bloquantes (C API) “I”
i n t MPI Isend ( void ∗buf , i n t count , MPI Datatype
datatype , i n t dest , i n t tag , MPI Comm comm,
MPI Request ∗ req )
i n t MPI Irecv ( void ∗buf , i n t count , MPI Datatype
datatype , i n t src , i n t tag , MPI Comm comm,
MPI Request ∗ req )
L’objet MPI Request est utilis´e dans les routines suivantes :
Retourne *flag=1 si l’op´eration *req est finie, 0 sinon
i n t MPI Test ( MPI Request ∗req , i n t ∗ flag , MPI Status
∗ s t a t u s )
Attend jusqu’`a ce que l’op´eration associ´ee avec *req soit finie.
i n t MPI Wait ( MPI Request ∗req , MPI Status ∗ s t a t u s )
39. MPI : les groupes de communication, communicators
D´efini le cadre des op´erations de communication,
Chaque processus inclus dans un communicator a un rang associ´e,
Par d´efaut, MPI COMM WORLD inclut tous les p processus, rang de 0 `a
p − 1,
On peut cr´eer des communicators pour des groupes de processus,
int MPI Comm size(MPI Comm comm, int *size) et int
MPI Comm rank(MPI Comm comm, int *size)
40. Barri`ere de synchronisation : MPI Barrier
MPI Barrier : Bloque jusqu’`a temps que tous les processus arrivent `a cette
routine = synchronisation !
Barri`ere de synchronisation
Barri`ere de synchronisation
41. Mesurer le temps sous MPI : MPI Wtime
double start, end;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */
start = MPI_Wtime();
/* faire le calcul ici */
calculINF442();
MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */
end = MPI_Wtime();
MPI_Finalize();
if (rank == 0) {cout<< end-start <<endl;}
Ou alors utiliser MPI Reduce() pour calculer les temps minima/maxima (et
autres statistiques) des processus...
42. MPI : Calcul globaux Reduce
C :
#i n c l u d e <mpi . h>
i n t MPI Reduce ( void ∗ sendbuf , void ∗ recvbuf , i n t count
, MPI Datatype datatype , MPI Op op , i n t root ,
MPI Comm comm)
https://www.open-mpi.org/doc/v1.5/man3/MPI_Reduce.3.php
Arbre de r´eduction (d´epend de la topologie)
(+ 1 2 3 4) (+ (+ 1 2) (+ 3 4))
43. MPI : Reduce, op´erations de calcul pr´ed´efinies
Op´erateur binaire associatif et commutatif
Nom Signification
MPI MAX maximum
MPI MIN minimum
MPI SUM sum
MPI PROD product
MPI LAND logical and
MPI BAND bit-wise and
MPI LOR logical or
MPI BOR bit-wise or
MPI LXOR logical xor
MPI BXOR bit-wise xor
MPI MAXLOC max value and location
MPI MINLOC min value and location
44. Calcul de la factorielle...factoriellempireduce442.cpp
i n t i , moi , nproc s ;
i n t nombre , g l o b a l F a c t =−1, l o c a l F a c t ;
MPI Init (&argc ,& argv ) ;
MPI Comm size (MPI COMM WORLD,& nproc s ) ;
MPI Comm rank (MPI COMM WORLD,&moi ) ;
nombre=moi+1;
// dans l e s arguments , se r a p p e l e r l ’ o r d r e ( source , d e s t i n a t i o n )
MPI Reduce(&nombre ,& globalFac t , 1 , MPI INT ,MPI PROD , 0 ,MPI COMM WORLD) ;
i f ( moi==0)
{ p r i n t f ( ” f a c t o r i e l l e avec re duc e pour %d p r o c e s s u s = %dn” , nprocs , g l o b a l F a c t ) ;}
l o c a l F a c t =1; f o r ( i =0; i<nproc s ; i++) { l o c a l F a c t ∗=( i +1);}
i f ( moi==0)
{ p r i n t f ( ” f a c t o r i e l l e l o c a l e : %dn” , l o c a l F a c t ) ;}
M P I F i n a l i z e () ;
45. MPI : Les commandes Scan/ Pr´efixe parall`ele
i n t MPI Scan ( void ∗ sendbuf , void ∗ recvbuf , i n t count ,
MPI Datatype datatype , MPI Op op ,MPI Comm comm )
processus P0 P1 P2 P3
entr´ee (vi ) 1 2 3 4
sortie 1 3 (= 1 + 2) 6 (= 1 + 2 + 3) 10 (= 1 + 2 + 3 + 4)
46. P0
P1
P2
P3
a
b
c
d
a + b + c + d
b
c
d
reduce
P0
P1
P2
a0
a1
c0b0
b1
c2a2 b2
c1
scan
a0
a0 + a1
a0 + a1 + a2
b0
b0 + b1
b0 + b1 + b2
c0
c0 + c1
c0 + c1 + c2
P0
P1
P2
P3
a
b
c
d
a + b + c + d
Allreduce a + b + c + d
a + b + c + d
a + b + c + d
47. Algorithme parall`ele pour les
k-moyennes
Parallel k-means
MPI
Frank Nielsen 4.k-moyennes sous MPI A2-47
48. Parall´elisation : propri´et´e de composition du centro¨ıde
Soit X et X deux jeux de donn´ees pond´er´es avec leurs sommes des poids
totaux W et W (X ∩ X = ∅). Alors on a la r`egle de composition :
¯x(X ∪ X ) =
W
W + W
¯x(X) +
W
W + W
¯x(X )
Tr`es utile pour partager le calcul des donn´ees sur plusieurs processeurs...
On fait des paquets X1, ..., Xp ´equilibr´es de taille n
p
Propri´et´e forte de la g´eom´etrie Euclidienne (pas vrai en g´eom´etrie
hyperbolique)
Frank Nielsen 4.k-moyennes sous MPI A2-48
49. R`egle de composition : preuve ´el´ementaire
Prenons X ∩ X = ∅.
¯x(X ∪ X ) =
W
W + W
¯x(X) +
W
W + W
¯x(X )
¯x(X) =
1
|X|
x∈X
x
¯x(X ∪ X ) =
1
|X| + |X |
x∈X
x +
x ∈X
x
x∈X
x = |X|¯x(X),
x ∈X
x = |X |¯x(X )
W = |X| et W = |X |, idem pour des poids arbitraires W et W .
Frank Nielsen 4.k-moyennes sous MPI A2-49
50. Parall´elisation de l’heuristique de Lloyd
Soit p processeurs P0, ..., Pp−1, tous les processeurs lisent leurs n
p donn´ees
(tient dans la m´emoire vive, RAM).
Utilisons la propri´et´e de d´ecomposition des centro¨ıdes :
¯x(X) = p−1
i=0
1
p ¯x(Xp).
Un des processeurs, disons P0 s’occupe de l’initialisation des centroides,
puis diffuse (broadcast) cette initialisation `a tous les autres processeurs.
En MPI, commande MPI Bcast.
Chaque processeur Pr s’occupe d’ un paquet de n
p donn´ees
Xr = {xr n
p
...x(r+1) n
p
−1} en calculant la distance minimale de ses xi aux
centres. On met `a jour la fonction de coˆut et on calcule les centro¨ıdes et
cardinalit´e ind´ependamment dans chaque paquet : G1(r), ..., Gk (r) avec
n1(r) = |G1(r)|, ..., nk (r) = |Gk(r)|.
Puis on r´eduit (op´eration reduce) tous les cj (r) et nj (r) en faisant la
somme (op´eration d´edi´ee de MPI) : MPI Allreduce
On r´ep´ete jusqu’`a convergence (ou lorsque la d´ecroissance de la fonction
de coˆut passe sous un seuil donn´e).
Frank Nielsen 4.k-moyennes sous MPI A2-50
52. Les k-moyennes en MPI : analyse de la complexit´e
Algorithme s´equentiel : O(dnks), s : nombre d’it´erations (Lloyd).
Les op´erations ´el´ementaires comme Reduce, Bcast, etc. d´ependent de la
topologie du r´eseau d’interconnexion .
Initialisation des centro¨ıdes par le processeur P0 en temps O(dk)
Coˆut total :
O dk + Bcast(p, dk) + s
dn
p
+ Reduce(p, dk) ∼n>>k,d O
dkns
p
→ Facteur d’acc´el´eration (speed-up, rapport du temps s´equentiel sur le
temps parall`ele) α = O dkns
dkns
p
= O(p).
Philosophie diff´erente de MapReduce (Hadoop) : Autre mod`ele de calcul
distribu´e simple.
Frank Nielsen 4.k-moyennes sous MPI A2-52
53. Les k-moyennes : Un clustering
par partition
= clustering plat
vs
Regroupement hi´erarchique
Frank Nielsen 5.Regroupement A2-53
56. Les sciences du vivant adorent le regroupement
hi´erarchique !
Gene expression patterns of breast carcinomas distinguish tumor subclasses
with clinical implications http://www.pnas.org/content/98/19/10869.figures-only
Frank Nielsen 5.Regroupement A2-56
57. Le regroupement hi´erarchique : reconnaissance de visages
Hierarchical Clustering With Prototypes via Minimax Linkage, 2011.
Frank Nielsen 5.Regroupement A2-57
58. Le clustering/regroupement hi´erarchique ascendant
On part des donn´ees X = {x1, ..., xn} qui sont des feuilles et on fusionne
i´erativement au fur et `a mesure les sous-arbres jusqu’`a ne plus qu’avoir un
seul arbre. Les feuilles initiales forment une forˆet d’arbres `a une feuille, puis
on fait de la fusion d’arbres...
Plusieurs crit`eres pour la fusion de deux sous-arbres (dont les sous-ensembles
de donn´ees Gi et Gj sont stock´ees dans leurs feuilles). On calcule Δ(Gi , Gj )
la distance entre deux sous-ensembles.
strat´egie du saut minimum :ΔSL → Single Linkage (SL)
strat´egie du saut maximum (ou diam`etre) : ΔCL → Complete Linkage
(CL)
strat´egie du saut moyen : ΔGA → Group Average (GA)
⇒ algorithme glouton : Choix it´eratif de la meilleure paire de groupes (avec
tie-breaking rule)
Frank Nielsen 5.Regroupement A2-58
59. Pour se fixer une id´ee : saut moyen, Single Linkage (SL)
Fonction de chaˆınage entre deux groupes
Δ(Gi , Gj ) = min
xi ∈Gi ,xj ∈Gj
D(xi , xj )
o`u D(x, y) est une distance ´el´ementaire .
⇒ regroupement hi´erarchique agglom´eratif avec un saut minimum
(nearest-neighbor clustering)
Frank Nielsen 5.Regroupement A2-59
60. Quelle distance ´el´ementaire entre deux donn´ees ?
On doit toujours avoir bien entendu Δ({xi }, {xj }) = D(xi , xj ).
Exemples de distances ´el´ementaires :
Distance Euclidienne (L2) : D(p, q) = d
i=1(pi − qi )2
Distance de Manhattan (city block, L1) : D1(p, q) = d
i=1 |pi − qi |
Distance de Minkowski induite par Lp :
Dp(p, q) =
d
i=1
|pi − qi |p
1
p
Distance de Mahalanobis :
DΣ(p, q) = (p − q) Σ−1(p − q) = D(L p, L q),
avec Σ−1 = L L provenant de la factorisation de Cholesky
M´etrique, non-m´etrique, distance & similarit´e, etc.
Frank Nielsen 5.Regroupement A2-60
61. Le clustering par agglom´eration
Hierarchical Cluster Analysis (HCA) : regroupement hi´erarchique
Initialiser xi dans un cluster singleton Gi = {xi }
Tant qu’il reste au moins deux clusters :
Choisir Gi et Gj tel que Δ(Gi , Gj ) soit minimal
Fusionner Gi,j = Gi ∪ Gj (ajouter Gi,j et retirer Gi et Gj )
Retourner le dernier nœud comme la racine de l’arbre de fusion
⇒ le r´esultat d’un regroupement hi´erarchique est un arbre binaire appel´e
dendrogramme . On fusionne n − 1 fois (les ´etapes de fusion).
Diff´erent d’un algorithme de partitionnement comme les k-moyennes :
Clustering hi´erarchique = not Clustering plat (par partition)
Ici, pas de fonction de coˆut globale `a optimiser mais un algorithme de fusion
Frank Nielsen 5.Regroupement A2-61
62. Distance de chaˆınage Δ(Gi, Gj)
Single Linkage
saut minimum
Complete Linkage
saut maximum
diam`etre
Group Average
saut moyen
Algorithme glouton :
arg min
i,j=i
Δ(Gi , Gj )
⇒ les groupes Gi et Gj sont voisins r´eciproques !
Gi = PPVG(Gj ) = arg minG∈G Δ(Gj , G).
Gj = PPVG(Gi ) = arg minG∈G Δ(Gi , G).
PPV = Plus Proche Voisin. G : ensemble des groupes.
Frank Nielsen 5.Regroupement A2-62
63. Dessinons un dendrogramme...
Par exemple, choisissons la hauteur comme le nombre d’ ´etapes de fusion :
I N F 4 4 2
I, N 4, 4
I, N, F 4, 4, 2
I,N,F,4,4,2
feuilles
nœuds internes
hauteur :
nombre de fusions
0
1
2
3
Dendrogramme = Graphique d’un arbre binaire, enracin´e et plong´e dans le
plan.
Frank Nielsen 5.Regroupement A2-63
64. Autre visualisation de la hi´erarchie par inclusion
I N F 4 4 2
I, N 4, 4
I, N, F 4, 4, 2
I,N,F,4,4,2
I
N
F
4
4
2
nested clusters
Frank Nielsen 5.Regroupement A2-64
65. Le clustering hi´erarchique : single linkage (SL)
Δ(Gi , Gj ) = min
xi ∈Gi ,xj ∈Gj
D(xi , xj )
R´epeter tant que toutes les donn´ees xi ne soient pas contenues dans un seul
cluster, on fusionne les deux groupes les plus proche. `A chaque instant tous
les sous-arbres forment une forˆet (partitition de X).
Single linkage → nearest-neighbor clustering
S’il existe plus d’une paire de groupes donnant le Δ minimal, on choisit
un ordre (lexicographique). Si on fait une permutation sur les donn´ees, on
n’obtiendra pas le mˆeme dendrogramme : unicit´e .
Probl`eme de chaˆınage (artefact) dans le clustering final
Complexit´e : na¨ıf O(n3), algorithme SLINK en O(n2) (1973), temps
quadratique et espace lin´eaire en utilisant l’arbre recouvrant de poids
minimal (MST : Minimum Spanning Tree, 1969).
Frank Nielsen 5.Regroupement A2-65
67. Le clustering hi´erarchique : Complete Linkage
Complete linkage (CL) : CLINK in O(n2) (1977)
ΔCL(Gi , Gj ) = max
xi ∈Gi ,xj ∈Gj
D(xi , xj ) ,
appel´e aussi diam`etre .
Probl`eme du diam`etre : si un point artefact (outlier) est tr`es ´eloign´e des
autres, la distance inter-groupe devient grande (et n’est pas significative).
Complete linkage → furthest-neighbor clustering
Frank Nielsen 5.Regroupement A2-67
69. Le clustering hi´erarchique : Average Linkage
Average Linkage (AL) : O(n2) (1984)
ΔAL(Gi , Gj ) =
1
ni nj
xi ∈Gi xj ∈Gj
D(xi , xj )
La moyenne de toutes les paires de distance !
Frank Nielsen 5.Regroupement A2-69
72. Crit`ere de fusion de Ward : la variance
Variance = somme des distances euclidiennes au carr´e par rapport au
centro¨ıde :
v(X) =
x∈X
x − c(X) 2
, c(X) =
1
|X|
x∈X
x
Distance entre clusters (crit`ere de Ward) pour Gi (ni = |Gi |) et Gj
(nj = |Gj |) :
Δ(Gi , Gj ) = v(Gi ∪ Gj ) − (v(Gi ) + v(Gj ))) =
ni nj
ni + nj
c(Gi ) − c(Gj ) 2
≥ 0
Δ({xi }, {xj }) = D(xi , xj ) = xi − xj
2
Quand on fusionne deux groupes, la variance ne peut pas diminuer !
Quand on rajoute des clusters, la somme pond´er´ee des variances diminue
Δ(Gi , Gj ) = k-moyennes(Gi ∪ Gj) − (k-moyennes(Gi ) + k-moyennes(Gj ))
Frank Nielsen 5.Regroupement A2-72
74. Le clustering descendant hi´erarchique par division
Version top-down : on part d’un cluster contenant toutes les donn´ees X
et on divise r´ecursivement jusqu’`a temps qu’on obtienne les n feuilles
qui contiennent les donn´ees individuelles.
Pour casser un cluster en deux, on utilise un algorithme de clustering par
partitionnement pour k = 2 (comme celui des k-moyennes par exemple)
En g´en´eral, plus coˆuteux qu’un regroupement hi´erarchique agglom´eratif
(bottom-top)
Frank Nielsen 5.Regroupement A2-74
75. Dendrogramme : obtenir des partitions `a partir du
dendrogramme
Pour k ∈ [n] = {1, ..., n}, on peut extraire des partitions en k-sous-ensembles
de X.
877511973859339482263114311821864425204048399392158353212893053273817622369162764350599690413634496170685655951424672835998474755458365814598465272379110088129697477166607879577710134280266482
0.00.51.01.52.02.5
Regroupement hierarchique
INF442
x
hauteur
Frank Nielsen 5.Regroupement A2-75
76. Convertir un clustering hi´erarchique en une partition
Si on ne choisit pas k mais une valeur de seuillage...
Parcourir r´ecursivement l’arbre et on arrˆete la r´ecursivit´e quand
Δ(nœud) = Δ(nœudfils gauche, nœudfils droit) ≤ seuil
saut maximum (CL, diam`etre) : les clusters ont un diam`etre ≤ seuil
(hauteur constante)
chaˆınage de Ward : les clusters ont une variance ≤ seuil (hauteur pas
constante car inversions)
Δ < Δ∗
Δ < Δ∗
Frank Nielsen 5.Regroupement A2-76
77. Convertir un clustering hi´erarchique en une partition
Si on veut choisir k...
Clustering hi´erarchique → Clustering plat (partition)
On choisit une hauteur pour trouver une partition en k clusters
Meilleure hauteur par Programmation Dynamique. Meilleure hauteur pour
T (X) `a k sous-ensembles :
Fit(T = (L, R), k) = min
k1,k2 k1+k2=k
Fit(L, k1) + Fit(R, k2)
Pour les k-moyennes (clustering plat, NP-dur en g´en´eral) on obtient une
k-partition optimale `a partir d’un clustering hierarchique (facile `a
calculer, SL) sous l’hypoth`ese de satisfaire un crit`ere de s´eparabilit´e.
Frank Nielsen 5.Regroupement A2-77
78. Distances : m´etriques et ultra-m´etriques
Une distance d(·, ·) est :
m´etrique si elle satisfait les axiomes :
d(x, y) ≥ 0 avec ´egalit´e pour x = y seulement
d(x, y) = d(y, x) sym´etrie
d(x, y) ≤ d(x, z) + d(z, y), in´egalit´e triangulaire
ultra-m´etrique si elle satisfait les axiomes :
d(x, y) ≥ 0 avec ´egalit´e pour x = y seulement
d(x, y) = d(y, x) sym´etrie
d(x, y) ≤ max(d(x, z), d(z, y))
Frank Nielsen 5.Regroupement A2-78
79. Distance et ´evolution (horloge)
Dans les arbres phylog´en´etiques, la distance entre deux esp`eces impose des
restrictions sur la fonction distance.
Arbre additif (additive tree) : poids sur chaque arˆete tel que pour
chaque paire de feuilles, la distance est la somme des distances des arˆetes
les reliant.
Arbre ultram´etrique : distances entre deux feuilles Gi et Gj et leur
ancˆetre commun Gk sont ´egales : di,k = dj,k.
hk = 1
2di,j (hauteur) correspond au temps ´ecoul´e
permet de d´efinir une horloge globale sur l’axe vertical
Frank Nielsen 5.Regroupement A2-79
81. Regroupement hi´erarchique avec l’algorithme UPGMA
UPGMA : Unweighted Pair Group Method using arithmetic Averages
Clustering hi´erarchique avec la distance de chaˆınage Average Linkage
(AL) :
Δ(Gi , Gj ) =
1
ni nj
xi ∈Gi xj ∈Gj
D(xi , xj ) = Δi,j
UPGMA garantie de produire un arbre ultram´etrique
Frank Nielsen 5.Regroupement A2-81
82. Regroupement hi´erarchique par UPGMA
Initialise xi a son cluster Ci et positionne ce nœud `a hauteur t = 0.
Tant qu’il reste plus de deux clusters :
Trouver les clusters Ci et Cj qui ont la distance Δi,j minimale
D´efinir un nouveau cluster Ck = Ci ∪ Cj et calculer la distance Δk,l pour
tout l
Ajouter un nœud k avec les fils Ci et Cj et positionner le `a hauteur
tk = 1
2 Δi,j
Retirer Ci et Cj de la liste des clusters, et continuer jusqu’`a temps d’avoir
deux clusters
Pour les deux derniers clusters Ci , and Cj , placer la racine `a hauteur
1
2Δ(Ci , Cj )
Frank Nielsen 5.Regroupement A2-82
83. Regroupement hi´erarchique par UPGMA
Th´eor`eme
Si les donn´ees sur les distances sont ultram´etriques (v´erifiable sur la matrice
des distances), alors il existe un unique arbre ultram´etrique et l’algorithme
UPGMA le construit.
... malheureusement les donn´ees (bruit´ees) ne sont pas ultram´etriques en
g´en´eral !
Tester si une matrice de distances est ultram´etrique : na¨ıvement en O(n3).
Frank Nielsen 5.Regroupement A2-83
84. Dissimilarit´e, similarit´e et inversions
similarit´e entre deux groupes : S(Xi , Xj ) = −Δ(Xi , Xj ). Ainsi si on a
Δ(Gi , Gk) > Δ(Gi , Gj ) alors on a l’ordre inverse S < S(Gi , Gj )
pour un chemin du dendrogramme d’une feuille `a la racine, s´equence de
fusion monotone ssi. la similarit´e d´ecroit quand on se rapproche de la
racine : S1 ≥ S2 ≥ ... ≥ Sracine. Autrement dit, la valeur du crit`ere de
fusion augmente quand on va vers la racine.
non-monotone s’il existe au moins une inversion Si < Si+1 sur un chemin
du dendrogramme. Cela veut dire que deux groupes peuvent ˆetre plus
similaire `a l’´etape i + 1 que les deux groupes fusionn´es `a l’´etape i.
crit`ere de Ward ne garantie pas la monotonie (inversions). Par
contre, Single Linkage, Complete Linkage et Average Linkage garantissent
la monotonie.
Frank Nielsen 5.Regroupement A2-84
85. Inversion possible pour le crit`ere de Ward
x3x2x1
S({x1, x2}, {x3})
x1
x2
x3
S({x1}, {x2})
Inversion car un nœud parent se trouve “plus bas” que les deux nœuds fils.
Frank Nielsen 5.Regroupement A2-85
86. C++ : Contenu des m´ethodes `a l’ext´erieur des classes
#i n c l u d e <iostream >
using namespace std ;
c l a s s CEntier
{
p u b l i c : i n t v a l ;
CEntier ( i n t v ) { t h i s −>v a l=v ;}
void ajoute ( i n t v2 ) ;
};
// D´efinition `a l’ext´erieur de class
void CEntier : : ajoute ( i n t v2 ) { v a l+=v2 ;}
i n t main ()
{ CEntier ∗e1=new CEntier (5) ; e1−>ajoute (8) ;
cout<<e1−>val <<endl ;
r e t u r n 0;}
Frank Nielsen 5.Regroupement A2-86
87. Structures de donn´ees abstraites
D´efini une interface pour acc´eder aux donn´ees.
Peut-ˆetre cod´e du plusieurs mani`eres diff´erentes.
les piles (Last In First Out, LIFO)
les files (First In First Out,FIFO)
les arbres
les graphes
les matrices creuses
etc.
Par exemple, les piles et files peuvent ˆetre implant´e soit avec des tableaux soit
avec des listes chaˆın´ees.
Frank Nielsen 5.Regroupement A2-87
88. c l a s s CNoeud{C++ : // la classe nœud
p u b l i c : CNoeud ∗gauche , ∗ d r o i t ;
i n t v a l ;
p u b l i c :
CNoeud( i n t v ) { t h i s −>v a l=v ; gauche=d r o i t=NULL;}
CNoeud( i n t val , CNoeud∗ Arbre1 , CNoeud∗ Arbre2 )
{ t h i s −>v a l=v a l ; gauche=Arbre1 ; d r o i t=Arbre2 ;}
s t r i n g P r i n t ()
{ char b u f f e r [ 2 0 ] ; s t r i n g s v a l=s t r i n g ( i t o a ( val , buffer
,10) ) ;
s t r i n g sgauche , s d r o i t ;
i f ( gauche==NULL) sgauche=” n i l ” ;
e l s e sgauche=gauche−>P r i n t () ;
i f ( d r o i t==NULL) s d r o i t=” n i l ” ;
e l s e s d r o i t=d r oi t −>P r i n t () ;
r e t u r n ” ( ”+s v a l+” , ”+sgauche+” , ”+s d r o i t+” ) ” ;
}};
Frank Nielsen 5.Regroupement A2-88
89. . . .
CNoeud ∗ Arbre442=new CNoeud (3 , new CNoeud (2) ,
new CNoeud (1 , new CNoeud (4) ,new CNoeud (5) ) ) ;
cout<<Arbre442−>P r i n t ()<<endl ;
Ex´ecution donne `a la console :
(3,(2,nil,nil),(1,(4,nil,nil),(5,nil,nil)))
Frank Nielsen 5.Regroupement A2-89
90. C++ : r´ecup´eration de la m´emoire
tilde ∼, un seul destructeur par classe C++
˜CNoeud ()
{
i f ( gauche!=NULL)
d e l e t e gauche ;
i f ( d r o i t !=NULL)
d e l e t e d r o i t ;
cerr <<” d e l e t e ”<<val <<endl ;
}
(3,(2,nil,nil),(1,(4,nil,nil),(5,nil,nil)))
delete 2
delete 4
delete 5
delete 1
delete 3
Frank Nielsen 5.Regroupement A2-90
91. Diff´erences principales entre C++ et Java
null en Java et NULL en C++
this.variable en Java/C++ (r´ef´erence) et this->variable en C++
(pointeur)
class INF442{} en Java et class INF442{}; en C++
On peut rajouter le corps des m´ethodes en C++ apr`es sa d´eclaration
dans la classe : void CNoeud::Addition(int v)
ajouter un destructeur dans la classe en C++
array.length en Java. On utilise la classe vector de la STL C++ et
.size()
import en Java et include en C++ (STL) etc.
En C++ dans les classes, mettre explicitement public (sinon on est
private par d´efaut)
Frank Nielsen 5.Regroupement A2-91
92. R´esum´e A2
HPC : acc´el´eration, loi d’Amdahl et loi de Gustafson
MPI :
les communications bloquantes, les situations de blocage, les
communications non-bloquantes, les barri`eres de synchronisation
les calculs collaboratifs : r´eduction (somme, reduce & Allreduce), et les
op´erations de pr´efixe parall`ele (scan)
Science des donn´ees :
les k-moyennes avec MPI
regroupement hi´erarchique vs. regroupement plat.
arbre ultram´etrique et chaˆınage par saut moyen (average link).
C++ : les classes objets. Lire le memento C++ sur la page Moodle !
Pour la prochaine fois : lire le chapitre 8 et relire le chapitre 2 du
polycopi´e
Frank Nielsen 5.Regroupement A2-92