R en entreprise

Accueil > Calcul parallèle avec R (HPC, Hadoop, BigData)

Calcul parallèle avec R (HPC, Hadoop, BigData)

L’explosion des quantités de données nécessite de réfléchir de plus en plus à des moyens efficaces de traitements de ces données. Les traitements demandent l’installation d’un cluster de calcul avec le logiciel R (et les technologies MPI, Hadoop).

Il n’est plus rare de devoir traiter des masses de données qui se mesurent en centaines de Gigaoctets (1To = 1000 Go = 1 millions de Mo = 10^12 octets).

Par exemple, le nombre d’utilisateurs de Facebook atteint presque le milliard d’individus. Si on considère que chaque utilisateur a écrit une dizaine d’article de 1000 caractères, cela fait une masse de données de 10000 Go = 10 Terraoctets.

Sur les marchés financiers, le nombre de transactions sur les bourses mondiales avoisinent les 10 milliards par jour. Vous pouvez multiplier par 100 pour avoir une idée de la quantité d’information si vous voulez analyser tout le carnet d’ordre (pour construire une stratégie de trading "High Frequency" par exemple) .

Dans le domaine biologique, l’ADN des 23 chromosomes du genre humain a une taille d’un peu moins d’1 Terraoctet.

High Performance Computing et BigData

"BigData" est le buzzword anglais pour désigner ces masses de données gigantesques.

Il n’est pas possible de faire des calculs sur des masses de données de cette ampleur sur un simple PC. Pour analyser cette quantité d’information et trouver des stratégies haute fréquence, il faut une architecture de calcul distribué adaptée.

Au moins 3 solutions High Performance Computing (HPC) s’offrent à vous avec R.

- Rmpi
Elle est basé sur la technologie MPI (Message Passing Interface), qui est la solution standard de distribution de calculs.

- Rserve
Rserve est un serveur R qui peut s’installer sur de nombreuses machines, et ainsi former un cluster. Ce n’est pas directement une solution de calcul distribué. Vous devrez écrire le code pour distribuer les calculs vous-même.

Apache Hadoop is a registered trademark from the Apache Software Foundation

- Rhadoop
La technologie Hadoop est la plus récente et utilise la fonctionalité MapReduce pour distribuer les calculs. Exemples. C’est probablement l’orientation future principale du HPC.

Que choisir ?

Cela dépend de votre problème, du type de calculs, de la quantité de données et de la façon d’y accéder (fichiers binaires ? bases de données relationnelles ? NoSQL ?), de la facilité de paralléliser le problème, de la quantité de RAM nécessaire ...

Souvent, la limitation ne vient pas du CPU mais de l’accès à la donnée.

Hadoop résoud particulièrement intelligemment ce problème : au lieu d’avoir des processeurs en parallèle qui font des calculs sur des données venant d’une base de données, et donc qui transitent par le réseau avant d’être traitées par une des machines faisant le calcul, Hadoop fait l’inverse : il envoie le code à éxécuter sur la machine qui possède la donneé. Il n’y a donc pas de données transitant sur le réseau.
Naturellement, cette façon de faire requiert que le calcul à paralléliser puisse être découpé en "tranches" de calcul indépendante. Le calcul sur chaque élément du cluster de la base de donnée Hadoop ne doit pas dépendre du calcul et des données d’une autre élément du cluster Hadoop. (Sauf éventuellement à l’étape finale de recombinaison des résultats de tous les éléments).

Exemple de problème facilement parallélisable sur un cluster Hadoop :

Vous avez une base de données de milliers de clients et pour chaque client des milliers de données (de navigation sur un site web, d’appels téléphoniques pour une compagnie de téléphone). Vous voulez faire des statistiques sur les types de comportements des clients.
Le programme est facilement parallélisable :
1/ Pour chaque client, faire le calcul sur les données du clients. C’est cette étape qui demande beaucoup de calcul.
2/ Faire une moyenne ou un histogramme, par exemple.

Il suffit d’avoir une base de données distribuées avec les données par client. Chaque machine du cluster Hadoop va posséder quelques centaines de clients et toutes les données concernants ces clients : Chaque machine du cluster peut calculer ses propres clients.

Autre exemple dans le domaine des marchés financiers, en High Frequency.

Vous avez une base de données contenant toutes les transactions journalières d’un millier d’instruments financiers par exemple. Pour chaque instrument financier, vous avez un historique d’un an, avec 10 millions de transactions.
Votre problème : pour chaque instrument, vous voulez simulez une stratégie sur l’année passée.
Le problème est encore facilement parallélisable, il suffit de distribuer la base par instruments financier, où chaque élément du cluster HDFS Hadoop va contenir l’ensemble des transactions des instruments qu’il contient.
Même problématique pour tous les calculs facilement parallélisable (pricing d’optios, Monte carlo, etc)

Si, par contre, la stratégie que vous voulez mettre en place ne peut pas être calculée par instrument financier. Et en général, c’est malheureusement le cas : si vous avez acheté plusieurs instruments à un temps t, votre portefeuille est peut-être déjà totalement investi, il n’y a plus de cash disponible pour acheter d’autres instruments au temps t+1 => Les décisions prisent sur un instrument influence les possibilités d’achat des autres instruments.
=> Impossible de distribuer le calcul sur le cluster.

Dans un cas comme celui-ci, on pourrait imaginer une autre façon de voir le problème : plutôt que de distribuer le calcul par instrument, on va distribuer le calcul par jour de l’année passée. Chaque élément du cluster va contenir quelques journées de trading, avec toutes les informations pour tous les instruments pour ces quelques jours. Il devient alors possible de calculer le portefeuille en prenant en compte tous les signaux d’achat/ventes.

Il est parfois possible de rendre un problème facilement parallélisable en le voyant d’un autre point de vue, comme dans cet exemple.

Est-ce que cela me concerne ?

Pas forcément. Si votre problème vient d’un temps de calcul trop long, cela peut souvent se résoudre en optimisant votre code après une étape de "code profiling". Evitez les boucles, sortez des boucles tout ce qui peut être pré-calculé, et utilisez au maximum la programmation vectorielle de R ou MATLAB.
Nous vous proposons des missions courtes en consulting pour optimiser votre code et améliorer vos performances, tant en vitesse CPU qu’en taille mémoire RAM.

Si votre application est déjà (au moins partiellement) optimisée et parallélisable, alors le déploiement d’une technologie comme Hadoop vous permettra de rendre votre application scalable. Utilisez le lien "Contact" en bas de cette page pour nous contacter.