Slurm » Historique » Version 7
Minerva Mac Gonagall, 25/03/2024 14:07
| 1 | 1 | Argus Rusard | # Slurm |
|---|---|---|---|
| 2 | |||
| 3 | {{>toc}} |
||
| 4 | |||
| 5 | Le gestionnaire de travaux du cluster Poudlard est [Slurm](https://slurm.schedmd.com/overview.html). |
||
| 6 | |||
| 7 | ## Introduction |
||
| 8 | |||
| 9 | On peut trouver une introduction au gestionnaire de travaux Slurm [ici](https://slurm.schedmd.com/quickstart.html). |
||
| 10 | |||
| 11 | 5 | Minerva Mac Gonagall | ## Commandes de gestion des jobs |
| 12 | 1 | Argus Rusard | |
| 13 | - Lancer un job décrit dans le script `<jobscript>` |
||
| 14 | ```bash |
||
| 15 | sbatch <jobscript> |
||
| 16 | ``` |
||
| 17 | |||
| 18 | 5 | Minerva Mac Gonagall | - Consulter la liste des jobs soumis: |
| 19 | 1 | Argus Rusard | ```bash |
| 20 | squeue |
||
| 21 | ``` |
||
| 22 | |||
| 23 | 5 | Minerva Mac Gonagall | - Supprimer un job: |
| 24 | 1 | Argus Rusard | ```bash |
| 25 | scancel <jobid> |
||
| 26 | ``` |
||
| 27 | |||
| 28 | - Obtenir des informations sur un job soumis: |
||
| 29 | ```bash |
||
| 30 | scontrol show job <jobid> |
||
| 31 | ou |
||
| 32 | 5 | Minerva Mac Gonagall | sacct -j <jobid> --format=User%20,JobID%20,Jobname%60,partition,state%20,time,start,end,elapsed,MaxRss,MaxVMSize,ReqMem,nnodes,ncpus,nodelist%60,submit%40,AllocTRES%60 |
| 33 | 1 | Argus Rusard | ``` |
| 34 | |||
| 35 | ## Exemple de script pour un job séquentiel |
||
| 36 | |||
| 37 | 5 | Minerva Mac Gonagall | |
| 38 | * Script `test.slurm` |
||
| 39 | |||
| 40 | 1 | Argus Rusard | ```bash |
| 41 | #!/bin/bash |
||
| 42 | |||
| 43 | ############################# |
||
| 44 | # les directives Slurm vont ici: |
||
| 45 | |||
| 46 | # Your job name (displayed by the queue) |
||
| 47 | #SBATCH -J HelloWorld |
||
| 48 | |||
| 49 | # walltime (hh:mm::ss) |
||
| 50 | #SBATCH -t 00:10:00 |
||
| 51 | |||
| 52 | # Specify the number of nodes(nodes=) and the number of cores per nodes(tasks-pernode=) to be used |
||
| 53 | #SBATCH -N 1 |
||
| 54 | #SBATCH --ntasks-per-node=1 |
||
| 55 | |||
| 56 | # change working directory |
||
| 57 | 7 | Minerva Mac Gonagall | #SBATCH --chdir=. |
| 58 | 1 | Argus Rusard | |
| 59 | # fin des directives PBS |
||
| 60 | ############################# |
||
| 61 | |||
| 62 | # useful informations to print |
||
| 63 | echo "#############################" |
||
| 64 | echo "User:" $USER |
||
| 65 | echo "Date:" `date` |
||
| 66 | echo "Host:" `hostname` |
||
| 67 | echo "Directory:" `pwd` |
||
| 68 | echo "SLURM_JOBID:" $SLURM_JOBID |
||
| 69 | echo "SLURM_SUBMIT_DIR:" $SLURM_SUBMIT_DIR |
||
| 70 | echo "SLURM_JOB_NODELIST:" $SLURM_JOB_NODELIST |
||
| 71 | echo "#############################" |
||
| 72 | |||
| 73 | ############################# |
||
| 74 | |||
| 75 | # What you actually want to launch |
||
| 76 | echo "Hello World" |
||
| 77 | sleep 1m # fake to work |
||
| 78 | |||
| 79 | # all done |
||
| 80 | echo "Job finished" |
||
| 81 | |||
| 82 | ``` |
||
| 83 | |||
| 84 | 5 | Minerva Mac Gonagall | * Soumission du script à l'ordonnanceur |
| 85 | 1 | Argus Rusard | |
| 86 | ```bash |
||
| 87 | sbatch test.slurm |
||
| 88 | ``` |
||
| 89 | 5 | Minerva Mac Gonagall | * Un numéro de job s'affichera à l'écran. |
| 90 | 1 | Argus Rusard | |
| 91 | 5 | Minerva Mac Gonagall | Tous les affichages écran (stderr et stdout) dûs au script `test.slurm` seront stockés dans un fichier de la forme *slurm-< jobid >.out* dans le dossier défini par `#SBATCH --chdir .`, c'est à dire, dans le cas présent, le répertoire courant (".") lors de la soumission du job par *sbatch*. |
| 92 | 1 | Argus Rusard | |
| 93 | 5 | Minerva Mac Gonagall | Donc, par exemple, en supposant que le script précédent soit soumis et que l'ID du job retourné soit 3088, le fichier généré sera : *slurm-3088.out*. |
| 94 | 1 | Argus Rusard | |
| 95 | 5 | Minerva Mac Gonagall | Il est possible de séparer les flux de sortie standard (stdout) et d'erreur standard (stdout) dans deux fichiers distincts mais il faudra ajouter dans le script ces deux directives: |
| 96 | ```bash |
||
| 97 | #SBATCH -o slurm-%j.out |
||
| 98 | #SBATCH -e slurm-%j.err |
||
| 99 | ``` |
||
| 100 | Le symbole `%j` sera remplacé par l'ID du job. |
||
| 101 | D'autres directives sont également disponibles. Vous trouverez plus d'informations [ici](https://slurm.schedmd.com/sbatch.html) |
||
| 102 | |||
| 103 | **NB:** Afin d'être correctement lues et prises en compte par Slurm, les directives SBATCH ("`#SBATCH`") doivent impérativement se situer au début du fichier script, avant toute commande de type shell. Dans le cas contraire elles seront ignorées. |
||
| 104 | |||
| 105 | 1 | Argus Rusard | ## Demander des ressources |
| 106 | |||
| 107 | Afin de permettre un fonctionnement normal du gestionnaire de travaux, vous êtes *obligés* de spécifier les ressources dont vous avez besoin pour votre calcul. Dans le cas où vous omettez de les spécifier, une valeur par défaut est prise. |
||
| 108 | |||
| 109 | Les ressources importantes: |
||
| 110 | 6 | Minerva Mac Gonagall | - **walltime**: le nombre d'heures pendant lequel votre calcul est autorisé a tourner. Au delà, le système l'arrêtera (i.e.: le tuera sauvagement). |
| 111 | * Valeur par défaut: 1 heure. |
||
| 112 | * Si vous demandez un walltime supérieur à 48 heures, vous serez dirigé automatiquement dans la file d’attente `longq` qui présente certaines restrictions. |
||
| 113 | * La durée maximale d'un job est fixée à 10 jours (voir [[Configuration Scheduler]]). |
||
| 114 | * L'option à utiliser est `--time=DD-HH:MM:SS`. |
||
| 115 | - **nombre de processeurs**: votre calcul aura à disposition le nombre de processeurs désigné. |
||
| 116 | * Vous pouvez demander un certain nombre de nœuds (défaut: 1) ainsi qu'un certain nombre de processeurs par nœuds (défaut: 1). Ceci se décompose habituellement en 2 options (`--nodes=<nnodes> --tasks-per-node=<ppn>`). |
||
| 117 | * Dans le cas d'un job avec des processus multithreadés, on devra utiliser l'option `--cpus-per-task=<nthreads>`. |
||
| 118 | - **cputime**: il s'agit de la durée CPU cumulée sur tous les processeurs du job (grosso modo `walltime * nb cœurs`). |
||
| 119 | * Il n'est pas possible de spécifier directement cette durée au lancement du job, mais vous ne pouvez pas dépasser 768 heures (voir [[Configuration Scheduler]]) |
||
| 120 | 1 | Argus Rusard | |
| 121 | ### Exemples |
||
| 122 | |||
| 123 | Il est utile d'ajouter des options à un `sbatch` si ces options ne sont pas déjà spécifiées dans le script de job `<script>`, ou bien quand on veut redéfinir leur valeur. |
||
| 124 | |||
| 125 | - job séquentiel de 2 heures |
||
| 126 | |||
| 127 | ```bash |
||
| 128 | sbatch --time=2:00:00 <script> |
||
| 129 | ``` |
||
| 130 | |||
| 131 | - job openmp 4 cœurs (sur un seul nœud) de 1 jour |
||
| 132 | |||
| 133 | ```bash |
||
| 134 | sbatch --time=24:00:00 --ntasks=1 --cpus-per-task=4 <script> |
||
| 135 | ``` |
||
| 136 | |||
| 137 | - job parallèle de 300 cœurs (répartis au hasard) |
||
| 138 | ```bash |
||
| 139 | sbatch --ntasks=300 <script> |
||
| 140 | ``` |
||
| 141 | |||
| 142 | 3 | Argus Rusard | - job parallèle de 640 cœurs avec 10 nœuds complets: |
| 143 | 1 | Argus Rusard | ```bash |
| 144 | 3 | Argus Rusard | sbatch --nodes=10 --tasks-per-node=64 <script> |
| 145 | 1 | Argus Rusard | ``` |
| 146 | |||
| 147 | ## Interroger le système de batchs |
||
| 148 | |||
| 149 | ### Connaître les ressources disponibles |
||
| 150 | |||
| 151 | Pour connaître les nœuds disponibles (idle) dans sa file d'attente de groupe, on peut utiliser la commande: |
||
| 152 | ```bash |
||
| 153 | sinfo -p `id -gn` |
||
| 154 | ``` |
||
| 155 | |||
| 156 | Pour une autre partition (par exemple longq): |
||
| 157 | ```bash |
||
| 158 | sinfo -p longq |
||
| 159 | ``` |
||
| 160 | |||
| 161 | Cette commande fournit le nombre de nœuds selon leur état: |
||
| 162 | - idle: libre |
||
| 163 | - alloc: entièrement alloué |
||
| 164 | - mix: partiellement alloué |
||
| 165 | - down: inaccessible |
||
| 166 | - drain: drainé |
||
| 167 | |||
| 168 | ### Evaluer la date de départ d'un job |
||
| 169 | |||
| 170 | La commande: |
||
| 171 | ```bash |
||
| 172 | squeue --start [-j <jobid>] |
||
| 173 | ``` |
||
| 174 | donne des informations utiles sur la date de départ (prévisible) d'un job. |
||
| 175 | |||
| 176 | ### Avoir des informations sur les jobs (actifs, en attente ou bloqués) |
||
| 177 | |||
| 178 | Jobs en attente classés par priorité décroissante: |
||
| 179 | ```bash |
||
| 180 | squeue --sort=p --state=PENDING |
||
| 181 | ``` |
||
| 182 | |||
| 183 | Faire "`man squeue`" pour plus de détails |
||
| 184 | |||
| 185 | 5 | Minerva Mac Gonagall | ## Lancer des jobs *interactifs* |
| 186 | 1 | Argus Rusard | |
| 187 | On peut avoir besoin d'accéder à une ressource de calcul pour y exécuter des commandes interactivement (cycle développement<->compilation) ou lancer des logiciels qui nécessitent l'intervention de l'utilisateur (debugger, etc...). |
||
| 188 | |||
| 189 | Pour avoir une connexion sur un nœud de calcul, il suffit d'utiliser la commande "`srun --pty /bin/bash -i`" à la place de la commande "`sbatch`". On se passe alors de script et un shell est ouvert sur la ressource dès qu'elle est allouée. Les entrées-sorties de ce shell sont connectées sur le terminal qui exécute "`srun`". Les options pour spécifier les ressources du job sont sensiblement les mêmes entre "`sbatch` et "`srun`". |
||
| 190 | |||
| 191 | 4 | Argus Rusard | **Note:** Il n'est pas possible de lancer des applications graphiques à partir du nœud de calcul de cette manière. |
| 192 | 1 | Argus Rusard | |
| 193 | ## Lancer des jobs MPI |
||
| 194 | |||
| 195 | Le cluster dispose de plusieurs implémentations de MPI: |
||
| 196 | - OpenMPI |
||
| 197 | - MPICH2 (version [[Spack]]) |
||
| 198 | |||
| 199 | Pour un simple test, OpenMPI sera le plus simple à mettre en œuvre: |
||
| 200 | ```bash |
||
| 201 | #! /bin/bash |
||
| 202 | |||
| 203 | #SBATCH --nodes=2 |
||
| 204 | #SBATCH --tasks-per-node=32 |
||
| 205 | |||
| 206 | module load openmpi |
||
| 207 | |||
| 208 | mpiexec <monexecutable> |
||
| 209 | ``` |
||
| 210 | |||
| 211 | |||
| 212 | Pour des instructions spécifiques aux différentes implémentations, voir [[Jobs MPI]] |
||
| 213 | |||
| 214 | ## Se connecter *quand même* aux nœuds pendant un job |
||
| 215 | |||
| 216 | La connexion directe sur les nœuds de calcul est interdite dans le cluster Poudlard. Le seul moyen d'accéder aux ressources est de soumettre un job. |
||
| 217 | |||
| 218 | Cependant, il peut être souhaitable de disposer d'une connexion aux nœuds de calcul dont on a obtenu la réservation à travers une soumission de job. |
||
| 219 | |||
| 220 | Pour ce faire, on peut utiliser la commande srun pour se connecter à l'intérieur du job. En supposant qu'on ai soumis un job batch: |
||
| 221 | ```bash |
||
| 222 | $ sbatch <monscript> |
||
| 223 | Submitted batch job <jobid> |
||
| 224 | ``` |
||
| 225 | |||
| 226 | Il suffit d'utiliser le `<jobid>` alloué par Slurm pour se connecter sur le nœud correspondant: |
||
| 227 | ```bash |
||
| 228 | srun --pty --jobid <jobid> /bin/bash -i |
||
| 229 | ``` |
||
| 230 | |||
| 231 | ## Utilisation "avancée" |
||
| 232 | |||
| 233 | ### Tableau de jobs |
||
| 234 | |||
| 235 | Il est possible avec une commande *sbatch*, de lancer un grand nombre de jobs en une seule fois, en utilisant l'argument *-a*. On peut spécifier le nombre de jobs via une liste d'indexes, exemple : |
||
| 236 | |||
| 237 | ```bash |
||
| 238 | sbatch -a 1-3 <script> |
||
| 239 | sbatch -a 1,3,4,5-10 <script> |
||
| 240 | ``` |
||
| 241 | |||
| 242 | A l'intérieur du job, Slurm positionne des variables d'environnement qu'on pourra utiliser dans le script pour différentier les différentes instances de job dans le tableau (voir la [documentation de Slurm](https://slurm.schedmd.com/job_array.html)) |