|
| 1 | +--- |
| 2 | +title: "Environnements logiciels" |
| 3 | +sidebar_position: 5 |
| 4 | +--- |
| 5 | + |
| 6 | +# INTRODUCTION |
| 7 | + |
| 8 | +Le système de [Modules](https://modules.readthedocs.io/en/latest/#) est un outil qui simplifie l'initialisation du shell et permet aux utilisateurs et utilisatrices de modifier leur environnement facilement avec des fichiers de modules. |
| 9 | + |
| 10 | +Chaque fichier de module contient les informations requises pour configurer le shell pour une application spécifique. Plusieurs modules sont pré-installés sur **Hedy**. |
| 11 | + |
| 12 | +Par défaut, le module **[slurm/slurm](jobs)** (notre gestionnaire de ressources, indispensable pour soumettre des jobs) est chargé par défaut dans l'environnement de toutes les personnes se connectant au cluster. |
| 13 | + |
| 14 | +# UTILISATION |
| 15 | +## module list |
| 16 | + |
| 17 | +Pour lister les modules chargés dans votre environnement, vous pouvez utiliser la commande **module list** (ou son raccourci **ml list**) : |
| 18 | + |
| 19 | +```console |
| 20 | +user@hedy:~$ module list |
| 21 | +Currently Loaded Modulefiles: |
| 22 | + 1) slurm/slurm(latest) |
| 23 | +``` |
| 24 | + |
| 25 | +On voit ici que le module **slurm/slurm** estchargé, ce qui nous permettra d'utiliser cette application. |
| 26 | + |
| 27 | +## module load |
| 28 | + |
| 29 | +Prenons l'exemple de **openmpi**. Voici ce qui se passe si vous essayez de l'utiliser sans charger de module : |
| 30 | + |
| 31 | +```console |
| 32 | +user@hedy:~$ mpirun |
| 33 | +-bash: mpirun: command not found |
| 34 | +user@hedy:~$ which mpirun |
| 35 | +/usr/bin/which: no mpirun in (/usr/local/bin/di:/nfs/mesonet/home/users/hal/HPC_tools/utilities:/nfs/mesonet/home/users/hal/.local/bin:/nfs/mesonet/sw/slurm/slurm-24.05.0/bin:/nfs/mesonet/sw/modules/modules-5.4.0/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/nfs/mesonet/home/users/hal/bin:/nfs/mesonet/sw/munge/munge-0.5.16/bin/) |
| 36 | +``` |
| 37 | +Le logiciel n'apparaît pas dans votre environnement, et par conséquent vous ne pouvez pas l'utiliser. Il faut donc charger le bon module avec la commande **module load** (ou son raccourci **ml load**) : |
| 38 | + |
| 39 | +```console |
| 40 | +user@hedy:~$ module load openmpi/5.0.3.rocm-6.1.1 |
| 41 | +Loading openmpi/5.0.3.rocm-6.1.1 |
| 42 | + Loading requirement: rocm/6.1.1 |
| 43 | +user@hedy:~$ module list |
| 44 | +Currently Loaded Modulefiles: |
| 45 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 |
| 46 | +user@hedy:~$ which mpirun |
| 47 | +/nfs/mesonet/sw/openmpi/openmpi-5.0.3.rocm-6.1.1/bin/mpirun |
| 48 | +``` |
| 49 | + |
| 50 | +On voit que maintenant **openmpi** est utilisable. On constate également que tous les autres modules desquels **openmpi** dépend ont été chargé automatiquement. Pour désactiver l'affichage du message, vous pouvez utiliser l'option **-q** (ou **--quiet**) : |
| 51 | +```console |
| 52 | + |
| 53 | +user@hedy:~$ module -q load openmpi/5.0.3.rocm-6.1.1 |
| 54 | +user@hedy:~$ module list |
| 55 | +Currently Loaded Modulefiles: |
| 56 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 |
| 57 | +``` |
| 58 | +Le message ne s'est pas affiché, mais tous les modules sont bien chargés. Cela peut servir pour alléger les logs de vos jobs. |
| 59 | + |
| 60 | +## module remove |
| 61 | + |
| 62 | +Lorsque vous ne voulez plus utiliser un module, vous pouvez le supprimer de votre environnement avec la commande **module remove** (ou ses raccourcis **module rm** ou **ml rm**). Dans notre exemple, le module **openmpi/5.0.3.rocm-6.1.1** n'est plus nécessaire : |
| 63 | + |
| 64 | +```console |
| 65 | +user@hedy:~$ module list |
| 66 | +Currently Loaded Modulefiles: |
| 67 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 |
| 68 | +user@hedy:~$ module remove openmpi/5.0.3.rocm-6.1.1 |
| 69 | +Unloading openmpi/5.0.3.rocm-6.1.1 |
| 70 | + Unloading useless requirement: rocm/6.1.1 |
| 71 | +user@hedy:~$ module list |
| 72 | +Currently Loaded Modulefiles: |
| 73 | + 1) slurm/slurm(latest) |
| 74 | +``` |
| 75 | + |
| 76 | +Module va gérer de manière "intelligente" les dépendances. Il a supprimé les dépendances automatiquement. Si vous aviez chargé le module **rocm/6.1.1** avant de charger le module **openmpi/5.0.3.rocm-6.1.1**, ce dernier ne chargera que l'autre dépendance manquante. Lors de la suppression, le module **rocm/6.1.1** sera conservé : |
| 77 | + |
| 78 | +```console |
| 79 | +user@hedy:~$ module list |
| 80 | +Currently Loaded Modulefiles: |
| 81 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) |
| 82 | +user@hedy:~$ module load openmpi/5.0.3.rocm-6.1.1 |
| 83 | +user@hedy:~$ module list |
| 84 | +Currently Loaded Modulefiles: |
| 85 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 |
| 86 | +user@hedy:~$ module rm openmpi/5.0.3.rocm-6.1.1 |
| 87 | + Unloading useless requirement: openmpi/openmpi-3.1.i18 |
| 88 | +user@hedy:~$ module list |
| 89 | +Currently Loaded Modulefiles: |
| 90 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) |
| 91 | +``` |
| 92 | + |
| 93 | +À l'inverse, si vous enlevez un module dont dépend d'autres modules, tous les modules seront déchargés : |
| 94 | +```console |
| 95 | +user@hedy:~$ module load openmpi/5.0.3.rocm-6.1.1 |
| 96 | +Loading openmpi/5.0.3.rocm-6.1.1 |
| 97 | + Loading requirement: rocm/6.1.1 |
| 98 | +user@hedy:~$ module list |
| 99 | +Currently Loaded Modulefiles: |
| 100 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 |
| 101 | +user@hedy:~$ module rm rocm/6.1.1 |
| 102 | +Unloading rocm/6.1.1 |
| 103 | + Unloading dependent: openmpi/5.0.3.rocm-6.1.1 |
| 104 | +``` |
| 105 | + |
| 106 | +## module purge |
| 107 | + |
| 108 | +Vous pouvez supprimer tous vos modules d'un coup pour repartir sur une base nouvelle avec **module purge** (**ml purge**) |
| 109 | + |
| 110 | +```console |
| 111 | +user@hedy:~$ module list |
| 112 | +Currently Loaded Modulefiles: |
| 113 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 4) gcc/13.2.0(latest) |
| 114 | +user@hedy:~$ module purge |
| 115 | +Unloading slurm/slurm |
| 116 | + ERROR: Unload of super-sticky module skipped |
| 117 | +user@hedy:~$ module list |
| 118 | +Currently Loaded Modulefiles: |
| 119 | + 1) slurm/slurm(latest) |
| 120 | +``` |
| 121 | + |
| 122 | +Vous pouvez qu'une erreur indique que le module **slurm/slurm** n'a pas pu être supprimé. C'est tout à fait normal, ce module étant indispensable au fonctionnement du centre de calcul, nous avons décidé de le rendre permanent. Si vous ne souhaitez pas voir l'erreur apparaître, vous pouvez utiliser l'option **-q** : |
| 123 | + |
| 124 | +```console |
| 125 | +user@hedy:~$ module list |
| 126 | +Currently Loaded Modulefiles: |
| 127 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 4) gcc/13.2.0(latest) |
| 128 | +user@hedy:~$ module purge -q |
| 129 | +user@hedy:~$ module list |
| 130 | +Currently Loaded Modulefiles: |
| 131 | + 1) slurm/slurm(latest) |
| 132 | +``` |
| 133 | + |
| 134 | +## module switch |
| 135 | + |
| 136 | +Il est possible de remplacer un module par un autre avec une seule commande **module switch** (**ml switch**) : |
| 137 | + |
| 138 | +```console |
| 139 | +user@hedy:~$ module list |
| 140 | +Currently Loaded Modulefiles: |
| 141 | + 1) slurm/slurm(latest) |
| 142 | +user@hedy:~$ module load aocl/4.2.0.aocc |
| 143 | +Loading aocl/4.2.0.aocc |
| 144 | + Loading requirement: rocm/6.1.1 |
| 145 | +user@hedy:~$ module list |
| 146 | +Currently Loaded Modulefiles: |
| 147 | + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) aocl/4.2.0.aocc |
| 148 | +user@hedy:~$ module switch aocl/4.2.0.aocc aocl/4.2.0.gcc |
| 149 | +Switching from aocl/4.2.0.aocc to aocl/4.2.0.gcc |
| 150 | + Unloading useless requirement: rocm/6.1.1 |
| 151 | + Loading requirement: gcc/13.2.0 |
| 152 | +user@hedy:~$ module list |
| 153 | +Currently Loaded Modulefiles: |
| 154 | + 1) slurm/slurm(latest) 2) gcc/13.2.0(latest) 3) aocl/4.2.0.gcc |
| 155 | +``` |
| 156 | + |
| 157 | +Ici on remplace le module **aocl/4.2.0.aocc** par le module **aocl/4.2.0.gcc**. Les dépendances sont gérées automatiquement. |
| 158 | + |
| 159 | +## module avail |
| 160 | + |
| 161 | +La commande **module avail** (**ml avail**) permet d'obtenir la liste des modules installés sur le cluster. |
| 162 | + |
| 163 | +La liste peut être un peu longue et indigeste, il est préférable d'affiner un peu ses recherches avec le nom d'une application par exemple : |
| 164 | + |
| 165 | +```console |
| 166 | +user@hedy:~$ module avail gcc |
| 167 | +---------------- /nfs/mesonet/sw/modulefiles ---------------- |
| 168 | +gcc/9.5.0 gcc/10.5.0 gcc/11.4.0 gcc/12.3.0 gcc/13.2.0(latest) |
| 169 | +``` |
| 170 | + |
| 171 | +Certains modules ont des tags entre parenthèses. Ces derniers servent à identifier rapidement le module le plus récent. Quand 2 modules partagent le tag *latest*, un autre tag s'ajoute pour les différencier (souvent le compilateur qui a servi a complier l'application). |
| 172 | + |
| 173 | +D'autres modules sont soulignés. Ces modules représentent les modules qui seront chargés par défaut si on ne précise pas de version de module : |
| 174 | + |
| 175 | +```console |
| 176 | +user@hedy:~$ module load gcc |
| 177 | +user@hedy:~$ module list |
| 178 | +Currently Loaded Modulefiles: |
| 179 | + 1) slurm/slurm(latest) 2) gcc/gcc-13.2.0(latest) |
| 180 | +``` |
| 181 | + |
| 182 | +## .bashrc / .cshrc / .zshrc |
| 183 | +Les fichiers **.bashrc** (pour [bash](https://www.gnu.org/software/bash)), **.cshrc** (pour [tcsh](https://www.tcsh.org) ou csh) et **.zshrc** (pour [zsh](https://www.zsh.org)) permettent une personalisation du shell. Vous pouvez y insérer des commandes qui seront lancées à chaque connexion. Il est ainsi possible de charger directement les modules qui vous intéressent dans ce fichier de configuration. Vous pouvez éditer ce fichier avec n'importe quel éditeur de texte installé sur **H** : |
| 184 | + |
| 185 | +```console |
| 186 | +vim ~/.bashrc |
| 187 | +``` |
| 188 | + |
| 189 | +Ces modules seront également utilisés pour vos jobs, donc il n'est plus nécessaire de les charger manuellement dans vos scripts de soumissions. |
| 190 | + |
| 191 | +Voici un exemple de **.bashrc** qui charge des modules automatiquement : |
| 192 | + |
| 193 | +```console |
| 194 | +# .bashrc |
| 195 | + |
| 196 | +# Source global definitions |
| 197 | +if [ -f /etc/bashrc ]; then |
| 198 | + . /etc/bashrc |
| 199 | +fi |
| 200 | + |
| 201 | +source /usr/local/configfiles/bashrc.default |
| 202 | + |
| 203 | +module load -s gcc/gcc-13.2.0 |
| 204 | +module load -s openmpi/5.0.3.rocm-6.1.1 |
| 205 | +module load -s cmake/3.29.5 |
| 206 | +``` |
0 commit comments