monter un cluster de raspberry pi

Comment Faire un Cluster de Raspberry Pi ? (Guide Complet)

Vous possédez plusieurs Raspberry Pi chez vous ? Et vous voulez les associer pour tenter de créer un cluster ?
Si tel est le cas, vous êtes au bon endroit ! Quand j’ai acquis mon deuxième Raspberry Pi, j’ai immédiatement voulu construire un cluster.

Un cluster de Raspberry Pi peut être créé en installant le même système d’exploitation, les mêmes applications et bibliothèques sur tous les nœuds. Ensuite, l’application MPICH permet d’exécuter une commande sur tous les nœuds en même temps.

Ce sujet peut paraitre complexe pour les débutants, je commencerai donc par une petite introduction sur les clusters en général. Je vous expliquerai ensuite ce que j’ai fait et comment vous pouvez faire de même de votre côté.

Introduction aux clusters

Qu’est-ce qu’un cluster ?

Fondamentalement, un cluster (une grappe en français) est un groupe d’ordinateurs ne formant qu’une seule entité.
L’objectif est de les faire travailler ensemble pour améliorer les performances globales.
Tous les ordinateurs dans un cluster travaillent sur la même tâche, réduisant le temps nécessaire pour terminer celle-ci.

Ne confondez pas les clusters avec l’équilibrage de charge.
En équilibrage de charge, chaque ordinateur travaille sur une tâche différente pour diminuer la charge du nœud maître.
Dans un cluster, nous profitons de la puissance totale pour exécuter une tâche en parallèle.

Exemples de clusters

Les clusters informatiques trouvent leurs origines dans les années 60 (en même temps que les premiers travaux sur la mise en réseau) et sont encore utilisés aujourd’hui.

Le premier cluster informatique commercial de l’histoire est l’Arcnet (voir l’image à gauche).
Son objectif était de connecter des groupes d’ordinateurs Datapoint 2200.
C’est sacrément vieux dans l’histoire de l’informatique 🙂

À l’heure où j’écris ces lignes, l’IBM Summit du laboratoire ORNL est le plus grand supercalculateur du monde.
Avec plus de 2 millions de cœurs (CPU cores) et 3 000 To de RAM, et ne cessant de s’agrandir, il sera difficile de rivaliser avec nos Raspberry Pi. Voici, ci-dessous, une photo si vous voulez voir à quoi il ressemble :


Summit d’IBM (source : ornl.gov)

Intérêt d’un cluster de Raspberry Pi

Revenons à des dimensions plus réalistes avec l’adaptation de cette définition à nos Raspberry Pi.

Comme vous le savez, le Raspberry Pi n’est pas très puissant, mais il est bon marché.
Cela en fait l’ordinateur parfait pour construire un cluster à moindre coût chez vous.
Nous pouvons faire en sorte d’exécuter des tâches plus rapidement grâce à 4 Raspberry Pi au lieu d’un seul, pour un prix raisonnable.

Dans ce tutoriel, je vais vous montrer comment créer votre premier cluster de Raspberry Pi.
Vous pouvez créer un cluster avec deux nœuds pour démarrer et en ajouter d’autres par la suite.

Préparer votre cluster de Raspberry Pi

Faites un plan

C’est toujours une bonne idée de prévoir à l’avance ce que vous allez construire.
Je fais cet exercice pour vous, avec deux Raspberry Pi :

  • Un Raspberry Pi 4B 4G : le nœud maître qui va contrôler l’ensemble
  • Un Raspberry 3B+ : un second nœud, pour augmenter les performances globales

Comme la phase de préparation peut être assez longue (surtout si vous allez utiliser de nombreux nœuds), je prépare le 4B seulement.
Ensuite, je vais cloner la carte SD sur une autre, pour obtenir un Raspberry Pi 3B+ presque prêt à l’emploi sans avoir à refaire toute la phase de préparation.
Pour finir, il y a quelques étapes supplémentaires pour les deux Raspberry Pi afin de les relier entre eux et exécuter le premier script sur le cluster.

