Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
fr:install:clafoutis:ubuntu_cluster_install [2025/08/14 09:38] – [Protocole d'installation] foisysfr:install:clafoutis:ubuntu_cluster_install [2025/09/07 16:40] (Version actuelle) – [Protocole d'installation] foisys
Ligne 22: Ligne 22:
       * Un système physique d'installation des RPi, ou bien en rack ou en bloc.       * Un système physique d'installation des RPi, ou bien en rack ou en bloc.
         * Exemple [[https://www.uctronics.com/raspberry-pi/uctronics-19-1u-raspberry-pi-rack-mount-with-ssd-mounting-brackets.html|ici]] et [[https://www.uctronics.com/raspberry-pi/uctronics-desktop-cluster-enclosure-4-raspberry-pis-2-5-ssd-front-removable-trays.html|ici]] (à titre de démonstration)         * Exemple [[https://www.uctronics.com/raspberry-pi/uctronics-19-1u-raspberry-pi-rack-mount-with-ssd-mounting-brackets.html|ici]] et [[https://www.uctronics.com/raspberry-pi/uctronics-desktop-cluster-enclosure-4-raspberry-pis-2-5-ssd-front-removable-trays.html|ici]] (à titre de démonstration)
 +
 +  * Qu'en est-il de l'utilisation du processeur graphique (//GPU//) dans un contexte de calcul distribué? Il est très utile de déléguer au GPU certaines/plusieurs tâches de calcul et la bio-informatique ne fait pas exception :-) Cependant, faire ça avec les Raspberry Pi n'est pas une très bonne idée... Pourquoi?
 +    * Les meilleurs GPU demandent beaucoup, beaucoup de puissance et dégagent beaucoup, beaucoup de chaleur :-( 
 +    * Le GPU installé sur les RPI 4/5 sont bien pour gérer une interface graphique à la Xfce mais ne sont pas très puissants pour faire autre chose.
 +    * Mais le plus gros problème reste un problème logiciel. La pile logicielle la plus souvent utilisée en HPC est CUDA de Nvidia qui n'existe tout simplement pas pour les RPi. Il existe une alternative, OpenCL, mais l'utiliser sur RPi demande une interface logicielle de compatibilité, ce qui vient bouffer une partie de la puissance du GPU pour faire la conversion entre les deux éléments. De plus, il existe très peu de logiciels en bio-informatique qui utiliser OpenCL...
  
 ===== Configuration logicielle en pré-requis ===== ===== Configuration logicielle en pré-requis =====
Ligne 53: Ligne 58:
 192.168.a.xy4 minion04  192.168.a.xy4 minion04 
 </sxh> </sxh>
 +
 +  * Ubuntu a la fâcheuse manie d'effacer tout ce qui se trouve dans le fichier ''/etc/hosts'' pour y mettre ses propres entrées à chaque mise à jour :-( Il faut lui dire de ne pas faire ça! Ouvrer le fichier ''cloud.cfg'' qui se trouve sous ''/etc/cloud'':
 +<sxh bash>
 +% sudo nano /etc/cloud/cloud.cfg
 +</sxh> 
 +
 +  * Éditer le fichier en mettant un dièse (''#'') devant cette ligne et sauvegarder le fichier:
 +<sxh bash>
 +# Cette ligne...
 +update_etc_hosts: true
 +# ...devient:
 +#update_etc_hosts: true
 +</sxh> 
  
   * Pour faciliter l'accès inter-machines, utilisons l'accès SSH sans mot de passe via la création et l'installation d'une clé d'authentification:   * Pour faciliter l'accès inter-machines, utilisons l'accès SSH sans mot de passe via la création et l'installation d'une clé d'authentification:
Ligne 129: Ligne 147:
 </accordion-item> </accordion-item>
  
-<accordion-item title="Étape 2: Installation des logiciels mariadb et slurmdbd ">+<accordion-item title="Étape 2: Installation des logiciels MariaDB et SLURMDBD ">
  
   * Une grappe de calcul est la plupart du temps une ressource partagée par un ensemble. Pour assurer le suivi des opérations et de l'usage fait d'une grappe, il est nécessaire d'avoir des fonctions de journalisation spécifiques aux programmes de la suite SLURM: c'est le programme ''sacct''. Dans une grappe Super-Clafoutis, surtout destinée à une recherche individuelle, ''sacct''  est aussi très utile car c'est avec lui qu'il est possible de comprendre pourquoi des tâches ne pourraient avoir été exécutées ou complétées.   * Une grappe de calcul est la plupart du temps une ressource partagée par un ensemble. Pour assurer le suivi des opérations et de l'usage fait d'une grappe, il est nécessaire d'avoir des fonctions de journalisation spécifiques aux programmes de la suite SLURM: c'est le programme ''sacct''. Dans une grappe Super-Clafoutis, surtout destinée à une recherche individuelle, ''sacct''  est aussi très utile car c'est avec lui qu'il est possible de comprendre pourquoi des tâches ne pourraient avoir été exécutées ou complétées.
Ligne 164: Ligne 182:
 mysql> create database slurm_acct_db;  mysql> create database slurm_acct_db; 
 Query OK, 1 row affected (0.04 sec) Query OK, 1 row affected (0.04 sec)
- 
-mysql> create database slurm_job_db;  
-Query OK, 1 row affected (0.04 sec)  
 </sxh> </sxh>
  
Ligne 174: Ligne 189:
 mysql> grant all privileges on slurm_acct_db.* to 'slurm'@'localhost';  mysql> grant all privileges on slurm_acct_db.* to 'slurm'@'localhost'; 
 Query OK, 0 rows affected (0.02 sec)  Query OK, 0 rows affected (0.02 sec) 
-# 
-mysql> grant all privileges on slurm_job_db.* to 'slurm'@'localhost';  
-Query OK, 0 rows affected (0.03 sec)  
 </sxh> </sxh>
  
Ligne 215: Ligne 227:
 </accordion-item> </accordion-item>
  
-<accordion-item title="Étape 3: Installation de SLURM sur le noeud contrôleur">+<accordion-item title="Étape 3: Installation de SLURMCTLD sur le noeud contrôleur">
  
   * On commence par l'installation de ''SLURM''  via ''apt''  sur tous les RPi:   * On commence par l'installation de ''SLURM''  via ''apt''  sur tous les RPi:
- 
 <sxh bash> % sudo apt install -y slurmctld </sxh> <sxh bash> % sudo apt install -y slurmctld </sxh>
  
Ligne 224: Ligne 235:
   * Il faut maintenant créer un fichier de configuration ''slurm.conf''  sous ''/etc/slurm''.   * Il faut maintenant créer un fichier de configuration ''slurm.conf''  sous ''/etc/slurm''.
  
-<sxh bash> # sudo cp /usr/share/doc/slurm-client/examples/slurm.conf.simple.gz /etc/slurm # % cd /etc/slurm && gzip -d slurm.conf.simple.gz % sudo mv slurm.simple slurm.conf </sxh>+<sxh bash>  
 + 
 +sudo nano /etc/slurm/slurm.conf</sxh>
  
   * Il vous suffit de l'éditer pour qu'il ressemble à ceci:   * Il vous suffit de l'éditer pour qu'il ressemble à ceci:
  
-<sxh bash> ClusterName=clafoutis SlurmctldHost=gru(192.168.1.xy0) #SlurmctldHost= # #DisableRootJobs=NO #EnforcePartLimits=NO #Epilog= #EpilogSlurmctld= #FirstJobId=1 #MaxJobId=67043328 #GresTypes= #GroupUpdateForce=0 #GroupUpdateTime=600 #JobFileAppend=0 #JobRequeue=1 #JobSubmitPlugins=lua #KillOnBadExit=0 #LaunchType=launch/slurm #Licenses=foo*4,bar #MailProg=/usr/bin/mail #MaxJobCount=10000 #MaxStepCount=40000 #MaxTasksPerNode=512 MpiDefault=none #MpiParams=ports=#-# #PluginDir= #PlugStackConfig= #PrivateData=jobs ProctrackType=proctrack/linuxproc #Prolog#PrologFlags= #PrologSlurmctld= #PropagatePrioProcess=0 #PropagateResourceLimits= #PropagateResourceLimitsExcept= #RebootProgram= ReturnToService=1 SlurmctldPidFile=/run/slurmctld.pid SlurmctldPort=6817 SlurmdPidFile=/run/slurmd.pid SlurmdPort=6818 SlurmdSpoolDir=/var/lib/slurm/slurmd SlurmUser=slurm #SlurmdUser=root #SrunEpilog= #SrunProlog= StateSaveLocation=/var/lib/slurm/slurmctld SwitchType=switch/none #TaskEpilog= TaskPlugin=task/affinity #TaskProlog= #TopologyPlugin=topology/tree #TmpFS=/tmp #TrackWCKey=no #TreeWidth= #UnkillableStepProgram= #UsePAM=0 # # # TIMERS #BatchStartTimeout=10 #CompleteWait=0 #EpilogMsgTime=2000 #GetEnvTimeout=2 #HealthCheckInterval=0 #HealthCheckProgram= InactiveLimit=0 KillWait=30 #MessageTimeout=10 #ResvOverRun=0 MinJobAge=300 #OverTimeLimit=0 SlurmctldTimeout=120 SlurmdTimeout=300 #UnkillableStepTimeout=60 #VSizeFactor=0 Waittime=0 # # # SCHEDULING #DefMemPerCPU=0 #MaxMemPerCPU=0 #SchedulerTimeSlice=30 SchedulerType=sched/backfill SelectType=select/cons_res SelectTypeParameters=CR_Core # # # JOB PRIORITY #PriorityFlags= #PriorityType=priority/basic #PriorityDecayHalfLife= #PriorityCalcPeriod= #PriorityFavorSmall= #PriorityMaxAge= #PriorityUsageResetPeriod= #PriorityWeightAge= #PriorityWeightFairshare= #PriorityWeightJobSize= #PriorityWeightPartition= #PriorityWeightQOS= # # # LOGGING AND ACCOUNTING #AccountingStorageEnforce=0 #AccountingStorageHost= #AccountingStoragePass= #AccountingStoragePort= AccountingStorageType=accounting_storage/none #AccountingStorageUser= #AccountingStoreFlags= #JobCompHost= #JobCompLoc= #JobCompPass= #JobCompPort= JobCompType=jobcomp/none #JobCompUser= #JobContainerType=job_container/none JobAcctGatherFrequency=30 JobAcctGatherType=jobacct_gather/none SlurmctldDebug=info SlurmctldLogFile=/var/log/slurm/slurmctld.log SlurmdDebug=info SlurmdLogFile=/var/log/slurm/slurmd.log #SlurmSchedLogFile#SlurmSchedLogLevel#DebugFlags= # # # POWER SAVE SUPPORT FOR IDLE NODES (optional) #SuspendProgram= #ResumeProgram= #SuspendTimeout= #ResumeTimeout= #ResumeRate= #SuspendExcNodes= #SuspendExcParts= #SuspendRate= #SuspendTime= # # # COMPUTE NODES NodeName=minion01 NodeAddr=192.168.1.xy1 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN NodeName=minion02 NodeAddr=192.168.1.xy2 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN NodeName=minion03 NodeAddr=192.168.1.xy3 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN NodeName=minion04 NodeAddr=192.168.1.xy4 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN PartitionName=all Nodes=ALL Default=YES MaxTime=INFINITE State=UP </sxh>+<sxh bash>  
 +# Le nom de la grappe 
 +ClusterName=superclafoutis 
 +# Le nom du serveur sur lequel fonctionne le processus slurmctld 
 +SlurmctldHost=gru 
 +AuthType=auth/munge 
 +ProctrackType=proctrack/cgroup 
 +SchedulerType=sched/backfill 
 +SelectType=select/cons_tres 
 +Le nom de l'usager à qui appartient le processus slurmctld 
 +SlurmUser=slurm 
 +StateSaveLocation=/var/spool/slurmctld 
 +SlurmdSpoolDir=/var/spool/slurmd 
 +SlurmctldPidFile=/var/run/slurm/slurmctld.pid 
 +SlurmdPidFile=/var/run/slurm/slurmd.pid 
 +L'information pour slurmdbd 
 +AccountingStorageType=accounting_storage/slurmdbd 
 +AccountingStorageHost=gru 
 +AccountingStorageUser=slurm 
 +Les infos sur les noeuds qui feront les tâches 
 +NodeName=minion01 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN 
 +NodeName=minion02 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN 
 +NodeName=minion03 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN 
 +NodeName=minion04 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN 
 +# On regroupe tous les noeuds dans une même partition 
 +PartitionName=biobunch Nodes=ALL Default=YES MaxTime=120 State=UP 
 +</sxh>
  
-  * Remarquez que ''gru''  ne fait pas partie de la liste de noeuds de travail de la grappe. Si il y était, il recevrait des tâches ce qui le ralentirait pour le travail interactif. Assurez vous maintenant de copier ce fichier sur tous les RPi faisant partie de la liste des noeuds de travail.+  * Remarquez que ''gru''  ne fait pas partie de la liste de noeuds de travail de la grappe. Si il y était, il recevrait des tâches ce qui le ralentirait pour le travail interactif ou bien gérant une interface graphique Cependant, si ''gru'' n'accomplit aucune de ces tâches, vous pourriez l'inclure.  
 +  * Il faut terminer la configuration avec les commandes suivantes: 
 +<sxh bash> 
 +% sudo mkdir -p /var/spool/slurmctld 
 +% sudo chown slurm:slurm /var/spool/slurmctld 
 +% sudo chmod 755 /var/spool/slurmctld 
 +% sudo touch /var/log/slurm/slurmctld.log 
 +% sudo touch /var/log/slurm/slurm_jobacct.log  
 +% sudo touch /var/log/slurm/slurm_jobcomp.log 
 +% sudo chown -R slurm:slurm /var/log/slurm 
 +</sxh> 
 +  * Assurez vous maintenant de copier le fichier ''slurm.conf'' sur tous les RPi faisant partie de la liste des noeuds de travail au même endroit sous ''/etc/slurm''.
   * Sur ''gru'', faites les commandes suivantes:   * Sur ''gru'', faites les commandes suivantes:
  
-<sxh bash> % sudo systemctl enable slurmctld % sudo systemctl restart slurmctld </sxh>+<sxh bash>  
 +% sudo systemctl enable slurmctld  
 +% sudo systemctl restart slurmctld  
 +% sudo systemctl status slurmctld 
 +</sxh>
  
-  * Vous ne devriez pas voir de messages d'erreur avec la commande ''systemctl status slurmctl''Sur les noeuds de travail, on fait une tâche similaire:+  * Vous ne devriez pas voir de messages d'erreur après la dernière commande.  
 +</accordion-item> 
 +<accordion-item title="Étape 4: Installation de SLURMD sur les noeud de calcul">
  
-<sxh bash> % sudo systemctl enable slurmd % sudo systemctl restart slurmd </sxh>+  * N'oubliez pas de copier le fichier ''/etc/slurm/slurm.conf'' sur vos noeuds de travail!! Assurez-vous d'avoir les bonnes permissions: 
 +<sxh> 
 +# Sur chaque RPi de calcul 
 +% sudo clown root:root /etc/slurm/slurm.conf 
 +</sxh> 
 +  * Sur chaque noeud de travail, on installe ''slurmd''  et on s'assure que ça fonctionne: 
 +<sxh bash>  
 +% sudo apt install -y slurmd libpmix-dev 
 +% sudo systemctl enable slurmd  
 +% sudo systemctl restart slurmd 
 +% systemctl status slurmd   
 +</sxh>
  
-  * Vérifier que le contrôleur voit les machines:+  * Encore une fois, vous ne devriez pas voir d'erreur ;-) Sur chacun des noeuds de calcul, il faut ajuster les paramètres pour le stockage des journaux: 
 +<sxh> 
 +% sudo chown -R slurm:slurm /var/spool/slurmd 
 +% sudo chmod 755 /var/spool/slurmd 
 +% sudo touch /var/log/slurm/slurmd.log 
 +% sudo chown -R slurm:slurm /var/log/slurm/slurmd.log 
 +</sxh> 
  
-<sxh bash> % sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST allup infinite 1 idle minion01 </sxh>+  Vérifier que le serveur ''gru'' voit les machines:
  
-  * Si l'état (''STATE'') d'une machine est à ''drain''  ou à ''down'', exécuter la commande suivante et refaite la commande ''sinfo''  pour vérifier le retour à la normale:+<sxh bash>  
 +sinfo  
 +PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST 
 +biobunch*    up    2:00:00      4   idle minion[01-04] 
 +</sxh>
  
-<sxh bash> % Sur minion01 par ex.: % sudo scontrol update nodename=minion01 state=idle </sxh>+  * Si l'état (''STATE'') d'une machine est à ''drain''  ou à ''down'', exécuter la commande suivante sur le serveur ''gru'' et refaite la commande ''sinfo''  pour vérifier le retour à la normale: 
 + 
 +<sxh bash>  
 +% Sur minion01 par ex.:  
 +% sudo scontrol update nodename=minion01 state=idle </sxh>
  
   * Note: si à tout moment, un noeud "tombe" et doit être redémarré, il faut refaire cette commande en spécifiant le noeud en défaut.   * Note: si à tout moment, un noeud "tombe" et doit être redémarré, il faut refaire cette commande en spécifiant le noeud en défaut.
Ligne 262: Ligne 343:
  
  
 +===== Comment utiliser SLURM pour exécuter des tâches sur une grappe de calcul  =====
 +==== En utilisant la commande srun ====
 +
 +Page man pour ''srun'': [[https://manpages.ubuntu.com/manpages/noble/man1/srun.1.html|Manuel]]
 +
 +  * La commande ''srun'' exécutée sur le noeud contrôleur (dans notre cas, ''gru'') délèguera l'exécution d'une //commande// à un des noeuds de calcul. À moins que le noeud soit spécifié, l'exécution se fera via SLURM en choisissant un noeud selon la configuration utilisée par ''slurmctld''.
 +  *  Un exemple banal:
 +<sxh bash>
 +% srun hostname
 +minion01
 +% srun --nodelist=minion02 hostname
 +minion02
 +% srun --nodelist=minion0[1,2] hostname
 +minion02
 +minion01
 +</sxh>
 +
 +==== En utilisant la commande sbatch ====
 +
 +Page man pour ''sbatch'': [[https://manpages.ubuntu.com/manpages/noble/man1/sbatch.1.html|Manuel]]
 +
 +  * La commande ''sbatch'' exécutée sur le noeud contrôleur (dans notre cas, ''gru'') délèguera l'exécution d'un //script//; c'est un nuance importante car le script est capable de permettre l'exécution d'une série complexe de commandes. À moins que le noeud soit spécifié, l'exécution se fera via SLURM en choisissant un noeud selon la configuration utilisée par ''slurmctld''.
 +  *  Un exemple simple de script:
 +<sxh bash>
 +À venir...
 +</sxh>
 +
 +===== Comment suivre les opérations d'une grappe SLURM  =====
 +
 +  * Dans une grappe de calcul, on a le plus souvent besoin de suivre les paramètres suivants:
 +    * Suivre les ressources disponibles;
 +    * Comment s'exécute les tâches.
 +  * SLURM dispose d'outils de gestion permettant de voir ces paramètres: 
 +    * Avec ''sinfo'', on peut voir la santé des noeuds de calcul de la grappe et avoir une vue d'ensemble des ressources;
 +    * Avec ''scontrol'', on peut voir plus spécifiquement les tâches en action et les ressources disponibles pour un noeud spécifique;
 +    * Avec ''sstat'', on peut voir en temps réel les détails sur une tâche en particulier;
 +    * Avec ''squeue'', on voit les tâches en cours et les tâches en attente de manière globale.
 +  * Ces outils sont pratiques (évidemment!) mais une vue d'ensemble regroupant des informations de toutes ses applications est très utile :-) Il existe quelques solutions libres pour faire le suivi via une page web mais ce sont souvent des outils complexes en installation et qui en vaillent la peine pour de grosse grappes... Deux solutions plus rudimentaires mais tout à fait fonctionnelles sont disponibles:
 +    * Avec [[https://gitlab.com/lkeb/slurm_viewer|Slurm Viewer]], on utilise le terminal pour suivre les opération de la grappe, soir en regardant les nous, soit en suivante les tâches;
 +    * Avec [[https://github.com/hunoutl/slurmtop|slurmtop]], on fait pas mal la mème chose mais la présentation est différente.
 +    * C'est votre choix :-)
 ===== Références ===== ===== Références =====
 +
 +[[https://medium.com/@hghcomphys/building-slurm-hpc-cluster-with-raspberry-pis-step-by-step-guide-ae84a58692d5|Building a Slurm HPC Cluster with Raspberry Pi’s: Step-by-Step Guide]]
  
 [[https://glmdev.medium.com/building-a-raspberry-pi-cluster-784f0df9afbd|Building a Raspberry Pi cluster: Part I - The basics]] [[https://glmdev.medium.com/building-a-raspberry-pi-cluster-784f0df9afbd|Building a Raspberry Pi cluster: Part I - The basics]]