Publié le 25 octobre 2014 - par

32 Raspberry Pi pour du calcul parallèle en Java

raspi_cluster_250pxJ’ai trouvé cet article sur un cluster de Raspberry Pi très intéressant. De plus il comporte un certain nombre de photos qui illustrent bien cette réalisation.
Je vous propose la traduction de cet article, qui montre (une fois de plus ?) que notre framboise est vraiment un outil très souple et utilisable dans de nombreux projets.

Cet article provient de http://eclipsejpa.blogspot.fr/2012/11/java-7-se-parallel-processing-cluster.html. En voici la traduction. De nombreuses images qui illustrent cette page sont disponibles en grand format. Il vous suffit de cliquer sur l’image pour l’agrandir.

Un cluster de 32 nœuds pour une expérimentation de calcul parallèle

raspi_cluster_01

Le cluster de Raspberry Pi – Vue de dessous – Cliquer pour agrandir

Présentation

Le SoC ARM qui se trouve au cœur du Raspberry PI est une excellente plateforme pour étudier différentes configurations de traitement parallèle. Si nous sommes à la recherche de performance pure alors le Core i7 d’Intel et un GPU NVidia CUDA feront l’affaire. Avec son processeur à un seul cœur, le Raspberry Pi est environ 40 fois plus lent qu’un cœur de 2ème génération i7-2600 ou de 3e génération i7-3610 (environ 140 fois plus lent qu’une implémentation ForkJoin à 8 Threads). Mais ce n’est pas notre objectif, nous avons besoin d’un moyen efficace et accessible pour faire tourner plusieurs serveurs et le Pi le fait très bien pour environ 70 $ par serveur (Raspberry Pi + connecteurs + carte SD de 16 Go) et pour seulement 4 watts / nœud. Par exemple : il faudrait 9800$ de cartes Raspberry Pi avec 70Go de RAM pour égaler un i7 de 3ème génération à 1300$ avec 24Go de RAM. Mais nous pouvons construire un cluster de 8 serveurs Raspberry PI à 560$ en remplacement de 8 unités centrales  équipées d’i7 et coûtant 10000$.

IMG_0174_raspberrypi_cluster_of_32_power_network_600px

Les alimentations et les switch – Cliquez pour agrandir

Nous avons besoin d’alimentations appropriées et de switch pour réaliser un cluster de 32 cartes Raspberry pi.

IMG_0158_raspberrypi_cluster_of_32_top_600px

Les cartes sont montées sur des breadboards – Cliquez pour agrandir

Les cartes Raspberry Pi se montent très bien sur les breadboards (planches à pain) standard en utilisant les connecteurs d‘Arduino bien pliés.

IMG_0145_raspberrypi_cluster_of_32_full_600px

Vue générale du cluster – Cliquez pour agrandir

IMG_9852_raspberry_pi_8_cluster_600px

Un cluster constitué de 8 Raspberry Pi – Cliquez pour agrandir

IMG_9810_rpi_cluster_8_diag_600px

Une autre vue du cluster de 8 Raspberry Pi – Cliquez pour agrandir

Dans cette configuration, j’utilise pour mes recherches un ensemble 8 cartes Raspberry Pi pour l’exécution répartie de sessions Java EE RMI/EJB distantes de clients bean d’un serveur central Oracle WebLogic 12c (tournant sur un hôte i7).

IMG_9863_raspberry_pi_8_cluster_setup_600px

Le Cluster en cours de fonctionnement – Cliquer pour agrandir

Ce tutoriel explique comment obtenir un cluster en réseau de huit (pour le moment) cartes Raspberry PI fonctionnant comme une seule unité de traitement auxiliaire distribué pour le compte d’un serveur de contrôle Java EE  utilisant idéalement Hadoop. L’objectif principal de cet exercice est d’expérimenter le traitement distribué. Comme je configure et achète plusieurs cartes Raspberry Pi et que je travaille sur l’alimentation mon cluster va grandir. Je travaille actuellement avec 8 cartes et 8 autres qui servent de rechange. Le cluster de Raspberry Pi peut réaliser du travail distribué en utilisant une API RPC personnalisée comme session bean distante s’appuyant sur RMI ou ils peut utiliser une implémentation de MapReduce comme Hadoop ou même MPI.