Si vous souhaitez ajouter des nœuds supplémentaires, vous n’avez qu’à répéter le processus sur chaque nouveau nœud.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de :

  • 2 Raspberry Pi ou plus (n’importe quel modèle, mais je recommande vivement le Raspberry Pi 4B)
  • Une carte SD disponible pour chaque Raspberry Pi (allez voir ma page de produits recommandés si vous avez besoin de cartes SD)
  • Un switch Gigabit à 5 ports bon marché (ou plus selon le nombre de Raspberry Pi) pour brancher tous les RPi ensemble
  • Des câbles d’alimentation ou une power bank avec 2 ports ou plus
  • Un câble réseau pour chaque RPi (le sans-fil est possible, mais pas optimal)
  • Facultatif : si cela représente un projet sérieux, cette tour spéciale cluster peut être utile pour empiler les Raspberry Pi et éviter le désordre.
    Cette tour optimisera votre câblage, gardera le tout bien rangé et permettra de refroidir les nœuds correctement. Je recommande vivement ce type d’accessoire si vous comptez faire fonctionner votre cluster sur une longue période.

Pour la partie logicielle, je vais tout vous expliquer dans les parties suivantes.

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Remarque : il est possible d’utiliser des cartes SD de différentes capacités, mais vous devez installer le maître sur la plus petite carte SD.
Sinon, vous rencontrerez un problème pour flasher une image de 64 Go sur une carte SD de 16 Go :).

Préparez le système maître

Le processus consiste à effectuer l’installation sur un Raspberry Pi, puis à le dupliquer sur les autres.
Commencez avec votre Raspberry Pi le plus puissant.

Installation basique

Comme pour la plupart des projets, nous allons commencer avec l’installation de Raspberry Pi OS.
Téléchargez la version Lite sur le site web officiel de la Fondation Raspberry Pi : lien ici.
La version Desktop convient également, mais nous n’avons pas besoin d’une interface graphique pour ce projet.

Installez Raspberry Pi OS et effectuez le premier démarrage (si vous ne savez pas comment installer RPI OS sur un Raspberry Pi, suivez mon guide et revenez plus tard).

Ensuite, vous devez suivre ces étapes :

  • Modifier quelques paramètres avec raspi-config :
    • Exécutez raspi–config :
      sudo raspi-config
    • Modifiez le mot de passe de l’utilisateur pi dans « System options > Password ».
      Comme nous allons activer SSH, ce n’est pas une bonne idée de laisser le mot de passe par défaut.
    • Activez SSH dans « Interface options > SSH ».
    • Modifiez le nom d’hôte dans « System options > Host name ».
      Choisissez quelque chose de logique, comme « master » (maitre en anglais)
  • Mettre à jour votre système :
    • Comme toujours, démarrez vos projets avec un système à jour pour éviter tout problème. Mettez à jour les sources du dépôt :
      sudo apt update
    • Mettez à niveau tous les paquets :
      sudo apt upgrade
  • Redémarrer pour appliquer toutes les modifications :
    sudo reboot

L’installation de base est maintenant terminée, nous pouvons passer à l’installation de paquets spécifiques pour ce projet.

Installation de MPICH

Qu’est-ce que MPICH ?

MPICH est le principal outil dont nous avons besoin pour créer un cluster.
MPICH est une implémentation gratuite de la norme MPI.
MPI signifie « Message Passing Interface » et son objectif est de gérer les architectures de calcul en parallèle.

Bref, c’est ce qui va nous permettre d’exécuter un script sur plusieurs Raspberry Pi simultanément.

Installation de MPICH

Nous sommes maintenant prêts à démarrer le processus d’installation de MPICH.
Si vous souhaitez obtenir la dernière version, vous pouvez télécharger MPICH à partir du site officiel et le compiler à partir des sources, mais il est également disponible dans le dépôt officiel de Raspberry Pi OS.

La méthode la plus simple pour installer ce paquet est la commande suivante :
sudo apt install mpich

Une fois effectué, testez le paquet pour vous assurer que tout fonctionne bien.
Pour ce faire, exécutez cette commande par exemple :
mpiexec -n 1 date

