Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| fr:install:clafoutis:ubuntu_cluster_install [2025/10/22 07:38] – [Protocole d'installation] foisys | fr:install:clafoutis:ubuntu_cluster_install [2026/02/06 15:05] (Version actuelle) – [En utilisant la commande sbatch] foisys | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ===== Serveur Clafoutis: Créer une grappe de calcul Super-Clafoutis ====== | ||
| + | |||
| + | ===== Introduction ===== | ||
| + | |||
| + | * En bioinformatique, | ||
| + | * Une grappe peut-être une bête très impressionnante. Ici au Québec, les grappes de calcul [[https:// | ||
| + | * Primo: ce sont de merveilleux outils d' | ||
| + | * Secundo: pour certains usagers, faire du calcul parallèle n'est peut-être pas possible sur une infrastructure partagée. Les faibles coûts du RPi rend la construction d'une grappe basée sur eux plus facile et abordable. | ||
| + | |||
| + | |||
| + | ===== Installation du matériel ===== | ||
| + | |||
| + | * Donc, quel est le matériel nécessaire? | ||
| + | * Plusieurs Raspberry Pi 4B avec 8Gb ou Raspberry Pi 5 avec 8/16Gb et leur espace de stockage système (au minimum, des cartes MicroSD ou des clés USB de qualité avec une capacité minimale de 64Gb); | ||
| + | * Idéalement, | ||
| + | * Une alternative est une alimentation électrique capable d' | ||
| + | * Un commutateur Gigabit Ethernet, idéalement capable d' | ||
| + | * Une caractéristique souhaitable est la capacité de [[https:// | ||
| + | * Si votre NAS possède un port 10Gb Ethernet, trouver un commutateur avec un port 10Gb Ethernet disponible. | ||
| + | * Un stockage partagé de type NAS, idéalement avec 4 ports réseau 1Gb capables d' | ||
| + | * Si votre NAS possède un port 10Gb Ethernet ou bien peut accueillir une carte 10Gb Ethernet, c'est encore mieux :-). | ||
| + | * Un système physique d' | ||
| + | * Exemple [[https:// | ||
| + | |||
| + | * Qu'en est-il de l' | ||
| + | * 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' | ||
| + | |||
| + | |||
| + | ===== Configuration logicielle en pré-requis ===== | ||
| + | |||
| + | * Ces instructions assument que vous êtes l' | ||
| + | * Tous les RPi ont accès aux volumes partagés par le NAS (via NFS) sous ''/ | ||
| + | * Si nécessaire. installer les librairies nécessaires sur les noeuds de calcul. | ||
| + | * Nous installerons le système de gestion des tâches [[https:// | ||
| + | |||
| + | |||
| + | ===== Protocole d' | ||
| + | |||
| + | < | ||
| + | < | ||
| + | * Si ça n'a pas été encore fait, il faut changer le nom de chaque machine pour que ça corresponde au fichier ''/ | ||
| + | <sxh bash> | ||
| + | # Sur gru | ||
| + | % sudo hostnamectl set-hostname gru | ||
| + | # Sinon, sur chaque noeud de calcul: | ||
| + | % sudo hostnamectl set-hostname minion0x </ | ||
| + | |||
| + | * Modifiez le fichier ''/ | ||
| + | <sxh bash> | ||
| + | # 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 | ||
| + | </ | ||
| + | |||
| + | * Ubuntu a la fâcheuse manie d' | ||
| + | <sxh bash> | ||
| + | % sudo nano / | ||
| + | </ | ||
| + | |||
| + | * Éditer le fichier en mettant un dièse (''#'' | ||
| + | |||
| + | <sxh bash> | ||
| + | # Cette ligne… | ||
| + | manage_etc_hosts: | ||
| + | # …devient: | ||
| + | # | ||
| + | </ | ||
| + | |||
| + | * Pour faciliter l' | ||
| + | <sxh bash> | ||
| + | # Sur gru | Pas besoin d' | ||
| + | % ssh-keygen -t rsa | ||
| + | # On copie la clé sur chaque minion | ||
| + | % for i in {1..4}; do ssh-copy-id monUsager@minion0$i; | ||
| + | </ | ||
| + | |||
| + | * Pour le bon fonctionnement de '' | ||
| + | |||
| + | </ | ||
| + | < | ||
| + | |||
| + | * Il faut installer MUNGE sur tous les ordinateurs de la grappe: | ||
| + | |||
| + | <sxh bash> | ||
| + | % sudo apt install -y munge libmunge-dev | ||
| + | </ | ||
| + | |||
| + | * À la suite de cette opération, l' | ||
| + | |||
| + | * Dans le fichier ''/ | ||
| + | |||
| + | <sxh bash> OPTIONS=" | ||
| + | |||
| + | * Créer une clé d' | ||
| + | |||
| + | <sxh bash> % sudo -u munge mungekey –force –verbose </ | ||
| + | |||
| + | * Par défaut, '' | ||
| + | |||
| + | * Démarrer/ | ||
| + | |||
| + | <sxh bash> % sudo -u munge systemctl start munge && systemctl status munge </ | ||
| + | |||
| + | * Il faut maintenant copier la clé d' | ||
| + | |||
| + | <sxh bash> | ||
| + | % for i in `seq 1 4`; do sudo scp / | ||
| + | # Sur chaque minion: | ||
| + | % sudo chown munge:munge / | ||
| + | % sudo chmod 400 / | ||
| + | % sudo systemctl restart munge | ||
| + | # Vous ne devriez pas voir de message d' | ||
| + | % systemctl status munge | ||
| + | </ | ||
| + | |||
| + | * Il reste à vérifier que les RPi se reconnaissent: | ||
| + | |||
| + | <sxh bash> | ||
| + | # Sur chaque minion | ||
| + | # A faire pour tous les minions pour s' | ||
| + | % ssh minion01 munge -n | unmunge | ||
| + | # Vous devriez voir une sortie au terminal qui ressemble à ça: | ||
| + | STATUS: Success (0) | ||
| + | ENCODE_HOST: | ||
| + | ENCODE_TIME: | ||
| + | DECODE_TIME: | ||
| + | TTL: 10 | ||
| + | CIPHER: aes128 (4) | ||
| + | MAC: sha256 (5) | ||
| + | ZIP: none (0) | ||
| + | UID: bioubuntu (1030) | ||
| + | GID: users (100) | ||
| + | LENGTH: 0 | ||
| + | </ | ||
| + | |||
| + | * Pour s' | ||
| + | |||
| + | <sxh bash> | ||
| + | # Sur chaque RPi de la grappe | ||
| + | % sudo systemctl enable munge | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | |||
| + | * 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' | ||
| + | |||
| + | * SLURM utilise MySQL (ou sa version libre MariaDB) comme application externe pour stocker et gérer les données sur les tâches exécutées. Une installation Impilo installe le serveur et le client MariaDB mais n'en fait pas l' | ||
| + | |||
| + | * En exécutant le script '' | ||
| + | - Donner un mot de passe robuste pour l' | ||
| + | - Effacer l' | ||
| + | - Ne pas permettre de connexion externe pour '' | ||
| + | - Effacer la base de données de démonstration appelée '' | ||
| + | |||
| + | * Il faut ajouter quelques paramètres dans le fichier de config ''/ | ||
| + | |||
| + | <sxh bash> | ||
| + | # Sur un RPi 5 16Gb; la moitié si 8Gb | ||
| + | innodb_buffer_pool_size=8192M | ||
| + | innodb_log_file_size=256M | ||
| + | innodb_lock_wait_timeout=900 | ||
| + | </ | ||
| + | |||
| + | * Les premières étapes se font dans MariaDB ;-) Commençons par créer l' | ||
| + | |||
| + | <sxh bash> | ||
| + | # On opère MariaDB comme si c' | ||
| + | % 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; | ||
| + | mysql> CREATE USER ' | ||
| + | Query OK, 0 rows affected (0.16 sec) </ | ||
| + | |||
| + | * Ensuite on crée les bases de données nécessaires: | ||
| + | |||
| + | <sxh bash> | ||
| + | # | ||
| + | | ||
| + | Query OK, 1 row affected (0.04 sec) </ | ||
| + | |||
| + | * On termine la mise en place sur MySQL en donnant les permissions nécessaires à l' | ||
| + | |||
| + | <sxh bash> | ||
| + | # | ||
| + | mysql> grant all privileges on slurm_acct_db.* to ' | ||
| + | Query OK, 0 rows affected (0.02 sec) </ | ||
| + | |||
| + | * On installe le package '' | ||
| + | |||
| + | < | ||
| + | % sudo apt install slurmdbd | ||
| + | </ | ||
| + | |||
| + | * Il faut créer un fichier de configuration pour '' | ||
| + | |||
| + | <sxh bash> | ||
| + | AuthType=auth/ | ||
| + | AuthInfo=/ | ||
| + | DbdHost=localhost | ||
| + | DbdAddr=localhost | ||
| + | StoragePort=3306 | ||
| + | StorageUser=slurm | ||
| + | # Evidemment, mettre celui que vous aurez choisi ci-dessus | ||
| + | # Ici, c'est pour l' | ||
| + | StoragePass=bioubuntu | ||
| + | StorageType=accounting_storage/ | ||
| + | LogFile=/ | ||
| + | PidFile=/ | ||
| + | SlurmUser=slurm </ | ||
| + | |||
| + | * Assurez-vous d' | ||
| + | |||
| + | <sxh bash> | ||
| + | % sudo touch / | ||
| + | % sudo echo ' | ||
| + | % sudo chown slurm:slurm / | ||
| + | % sudo chown slurm:slurm / | ||
| + | % sudo chmod 600 / | ||
| + | % sudo systemctl enable –now slurmdbd | ||
| + | % sudo systemctl status slurmdbd </ | ||
| + | |||
| + | * Vous ne devriez pas voir de message d' | ||
| + | |||
| + | </ | ||
| + | |||
| + | < | ||
| + | |||
| + | * On commence par l' | ||
| + | |||
| + | <sxh bash> | ||
| + | % sudo apt install -y slurmctld | ||
| + | </ | ||
| + | |||
| + | * À la suite de cette opération, tous les RPi auront les bons répertoires avec les bonnes permissions ;-) | ||
| + | * Il faut maintenant créer un fichier de configuration '' | ||
| + | |||
| + | <sxh bash> | ||
| + | # sudo nano / | ||
| + | </ | ||
| + | |||
| + | * Il vous suffit de l' | ||
| + | |||
| + | <sxh bash> | ||
| + | # Le nom de la grappe | ||
| + | ClusterName=superclafoutis | ||
| + | # Le nom du serveur sur lequel fonctionne le processus slurmctld | ||
| + | SlurmctldHost=gru | ||
| + | AuthType=auth/ | ||
| + | ProctrackType=proctrack/ | ||
| + | SchedulerType=sched/ | ||
| + | SelectType=select/ | ||
| + | # Le nom de l' | ||
| + | SlurmUser=slurm | ||
| + | StateSaveLocation=/ | ||
| + | SlurmdSpoolDir=/ | ||
| + | SlurmctldPidFile=/ | ||
| + | SlurmdPidFile=/ | ||
| + | # L' | ||
| + | AccountingStorageType=accounting_storage/ | ||
| + | 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 </ | ||
| + | |||
| + | * Remarquez que '' | ||
| + | * Il faut terminer la configuration avec les commandes suivantes: | ||
| + | |||
| + | <sxh bash> | ||
| + | % sudo mkdir -p / | ||
| + | % sudo chown slurm:slurm / | ||
| + | % sudo chmod 755 / | ||
| + | % sudo touch / | ||
| + | % sudo touch / | ||
| + | % sudo touch / | ||
| + | % sudo chown -R slurm:slurm / | ||
| + | |||
| + | * Assurez vous maintenant de copier le fichier '' | ||
| + | * Sur '' | ||
| + | |||
| + | <sxh bash> | ||
| + | % sudo systemctl enable slurmctld | ||
| + | % sudo systemctl restart slurmctld | ||
| + | % sudo systemctl status slurmctld </ | ||
| + | |||
| + | * Vous ne devriez pas voir de messages d' | ||
| + | |||
| + | </ | ||
| + | |||
| + | * N' | ||
| + | |||
| + | < | ||
| + | # Sur chaque RPi de calcul | ||
| + | % sudo chown root:root / | ||
| + | </ | ||
| + | |||
| + | * Sur chaque noeud de travail, on installe '' | ||
| + | |||
| + | <sxh bash> | ||
| + | % sudo apt install -y slurmd libpmix-dev | ||
| + | % sudo systemctl enable slurmd | ||
| + | % sudo systemctl restart slurmd | ||
| + | % systemctl status slurmd </ | ||
| + | |||
| + | * Encore une fois, vous ne devriez pas voir d' | ||
| + | |||
| + | < | ||
| + | % sudo chown -R slurm:slurm / | ||
| + | % sudo chmod 755 / | ||
| + | % sudo touch / | ||
| + | % sudo chown -R slurm:slurm / | ||
| + | |||
| + | * Vérifier que le serveur '' | ||
| + | |||
| + | <sxh bash> | ||
| + | % sinfo | ||
| + | PARTITION AVAIL TIMELIMIT NODES STATE NODELIST | ||
| + | biobunch* up 2:00:00 4 idle minion[01-04] </ | ||
| + | |||
| + | * Si l' | ||
| + | |||
| + | <sxh bash> | ||
| + | # Pour minion01 par ex.: | ||
| + | % sudo scontrol update nodename=minion01 state=idle </ | ||
| + | |||
| + | * Note: si à tout moment, un noeud " | ||
| + | |||
| + | * Si tout fonctionne, le commande suivante devrait vous retourner les noms de tous les noeuds de travail: | ||
| + | |||
| + | <sxh bash> | ||
| + | % srun --nodelist=minion[01-04] hostname | ||
| + | minion01 | ||
| + | minion02 | ||
| + | minion03 | ||
| + | minion04 | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Comment utiliser SLURM pour exécuter des tâches sur une grappe de calcul | ||
| + | ==== En utilisant la commande srun ==== | ||
| + | |||
| + | Page man pour '' | ||
| + | |||
| + | * La commande '' | ||
| + | * Un exemple banal: | ||
| + | <sxh bash> | ||
| + | % srun hostname | ||
| + | minion01 | ||
| + | % srun --nodelist=minion02 hostname | ||
| + | minion02 | ||
| + | % srun --nodelist=minion0[1, | ||
| + | minion02 | ||
| + | minion01 | ||
| + | </ | ||
| + | |||
| + | ==== En utilisant la commande sbatch ==== | ||
| + | |||
| + | Page man pour '' | ||
| + | |||
| + | * La commande '' | ||
| + | * Un exemple simple de script: | ||
| + | <sxh bash> | ||
| + | À venir... | ||
| + | </ | ||
| + | |||
| + | ===== 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' | ||
| + | * SLURM dispose d' | ||
| + | * Avec '' | ||
| + | * Avec '' | ||
| + | * Avec '' | ||
| + | * Avec '' | ||
| + | * Ces outils sont pratiques (évidemment!) mais une vue d' | ||
| + | * Avec [[https:// | ||
| + | * Avec [[https:// | ||
| + | * C'est votre choix :-) | ||
| + | ===== Références ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | |||