• Aucun résultat trouvé

3.3 La prétopologie comme modèle de proximité

4.2.2 Implémentation parallèle de LDA avec Spark

La syntaxe Spark est une généralisation du mécanisme MapReduce, où nous avons deux suites d’instructions principales à travers lesquelles nous pouvons distribuer le calcul. La première suite est représenter par la fonction Map et la deuxième par la fonction Reduce. La collection de textes passe d’abord par une ou plusieurs fonctions Map, qui y appliquent certaines tâches. Ensuite, une ou plusieurs fonctions Reduce rassemblent la sortie de chaque tâches pour calculer un résultat global à un groupe de processeurs ou à tous les processeur du système parallélisé.

Une ou plusieurs fonctions Map et/ou Reduce peuvent être affecté à un ou plu-sieurs noeud (un ordinateur, ou un processeur multi-coeur) du réseau de la plate-forme de clacul parallèle. L’exécution de chacune des deux fonctions ne suit pas un certain ordre précis.

Figure 4.6 – Flux de travail de l’implémentation Spark. Chaque itération est exé-cutée dans l’espace de travail Map et Reduce. Le modèle LDA est copié sur les p processeurs, et le document de travail fourni en entrée est divisé en p ensemble de documents. Après l’application de la procédure Reduce les paramètres globaux nwj et ndj sont diffuser à l’ensemble des répliques de LDA. Le logarithme de la vraisemblance est calculé sur l’ensemble des documents tests après chaque itération.

Notre implémentation parallèle de LDA avec Spark est décrite par le fonction-nement suivant :

1. La collection de textes est rassemblé dans un seul fichier unicode. L’ensemble des données textuelles est dévisé en fragments.

2. Une ou plusieurs fonctions Map sont affectées à chaque noeud qui reçoit un ou plusieurs fraguement de données textuelles pour lesquelles il génére une sorte d’ index avec une clé et une valeur. Cette étape permet d’associer à chaque noeud à travers une clé donnée une fonction Reduce.

3. Chaque noeud initialise les différentes variables latentes selon le modèle LDA, ensuite exécute l’algorithme de Gibbs sur le ou les fragments qui lui sont associés et ce pour approximer chaque variable latente.

4. Les index produits par les fonctions Map sont regroupés par clés et les fonc-tions Reduce reprennent les résultats des traitements effecutés sur chaque fragements qui correspond à leur clé respective.

5. Chaque fonction Reduce combine les résultats des Map selon la clé qui lui est associée, stocke le résultat dans la mémoire vive, et partage le résultat sur les différents noeuds pour d’autres itérations.

Ce fonctionnement est illustré dans la figure 4.6. La suite d’instructions de la fonction Map est décrite dans l’algorithme 7, elle représente les instructions exécu-tées sur chaque noeud ou processeur. La suite d’instruction de la fonction Reduce est décrite dans l’algorithme8, elle représente les instructions nécessaires pour d’abord combiner les résultats de chaque processeur, et ensuite les communiquer de nouveau à tous les processeurs.

Algorithme 7 Map

Précondition : P processeur ou noeuds pour la collection des documents D

1: pour tout partitions faire

2: nwjp = nwj

3: ndjp = ndj

4: pour toutw∈ di,di ∈ D et zi dansz faire

5: Echantillonner zij à partir denwjp etndjp (voir équation 4.14)

6: Calculernwjpnew etndjpnew à partir dezij.

7: Calculer ˆφ(w)j et ˆθd

j avec les équations4.19et4.20.

Dans l’algorithme 7, les instructions de la fonction Map sont exécutées sur les P processeurs. La fonction Map prend en entrée un fragement de la collection de documentD et nous retourne en sortie la distribution des thémes dans les documents présents sur le noeud et la distribution des mots dans chacun de ces thèmes. Les deux premières instructions sont des instructions d’initialisation des comptes communnwjp

etndjp avec les valeurs obtenues à la dernière itération. Si c’est la première itération, nous les initialisons à zéro. Nous calculons ensuite le thème zij et produisons de

nouveaux comptes communs pour calculer la distributionθ des thèmes par document et la distribution φ des mots par thème avec les équations4.20et4.19.

ˆ φ(w)j = n (w) j + β n(·)j + V β (4.19) ˆ θj(d)= n (d) j + α n(d)· + Kα (4.20) Algorithme 8 Reduce

1: Réduire toutes les instancesnwjpnew avec l’équation 4.15.

2: Réduire toutes les instancesndjpnew avec l’équation 4.17.

3: Distribuer les résultatsnwjpnew etndjpnew sur toutes les instances p.

4: Ajouter àθ toutes les θp

5: Ajouter àφ toutes les φp

L’algorithme 8 est exécuté à la fin de chaque itération de l’échantillonnage de Gibbs. Ceci afin de combiner les résultats des P processeurs ou noeuds, c’est-à-dire les résultats obtenus en sortie des fonctions Map déployées sur chaque noeud. L’algorithme 8 combine d’abord les comptes communs nwjpnew et ndjpnew.C’est-à-dire le nombre d’occurrences du mot w dans le thème j et le nombre d’occurrences du thèmej dans le document d et cela pour chaque processeur p. Ensuite, les résultats combinés sont calculés et enregistrés respectivement dans nwjpnew et ndjpnew. L’algo-rithme8, distribue ensuitenwjpnew etndjpnew à tous les noeuds ou processeurs pour que les valeurs soient utilisées au début de la prochaine itération. Enfin, l’algorithme8

combine les valeurs de probabilités de la distribution de thèmesθ dans les documents et les valeurs de probabilités de la distribution φ des mots dans les thèmes. Avant la convergence de l’algorithme de Gibbs, les valeurs de cet ensemble de variables sont intermédiaires et ils sont stockés dans la mémoire vive. Les algorithmes 7, 8

sont exécutées jusqu’à convergence de l’échantillonnage de Gibbs ou jusqu’à ce que la valeur dendjpnew ne change plus avec les itérations.

Algorithme 9 Version distribuée de LDA

Précondition : w mots dans le corpus de document D = (d1, d2, . . . , dn)

1: si première itération alors

2: Initialiser aléatoirement les comptes communs

3: pour tout itérations faire

4: Distribuer le fichier sur les RDDs avec l’algorithme7.

5: Calculer les comptes communs avec l’algorithme.

6: Distribuer les comptes communs sur les RDDs.

7: Calculer sur chaque RDD ˆφ(w)j et ˆθd j.

8: Récupérer à partir de chaque RDD les valeurs de ˆφ(w)j et ˆθd

j avec l’algorithme8

9: retour z, ˆφ(w)j et ˆθd j

La principale nouveauté qu’apporte Spark est le concept des RDD (pour Resilient Distributed Dataset. Les RDDs contiennent la collection de documents partitionnés

en fragments et distribués sur les noeuds par la fonction Map. Les collections RDDs sont conservées en mémoire vive (RAM), la résilience des données est assurée par la conservation des lignes de code qui ont construit ces fragments. Le programme qui contient la fonction Map et la fonction Reduce est appelé programme pilote. Il est décrit dans l’algorithme 9, où nous avons les instructions pour distribuer la collection de documents D sur les RDDs disponibles, et l’exécution des algorithmes

7 et8.