Si vous obtenez la date actuelle du maître, l’installation de MPICH est fonctionnelle.

Créer un script Python basique

Ok, maintenant, nous allons créer un script Python basique pour tester MPICH.

  • Accédez à votre dossier personnel et créez un script :
    cd /home/pi
    nano test.py
  • Collez cette ligne à l’intérieur (ou ce que vous voulez) :
    print("Hello")
  • Assurez-vous que votre script soit exécuté directement avec Python :
    test.py python
    Si vous avez suivi mon exemple, ce script devrait afficher « Hello »
  • Puis essayez de l’exécuter sur 4 threads avec MPICH :
    mpiexec -n 4 python test.py
    Cela devrait maintenant afficher « Hello » quatre fois. Nous pouvons donc exécuter un script Python 4 fois, en utilisant tous les cœurs disponibles du processeur.

C’est bien joli, mais nous n’utilisons pas le cluster pour le moment, c’est juste un moyen d’exécuter un script sur plusieurs threads.

Installation de MPI4PY

Qu’est-ce que MPI4PY ?

Pour avancer dans la création de notre cluster, nous avons besoin d’une bibliothèque à utiliser dans le script. Le but de cette bibliothèque est d’avoir une communication entre tous les nœuds, pour exécuter efficacement nos programmes.

Sur les Raspberry Pi, MPICH peut être utilisé directement dans les scripts Fortran et C uniquement. Mais comme le Raspberry Pi fonctionne avec Python, nous devons ajouter la fonction Python à notre cluster.

Pour faire cela, nous avons besoin d’installer une bibliothèque Python : MPI4PY.

Prérequis pour MPI4PY

Le processus d’installation de MPI4PY est facile, car il est disponible avec pip (le gestionnaire de paquets Python). Mais vous devez installer certains paquets avant toute chose :
sudo apt install python-pip python-dev libopenmpi-dev

Ensuite, passez à la procédure d’installation.

Installation de MPI4PY

Nous pouvons maintenant installer la bibliothèque MPI4PY avec pip :
sudo pip install mpi4py
Cela peut prendre un certain temps selon votre modèle de Raspberry Pi. Soyez patient.

Si tout se déroule correctement, votre installation sur le maître est prête.
MPICH peut maintenant exécuter des scripts Python et nous pouvons commencer la préparation des autres nœuds.

Dupliquer le maître

La prochaine étape est de dupliquer la carte SD du maître sur les cartes SD des autres nœuds – une pour chaque nœud.
Pour faire cela, nous allons créer une image de la carte SD et la flasher sur les autres cartes.

Si vous réalisez l’opération avec seulement deux nœuds, il peut être plus rapide de répéter la procédure d’installation plutôt que de cloner la carte SD du maitre. Dans ce cas, vous pouvez ignorer cette section.

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Créer l’image

Sous Windows, vous avez besoin d’un logiciel tel que Win32DiskImager.
Cliquez sur le lien, téléchargez et installez-le sur votre ordinateur :

  • Démarrez le programme.
  • Dans le champ « Image File » (Fichier image), choisissez un répertoire temporaire et un nom de fichier tel que « cluster_master.img ».
  • Choisissez ensuite la lettre du lecteur correspondant à la carte SD.
  • Enfin, appuyez sur le bouton « Read » (Lire) pour démarrer la création de l’image.
    Ce processus a pris environ 15 minutes sur mon ordinateur.
  • Une fois terminé, éjectez la carte SD principale et conservez-la en lieu sûr.

Sous Linux, cela devrait être quelque chose comme :
sudo dd if=/dev/sdb > cluster_master.img
Vous devez vous assurer que /dev/sdb est bien votre carte SD. Vous pouvez facilement trouver de l’aide pour cette commande si nécessaire (ou utiliser man dd pour voir toutes les options).

Créer une carte SD pour les autres nœuds