8_raspberry_pi_cluster_putty_forkjoin_screencap_600pxAprès avoir réussi à exécuter la JVM (Java Virtual Machine)  Oracle ARM sans aucun problème sur un Raspberry Pi Modèle A en utilisant la distribution de Element14, je n’ai pas immédiatement réussi l’exécution de la JVM sur le nouveau Modèle B (512 Mo) parce que la distribution Debian d’Element 14 n’utilise plus la version logicielle du calcul en virgule flottante. J’obtenais l’erreur de bibliothèque manquante suivante.

pi@raspberrypi ~/java/ejre1.7.0_06 $ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

 

Téléchargez un nouveau système d’exploitation compatible avec le Java JDK 7 ici
http://www.raspberrypi.org/downloads

Ecrivez-le sur votre carte SD
http://sourceforge.net/projects/win32diskimager/files/

Réinstallez Java (version actuelle d’Oracle : 1.7.0_10)

20121218_java_170_10_resultsVous êtes prêt pour exécuter Java 7 SE sur le Raspberry PI Modèle B. Avec ça, nous pouvons maintenant utiliser Fork-Join, JAXB et JAX-WS  webservices (avec un seul thread cependant).

DI 1: Mise en cluster des Raspberry PI

Sur certains routeurs, vous n’obtiendrez pas une adresse attribuée par DHCP si toutes les cartes de PI de framboise cluster sont alimentés dans sync – vous aurez besoin d’échelonner la mise sous tension cela se produit uniquement si pas assez amplis sont disponibles.

Nous utilisons une bonne alimentation Agilent qui fournit de 3A (en fonctionnement) à 3.5A (au démarrage) (6-7W @ 5V) pour les 8 cartes.

IMG_9798_rpi_cluster_8_idle_power_2960maIMG_9799_rpi_cluster_8_max_power_3360ma_startupVous pouvez utiliser un HUB USB pour alimenter 4 cartes, mais pour 8 Raspberry Pi vous aurez besoin d’un meilleur approvisionnement en énergie comme une alim. Agilent. Une alimentation d’établi pourra généralement fournir 40A mais normalement 5A suffisent pour alimenter jusqu‘à 12 Raspberry Pi fonctionnant à 100% CPU, mais nous aurons besoin d’une meilleure alimentation pour un groupe de 32 cartes Raspberri Pi par exemple.
Une bonne alimentation ATX suffira pour alimenter un groupe de cartes Raspberry Pi. Dans cet exemple, j’ai une alimentation de 450W qui fournit 30A sous 5V (assurez-vous de mettre une charge sur le 5V et 12V également).

IMG_9906_skarkfun_atx_power_adapter_for_raspberry_pi_cluster

Procurez vous l’adaptateur ATX et carte de câblage chez SparkFun et veillez à utiliser plusieurs fils (0,5mm minimum) pour répartir la charge (si 1 fil surchauffe, 2 fils restent à 28 ° C utilisez au moins 4 fils si vous alimentez 8 cartes) .

IMG_9914_raspberry_pi_cluster_8_powered_by_atx_600pxComme vous pouvez le voir, sur cette photo je n’avais pas encore intégré complètement l’interface entre l’alimentation ATX et le chassis de la maquette mais ça fonctionne très bien et nous ne sommes plus limités par la connexion à l’alimentation de labo ou par les connecteurs 5V USB individuels. (les LED bleues sont celles de la carte microcontrôleur Parallax Propeller  8-core qui les utilise comme indicateur de sortie par core pour le moment).

Il fallait aussi une sorte de fusible de protection en cas de court-circuit. C’était très stressant de connecter jusqu’à 8 cartes Raspberry Pi sur l’alim. ATX les unes après les autres. Je recommande de travailler avec toutes les broches GPIO et  connecteur de câble plat.

