super user
, capable d'utiliser la commande sudo
./opt/bio
(afin d'avoir les mêmes applications), /home
(pour que les RPi puissent écrire sur le même espace) et tout autre répertoire nécessaire (par exemple, /shares/data
pour le stockage des données partagées). /etc/hosts
:
# Sur gru % sudo hostnamectl set-hostname gru # Sinon, sur chaque noeud de calcul: % sudo hostnamectl set-hostname minion0x
/etc/hosts
de tous les ordis qui feront partie de la grappe en inscrivant les infos associant nom de serveur et adresse IP. Par exemple, pour une grappe de 5 ordis où gru
est le contrôleur et les ordis minion01
à minion04
seront les noeuds de calcul, on écrit ceci à la fin du fichier (les valeurs *.a.xy0 à *.a.xy4 sont évidemment spécifiques à votre réseau):
# Super Clafoutis 192.168.a.xy0 gru 192.168.a.xy1 minion01 192.168.a.xy2 minion02 192.168.a.xy3 minion03 192.168.a.xy4 minion04
/etc/hosts
pour y mettre ses propres entrées à chaque mise à jour cloud.cfg
qui se trouve sous /etc/cloud
:
% sudo nano /etc/cloud/cloud.cfg
#
) devant cette ligne et sauvegarder le fichier:
# Cette ligne... update_etc_hosts: true # ...devient: #update_etc_hosts: true
# Sur gru | Pas besoin d'utiliser de phrase d'accès donc simplement presser enter lorsque demandé % ssh-keygen -t rsa # On copie la clé sur chaque minion % for i in {1..4}; do ssh-copy-id monUsager@minion0$i;done
slurm
et des scripts exécutés, les identificateurs d'usager (UUID) et de groupe (GUID) doivent être identiques à ceux du serveur NFS pour tous les RPi de la grappe. Si nécessaire, il faudra les modifier dans les fichiers /etc/passwd
et /etc/group
de chaque RPi.
% sudo apt install -y munge libmunge-dev
munge
sera créé sur chaque système, le processus munged
sera démarré par cet usager et les permissions nécessaires seront données au répertoire /etc/munge
et /etc/default/munge
/etc/default/munge
de chaque ordi de la grappe, insérer la ligne suivante dans le fichier /etc/default/munge
(par ex., via nano
) ou retirer le dièse (#) pour décommander la ligne si elle est présente:
OPTIONS="–syslog –key-file /etc/munge/munge.key"
gru
qui sera utilisée pour les communications entre les noeuds. L'installation de munge
via apt
en crée une mais je suis un tantinet parano…:
% sudo -u munge mungekey --force --verbose
mungekey
crée une clé de 1024 bits, bien assez pour un usage de labo, sous /etc/munge
munge
et vérifier qu'il fonctionne (les lignes affichées ne devraient pas contenir le mot ERROR
ou FAILED
…):
% sudo -u munge systemctl start munge && systemctl status munge
% for i in `seq 1 4`; do sudo scp /etc/munge/munge.key minion0${i}:/etc/munge/munge.key; done # Sur chaque minion: % sudo chown munge:munge /etc/munge/munge.key % sudo chmod 400 /etc/munge/munge.key % sudo systemctl restart munge # Vous ne devriez pas voir de message d'erreur... % systemctl status munge
# Sur chaque minion # A faire pour tous les minions pour s'assurer que ça fonctionne entre tout le monde. % ssh minion01 munge -n | unmunge # Vous devriez voir une sortie au terminal qui ressemble à ça: STATUS: Success (0) ENCODE_HOST: minion01 (192.168.1.xy1) ENCODE_TIME: 2022-07-02 10:36:24 -0400 (1656772584) DECODE_TIME: 2022-07-02 10:36:30 -0400 (1656772590) TTL: 10 CIPHER: aes128 (4) MAC: sha256 (5) ZIP: none (0) UID: bioubuntu (1030) GID: users (100) LENGTH: 0
munge
soit démarré à chaque redémarrage des serveurs:
# Sur chaque RPi de la grappe % sudo systemctl enable munge
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.mysql_secure_installation
, choisissez les paramètres les plus robustes tel que:root
(faire attention: root
de MySQL n'est pas le même que root
du système);anonymous
;root
;test
./etc/mysql/mariadb.conf.d/50-server.cnf
; dans la section InnoDB
, mettre ou décommenter les lignes suivantes:
# Sur un RPi 5 16Gb; la moitié si 8Gb innodb_buffer_pool_size=8192M innodb_log_file_size=256M innodb_lock_wait_timeout=900
slurm
, qui effectuera toutes les opérations sur les bases de données de SLURM:
# On opère MariaDB comme si c'était MySQL, en tant qu'usager root de MariaDB % mysql -u root -p # On entre dans MariaDB et le prompt mysql> vous le démontre! # Evidemment, le mot de passe est à votre discrétion… Ici, ce n'est que pour # des fins de démonstration; vous êtes averti… mysql> CREATE USER 'slurm'@'localhost' IDENTIFIED BY 'bioubuntu'; Query OK, 0 rows affected (0.16 sec)
# mysql> create database slurm_acct_db; Query OK, 1 row affected (0.04 sec)
slurm
:
# mysql> grant all privileges on slurm_acct_db.* to 'slurm'@'localhost'; Query OK, 0 rows affected (0.02 sec)
slurmdbd
sur gru
uniquement:
% sudo apt install slurmdbd
slurmdbd
, appelé /etc/slurm/slurmdbd.conf
avec les infos suivantes:
AuthType=auth/munge AuthInfo=/var/run/munge/munge.socket.2 DbdHost=localhost DbdAddr=localhost StoragePort=3306 StorageUser=slurm # Evidemment, mettre celui que vous aurez choisi ci-dessus # Ici, c'est pour l'exemple :-) StoragePass=bioubuntu StorageType=accounting_storage/mysql LogFile=/var/log/slurm/slurmdbd.log PidFile=/var/run/slurmdbd/slurmdbd.pid SlurmUser=slurm
% sudo touch /etc/slurm/accounting_password % sudo echo 'votre_mot_de_passe_mariadb_pour_usager_slurm' > /etc/slurm/accounting_password % sudo chown slurm:slurm /etc/slurm/accounting_password % sudo chown slurm:slurm /etc/slurm/slurmdbd.conf % sudo chmod 600 /etc/slurm/slurmdbd.conf % sudo systemctl enable --now slurmdbd % sudo systemctl status slurmdbd
SLURM
via apt
sur tous les RPi:
% sudo apt install -y slurmctld
slurm.conf
sous /etc/slurm
.
# sudo nano /etc/slurm/slurm.conf
# 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
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.
% 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
slurm.conf
sur tous les RPi faisant partie de la liste des noeuds de travail au même endroit sous /etc/slurm
.gru
, faites les commandes suivantes:
% sudo systemctl enable slurmctld % sudo systemctl restart slurmctld % sudo systemctl status slurmctld
/etc/slurm/slurm.conf
sur vos noeuds de travail!! Assurez-vous d'avoir les bonnes permissions:
# Sur chaque RPi de calcul % sudo clown root:root /etc/slurm/slurm.conf
slurmd
et on s'assure que ça fonctionne:
% sudo apt install -y slurmd libpmix-dev % sudo systemctl enable slurmd % sudo systemctl restart slurmd % systemctl status slurmd
% 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
gru
voit les machines:
% sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST biobunch* up 2:00:00 4 idle minion[01-04]
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:
% Sur minion01 par ex.: % sudo scontrol update nodename=minion01 state=idle
% srun --nodelist=minion[01-04] hostname minion01 minion02 minion03 minion04
Page man pour srun
: Manuel
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
.
% srun hostname minion01 % srun --nodelist=minion02 hostname minion02 % srun --nodelist=minion0[1,2] hostname minion02 minion01
Page man pour sbatch
: Manuel
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
.
À venir...
sinfo
, on peut voir la santé des noeuds de calcul de la grappe et avoir une vue d'ensemble des ressources;scontrol
, on peut voir plus spécifiquement les tâches en action et les ressources disponibles pour un noeud spécifique;sstat
, on peut voir en temps réel les détails sur une tâche en particulier;squeue
, on voit les tâches en cours et les tâches en attente de manière globale.Building a Slurm HPC Cluster with Raspberry Pi’s: Step-by-Step Guide
Building a Raspberry Pi cluster: Part I - The basics
Building a Raspberry Pi cluster: Part II - Some simple jobs
Building a Raspberry Pi cluster: Part III - OpenMPI, Python, and Parallel Jobs
SLURM in Ubuntu clusters - Part 1
SLURM in Ubuntu clusters - Part 2
Slurm Setup the Easy Way on Ubuntu 24.04: A practical guide to building your first HPC Cluster