Une fois que l’image est prête, vous pouvez créer les cartes SD pour chaque nœud de votre cluster :

  • Insérez la nouvelle carte SD dans votre ordinateur.
  • Dans Win32 Disk Imager, sélectionnez le nom du fichier image et la lettre du lecteur.
  • Cliquez sur « Write » (Ecrire) pour flasher l’image sur la carte SD et ainsi créer un clone.

Si vous préférez, vous pouvez utiliser Etcher pour faire la même chose.
J’utilise généralement Etcher, mais nous étions déjà avec Win32 Disk Imager et le principe est identique.
Pour rappel, vous devez utiliser une carte SD de capacité égale ou supérieure à l’originale.

Une fois encore, pour les utilisateurs de Linux et MacOs, vous pouvez utiliser la commande dd si vous ne voulez pas installer Etcher.

À la fin de cette étape, vous disposez d’une carte SD pour chaque nœud que vous souhaitez utiliser. Toutes les cartes SD contiennent la même image du maitre que nous avons créé auparavant.

Configuration des nœuds

Démarrer tous les Raspberry Pi

  • Insérez une carte SD dans chaque Raspberry Pi que vous souhaitez utiliser.
  • Démarrez-les tous.

Si vous souhaitez utiliser le Wi-Fi pour un ou plusieurs nœuds, il y a une étape supplémentaire.
Par exemple, dans mon cas, j’ai un Raspberry Pi Zero, c’était plus simple de le connecter à mon réseau via le Wi-Fi.

  • Branchez un écran et un clavier sur le Raspberry Pi sur lequel vous souhaitez utiliser le Wi-Fi.
  • Utilisez raspi-config pour configurer le Wi-Fi :
    • Utilisez la suivante commande :
      sudo raspi-config
    • Allez dans System options > Wireless LAN.
    • Suivez l’assistant pour sélectionner votre réseau (pays, SSID et mot de passe).

Trouver toutes les adresses IP

Une fois que tous les Raspberry Pi sont démarrés et connectés au réseau, nous avons besoin de connaitre toutes les adresses IP pour les utiliser plus tard :

  • Revenez au nœud maître (directement ou avec SSH).
  • Installez NMAP :
    sudo apt install nmap
    nmap est un outil gratuit de découverte du réseau (consultez le site Web ici).
    Nous allons l’utiliser pour trouver toutes les adresses IP.
  • Utilisez cette commande pour rechercher tous les périphériques de votre réseau avec un nom d’hôte contenant « master ».
    Pour le moment, tous les Raspberry Pi ont le même nom d’hôte :
    nmap -sP 192.168.1.* | grep master
    Changez le sous-réseau si vous en utilisez un autre.
  • Vous devriez obtenir ce type de résultat :
  • Je connais maintenant l’IP de mon deuxième nœud : 192.168.1.18

Vous devriez maintenant avoir les adresses IP de tous les nœuds.
Si vous ne connaissez pas celle du maître, vous pouvez utiliser cette commande :
sudo ifconfig

Vous obtiendrez quelque chose comme ça :

L’adresse IP est sur la deuxième ligne après le mot-clé « inet » (192.168.1.200 dans cette capture d’écran).
La dernière étape consiste à noter ces adresses IP dans un fichier texte sur votre nœud maître :

  • Créer un nouveau fichier dans votre dossier home :
    cd /home/pi
    nano nodes_ips
  • Dans ce fichier, ajoutez les adresses IP des nœuds, une par ligne (et uniquement l’adresse IP).
    Par exemple :
    192.168.1.15
    192.168.1.16
    192.168.1.17
    192.168.1.18
  • C’est tout pour cette partie.

Changer les noms d’hôte des nœuds

Nous allons maintenant changer le nom d’hôte sur les nouveaux nœuds pour qu’ils soient uniques :

  • Depuis le nœud maître, connectez- vous au second nœud avec SSH :
    ssh pi@192.168.1.18
    Répondez « yes » (oui) à la question et entrez le mot de passe pour pi.
  • Allez dans raspi-config :
    • Utilisez cette commande pour accéder à l’outil :
      sudo raspi-config
    • Allez dans System options > Host name.
    • Définissez un nouveau nom d’hôte pour ce nœud, par exemple « node1 » (noeud1 en anglais)
  • Quittez raspi-config et quittez ce nœud avec : exit