26 janv. 2013 : J’ai maintenant 24 des 32 cartes Raspberry Pi sous tension mais l’utilisation de l’alimentation ATX n’est pas pratique car au moment du pic à 15A, le fil surchauffe. Aussi, si vous court-circuitez l’alimentation vous allez utiliser le 15A ou 40A et détruire votre fil. J’ai accidentellement court-circuité les fils sur une alimentation de 5A sur ma planche à pain en métal et le fil d’alimentation a commencé à sentir et à fondre. Cela nous amène à recommander l’alimentation d’un grand groupe de Raspberry Pi avec des alimentations séparées. En cas de court-circuit le courant reste limité à 5.2A, ce qui est assez sûr de ne pas brûler votre maison avant que vous ne vous en rendiez compte !

Installation d’alimentation recommandée pour un cluster de 32 Raspberry Pi
En limitant à 8 Raspberry par alimentation 5A vous pourrez ajouter des périphériques comme un écran Adafruit ou une carte Propeller 8-core sur le bus SPI.
C’est un peu plus cher, mais au lieu d’utiliser une alimentation d’établi 40A 350$, J’utilise 4 alimentations 5A banc séparées (3 PSC-520 à 225$ pièce et 1 Agilent U8002A à 450$).

DI 2: Mise à jour de votre carte de 512 Mo de RAM (470 Mo de 224 Mo)

Le carte Rev 2 a le double de  RAM (512 Mo), mais il faut mettre le firmware à jour pour l’activer.
https://github.com/Hexxeh/rpi-update

sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
sudo apt-get install git-core
sudo rpi-update

redémarrez après mise à jour du firmware

DI 3: Overclocking

Le SoC chauffe à 52°C lorsque leRaspberry Pi est overclocké de 700 à 800 MHz (au lieu de 45°C)

IMG_9707_52_lan_deg_800mhz_overclock

DI 4: Configuration réseau

Le module WIPI d’Element 14 fonctionne sans problème avec le Raspberry Pi (photo ci-dessous)
Le WiFi
est un peu incertain, je recommande le réseau câblé.

IMG_9718_pair_wipi

Réseau câblé

Après la duplication des 32 cartes SD, insérez-les une à une dans l’une des cartes Raspberry Pi  et modifiez hostname, hosts et les paramètres de l’interfaces réseau

sudo nano /etc/hostname
sudo nano /etc/hosts
sudo nano /etc/network/interfaces
iface eth0 inet static
address 192.168.4.101
netmask 255.255.255.0
gateway 192.168.4.1
nameserver 4.2.2.1

# Ici nous ne comptons pas sur les serveurs DNS de nos fournisseurs de services Internet nous utilisons le serveur google  4.2.2.1 car c’est un serveur DNS plus fiable

sudo nano /etc/resolv.conf
nameserver 4.2.2.1

DI 5: Java Setup

Configuration de Tomcat

tomcat_startup_600px
Identifiez-vous en utilisant « system: raspberry »

tomcat_server_info_600pxtomcat_server_status_600px

Configuration Fortran et MPICH

mpi2_1-16proc_on_4_boards_600pxmpi2_demo_600px

Le problème est la baisse des performances (surcharge du réseau probable) quand j’augmente le nombre de nœuds (actuellement à 6 RasPi)

pi@rpi0 ~ $ mpiexec -f machinefile -n 1 ~/mpich_build/examples/cpi
Process 0 of 1 is on rpi0
pi is approximately 3.1415926544231341, Error is 0.0000000008333410
wall clock time = 0.017286

pi@rpi0 ~ $ mpiexec -f machinefile -n 2 ~/mpich_build/examples/cpi
Process 0 of 2 is on rpi0
Process 1 of 2 is on rpi1
pi is approximately 3.1415926544231318, Error is 0.0000000008333387
wall clock time = 0.020435