Répétez ces étapes pour chaque nœud que vous souhaitez à ajouter au cluster.

Échanger les clés SSH

La dernière étape consiste à permettre au maître de se connecter à chaque nœud via SSH sans mot de passe. Pour faire cela, vous devez créer une clé SSH sur le maître et la transférer à tous les nœuds.

  • Sur le maître, créez la clé SSH avec :
    ssh -keygen -t rsa
    Acceptez les valeurs par défaut (chemin par défaut et pas de mot de passe).
  • Cet outil génère deux clés dans le fichier /home/pi/.dossier ssh :
    • id _rsa : votre clé privée, conservez-la ici
    • id_rsa.pub : la clé publique, vous devez l’envoyer aux nœuds auxquels vous souhaitez accéder sans mot de passe.
  • Transférez la clé publique sur tous les nœuds :
    scp /home/pi/.ssh/id_rsa.pub pi@192.168.1.18:/home/pi/master.pub
    Faites ceci pour chaque nœud que vous souhaitez utiliser.
  • Ensuite, allez sur chaque nœud et ajoutez la clé dans le fichier authorized_keys.
    Ce fichier contient tous les hôtes autorisés à accéder au système via SSH sans mot de passe :
    ssh pi@192.168.1.18
    cat master.pub >> .ssh/authorized_keys
    exit

    Faites ceci pour chaque nœud.
    Si le dossier n’existe pas, créez-le simplement avec :
    mkdir .ssh
  • Maintenant, vous devriez être en mesure de vous connecter à chaque nœud sans mot de passe.
    Vous pouvez essayer avec :
    ssh pi@192.168.1.18

Ça y est, votre cluster est prêt. Nous allons maintenant le tester !

Utilisation du cluster

Le cluster est maintenant opérationnel et nous utiliserons MPICH pour exécuter des commandes simultanément sur chaque nœud. Comme nous l’avons déjà vu, MPICH vous permet d’exécuter des commandes et des scripts basiques sur le cluster.

Commandes basiques

La première chose que nous pouvons essayer est d’exécuter la même commande sur chaque nœud.
De préférence quelque chose qui ne renvoie pas la même chose :).

Par exemple :
mpiexec -hostfile nodes_ips -n 8 hostname

nodes _ips est le fichier que nous avons créé auparavant avec, à l’intérieur, toutes les adresses IP.
« hostname » est la commande que nous voulons exécuter sur chaque nœud.
8 correspond au nombre de threads à démarrer, dans votre cas changez-le pour le nombre de cœurs disponibles dans votre cluster (les Raspberry Pi 4B et 3B + ont 4 cœurs chacun, donc je teste avec 8).

En sortie, vous devriez obtenir une ligne pour chaque thread du cluster, chaque nœud renvoyant son nom d’hôte.

Script Python

Script de test

Si vous avez suivi ce tutoriel depuis le début, vous devriez déjà avoir un script test.py dans le dossier home. Vous pouvez tenter de l’exécuter sur le cluster avec la commande suivante :
mpiexec -hostfile nodes_ips -n 8 python test.py

Cela devrait afficher « Hello » deux fois, une ligne pour chaque nœud.
Cependant, nous n’utilisons toujours pas MPI4PY, mais nous y arrivons.

Créer un nouveau script

Rappelez-vous que, après le clonage des cartes SD, vous devez créer les nouveaux scripts sur tous les nœuds.
MPICH appel l’exécution du script sur chaque nœud, mais il ne copie pas le fichier automatiquement.

Pour ce faire, suivez cette procédure simple :

  • Créez le script sur le nœud maître.
  • Assurez-vous qu’il fonctionne comme prévu.
  • Transférez ensuite ce script sur tous les nœuds avec scp :
    scp /home/pi/myscript.py pi@192.168.1.18:/home/pi/
    Il est important d’avoir strictement le même script sur chaque nœud, et avec le même chemin.
  • Ensuite, vous pouvez exécuter votre script avec MPICH comme expliqué précédemment.

Pour aller plus loin avec Python

Comme je vous l’ai dit, nous n’avons pas ajouté MPI4PY juste pour exécuter des scripts python 4 fois au lieu d’une.
MPI4PY est une bibliothèque Python que vous pouvez inclure dans vos scripts pour utiliser des fonctions spécifiques dans votre cluster.

Voici est un exemple rapide :

#!/usr/bin/env python
from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.rank
if rank == 0:
    data = {'a':1,'b':2,'c':3}
else:
    data = None
data = comm.bcast(data, root=0)
print 'rank',rank,data

Le but de ce script est d’envoyer les données d’un thread ou d’un nœud à tous les autres.
Dans ce script, les données sont définies uniquement pour le premier thread sur le maître (rank 0). Puis nous synchronisons ces données avec toutes les instances en cours d’exécution avec la fonction de diffusion (comm.bcast).

Voici la commande à exécuter pour essayer cet exemple :
mpirun.openmpi -np <threads> -machinefile nodes_ips python mpi4py.py

Lorsque vous exécutez ce script, tous les nœuds, peu importe leur rang (rank), affichent le même message :

C’est juste un exemple pour vous montrer que vous pouvez ajouter des fonctions avancées dans vos scripts Python et tirer pleinement parti de votre cluster.
Je ne suis pas un expert en la matière, mais vous pourrez trouver plus d’informations ici.

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Rappel: J'ai crée une communauté d'utilisateurs de Raspberry Pi qui vous permet de partage vos avancées, poser vos questions et recevoir de nombreux avantages exclusifs (anglophones uniquement). Cliquez sur le lien pour en savoir plus.

Questions liées

Puis-je ajouter plus de nœuds dans mon cluster maintenant ? Vous pouvez ajouter plus de nœuds à votre cluster existant à tout moment (c’est ce qui est fait avec les supercalculateurs). Vous avez simplement besoin de créer une nouvelle carte SD, suivez les étapes de configuration pour le nouveau nœud et ajoutez la nouvelle adresse IP dans le fichier nodes_ips.

Les adresses IP changent tous les jours, qu’est-ce que je peux faire ? Oui, c’est un problème. Pour le test, je n’ai pas inclus cette étape, mais si vous voulez garder votre cluster actif vous aurez besoin de le faire. En fonction de votre réseau, vous pouvez surement définir des réservations dans votre serveur DHCP (chaque RPi obtiendra toujours la même IP au démarrage). Ou vous pouvez définir manuellement une adresse IP statique dans la configuration réseau des RPi (j’explique comment faire à la fin de cet article).

Pour quel type d’utilisation ai-je vraiment besoin d’un cluster ? Dans ce tutoriel, c’est principalement la technologie et le processus d’installation qui m’intéressait. Et non les possibilités qui sont maintenant disponibles avec ce cluster. C’est un autre sujet et je ne peux pas tout mettre dans un seul article. Si vous souhaitez aller plus loin, vous trouverez plus de projets en relation avec les clusters sur Hackaday.

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Conclusion

Ça-y-est !, vous savez maintenant comment créer votre cluster de Raspberry Pi avec une infinité de nœuds :).

J’ai vraiment aimé écrire ce tutoriel pour vous. Il est intéressant d’avoir une vue d’ensemble sur la façon dont les supercalculateurs fonctionnent. Et la technologie semble être stable, car je n’ai eu aucun problème en créant mon cluster (et c’est rare en informatique ^^). J’espère que vous apprécierez aussi !

À propos, vous pouvez consulter mon article sur ce que peut être l’utilisation réelle d’un cluster de Raspberry Pi.

Si vous avez des questions ou des expériences à partager, laissez un commentaire ci-dessous. Je suis curieux de savoir ce que vous allez faire maintenant que je vous ai introduit dans le monde des supercalculateurs 🙂


Ce tutoriel ne marche plus à 100%? Prévenez-moi pour que je le mette à jour!

Publications similaires

Laisser un commentaire

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