pi@rpi0 ~ $ mpiexec -f machinefile -n 4 ~/mpich_build/examples/cpi
Process 1 of 4 is on rpi1
Process 0 of 4 is on rpi0
Process 2 of 4 is on rpi2
Process 3 of 4 is on rpi3
pi is approximately 3.1415926544231239, Error is 0.0000000008333307
wall clock time = 0.037727

pi@rpi0 ~ $ mpiexec -f machinefile -n 6 ~/mpich_build/examples/cpi
Process 2 of 6 is on rpi0
Process 1 of 6 is on rpi1
Process 0 of 6 is on rpi2
Process 3 of 6 is on rpi3
Process 4 of 6 is on rpi4
Process 5 of 6 is on rpi5
pi is approximately 3.1415926544231239, Error is 0.0000000008333307
wall clock time = 0.043331

Matériel utilisé

32 planches Raspberry Pi Element 14 à 35$ =  1120$
32 cartes SD Sandisk Ultra 16 Go à 10-18 $ = 320 à 576 $
0 câble micro USB = 0 $
1 câble HDMI d’Apple = $ 20
8 câbles d’alimentation à 10$ =  80 $
4 alimentations 5A d’Agilent ou Circuit-Test à 224-450$ = 896 à 1800 $
4 grandes planches à pain (qui permettent de monter 8 RasPi) à 45 $ = 180 $
64 connecteurs Arduino pliables de www.evilmadscience.com à 1$ =  64$
5 switch 8 ports gigabit ou 2 switch 16 ports Dlink 65$ =  325$
32 câbles réseau Belkin – Apple Store à 15$ =  480$

 

Complément (11/2/2015)

Jérôme a trouvé cet article en faisant des recherches sur le Raspberry Pi. Je vous livre ses commentaires ci-dessous :

Bonjour Monsieur.
Suite à la sortie du nouveau PI 2, je suis allé jeter un coup d’œil sur votre site. Je cherchais aussi des informations sur le PI et la FM.
Je suis tombé sur cet article du cluster à 32 PIs !!!
Les mauvais résultats obtenus ne sont pas très surprenants !!! Java est un non-sens pour le calcul scientifique !!! Dans la réalité, Fortran, C et C++ sont utilisés. Pourtant, les processeurs ARM sont puissants pour faire du calcul scientifique !
J’ai écris ce petit article, en anglais, pour montrer ce que l’on pouvait tirer d’un processeur ARM. J’ai acheté une Nexus 7 en 2012… J’ai été très déçu des résultats… En ayant contacté Google, on m’a déclaré que je n’obtiendrai rien de mieux…
J’ai réussi à avoir un gain de X20 par rapport à ce qui se fait de mieux avec les outils Google et associé à JAVA. J’obtiens un résultat semblable à un processeur Intel à 2,1 GHz pour mon processeur ARM de ma Neuxs 7 à un peu plus de 1 GHz… avec le même compilateur, GCC, seule les options de compilation changent… Ce qui était assez logique à prévoir 2 instructions/clock, ce qui revient au même in fine pour le cœur ARM…
lien mon article :
http://www.learnopengles.com/how-powerful-is-your-nexus-7/
cité en référence dans les articles sur les superordinateurs de poche(puce Nvidia…)
http://www.techenablement.com/battery-powered-supercomputing-for-the-masses-first-impression-of-the-nvidia-jetson-tk1-board/
Donc il doit être possible de faire de très bonnes choses en calcul avec le Raspberry Pi 2 (ARM V7) encore plus sous forme de cluster mais pas avec Java ou Python !!!

Sources

Share Button

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. .

4 réflexions au sujet de « 32 Raspberry Pi pour du calcul parallèle en Java »

    1. François MOCQ Auteur de l’article

      Bonjour Luc
      eh oui…. on a abandonné les mini ordinateurs pour le PC et maintenant on virtualise les postes de travail … dans un serveur…? La roue tourne ! donc on repasse forcément au même point 🙂
      cordialement
      François

      Répondre
  1. Ping : 10 raspberry pi cluster | all about raspberry spec and uses

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.