Slurm » Historique » Version 3
Argus Rusard, 28/02/2023 17:31
| 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 | ## commandes de gestion des jobs |
||
| 12 | |||
| 13 | - Lancer un job décrit dans le script `<jobscript>` |
||
| 14 | ```bash |
||
| 15 | sbatch <jobscript> |
||
| 16 | ``` |
||
| 17 | |||
| 18 | - consulter la liste des jobs soumis: |
||
| 19 | ```bash |
||
| 20 | squeue |
||
| 21 | ``` |
||
| 22 | |||
| 23 | - supprimer un job: |
||
| 24 | ```bash |
||
| 25 | scancel <jobid> |
||
| 26 | ``` |
||
| 27 | |||
| 28 | - Obtenir des informations sur un job soumis: |
||
| 29 | ```bash |
||
| 30 | scontrol show job <jobid> |
||
| 31 | ou |
||
| 32 | 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 |
||
| 33 | ``` |
||
| 34 | |||
| 35 | ## Exemple de script pour un job séquentiel |
||
| 36 | |||
| 37 | ```bash |
||
| 38 | #!/bin/bash |
||
| 39 | |||
| 40 | ############################# |
||
| 41 | # les directives Slurm vont ici: |
||
| 42 | |||
| 43 | # Your job name (displayed by the queue) |
||
| 44 | #SBATCH -J HelloWorld |
||
| 45 | |||
| 46 | # walltime (hh:mm::ss) |
||
| 47 | #SBATCH -t 00:10:00 |
||
| 48 | |||
| 49 | # Specify the number of nodes(nodes=) and the number of cores per nodes(tasks-pernode=) to be used |
||
| 50 | #SBATCH -N 1 |
||
| 51 | #SBATCH --ntasks-per-node=1 |
||
| 52 | |||
| 53 | # change working directory |
||
| 54 | # SBATCH --chdir=. |
||
| 55 | |||
| 56 | # fin des directives PBS |
||
| 57 | ############################# |
||
| 58 | |||
| 59 | # useful informations to print |
||
| 60 | echo "#############################" |
||
| 61 | echo "User:" $USER |
||
| 62 | echo "Date:" `date` |
||
| 63 | echo "Host:" `hostname` |
||
| 64 | echo "Directory:" `pwd` |
||
| 65 | echo "SLURM_JOBID:" $SLURM_JOBID |
||
| 66 | echo "SLURM_SUBMIT_DIR:" $SLURM_SUBMIT_DIR |
||
| 67 | echo "SLURM_JOB_NODELIST:" $SLURM_JOB_NODELIST |
||
| 68 | echo "#############################" |
||
| 69 | |||
| 70 | ############################# |
||
| 71 | |||
| 72 | # What you actually want to launch |
||
| 73 | echo "Hello World" |
||
| 74 | sleep 1m # fake to work |
||
| 75 | |||
| 76 | # all done |
||
| 77 | echo "Job finished" |
||
| 78 | |||
| 79 | ``` |
||
| 80 | |||
| 81 | |||
| 82 | Une fois le script lancé, par exemple avec |
||
| 83 | ```bash |
||
| 84 | sbatch test.slurm |
||
| 85 | ``` |
||
| 86 | (en supposant que le script ci-dessus soit enregistré dans un fichier *test.slurm*), un numéro de job s'affichera à l'écran. Tous les affichages écran dûs au script test.slurm seront stockés dans des fichiers de la forme *slurm-<jobid>.err* (pour stderr) et *slurm-<jobid>.out* (pour stdout) 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*. |
||
| 87 | |||
| 88 | Par exemple, pour le script donné en exemple, en supposant que l'ID du job soit 3088, à la fin du job, il y aura deux fichiers : *slurm-3088.err* et *slurm-3088.out*. |
||
| 89 | |||
| 90 | **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. |
||
| 91 | |||
| 92 | ## Demander des ressources |
||
| 93 | |||
| 94 | 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. |
||
| 95 | |||
| 96 | Les ressources importantes: |
||
| 97 | 2 | Argus Rusard | - **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). Valeur par défaut: 1 heure. Si vous demandez un walltime supérieur à 48 heures, vous serez dirigé automatiquement dans la file d’attente `longq` qui présente certaines restrictions. La durée maximale d'un job est fixée à 10 jours (voir [[Configuration Scheduler]]). L'option à utiliser est `--time=DD-HH:MM:SS`. |
| 98 | - **nombre de processeurs**: votre calcul aura à disposition le nombre de processeurs désigné. 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>`). Dans le cas d'un job avec des processus multithreadés, on devra utiliser l'option `--cpus-per-task=<nthreads>`. |
||
| 99 | - **cputime**: il s'agit de la durée CPU cumulée sur tous les processeurs du job (grosso modo `walltime * nb cœurs`). 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]]) |
||
| 100 | 1 | Argus Rusard | |
| 101 | ### Exemples |
||
| 102 | |||
| 103 | 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. |
||
| 104 | |||
| 105 | - job séquentiel de 2 heures |
||
| 106 | |||
| 107 | ```bash |
||
| 108 | sbatch --time=2:00:00 <script> |
||
| 109 | ``` |
||
| 110 | |||
| 111 | - job openmp 4 cœurs (sur un seul nœud) de 1 jour |
||
| 112 | |||
| 113 | ```bash |
||
| 114 | sbatch --time=24:00:00 --ntasks=1 --cpus-per-task=4 <script> |
||
| 115 | ``` |
||
| 116 | |||
| 117 | - job parallèle de 300 cœurs (répartis au hasard) |
||
| 118 | ```bash |
||
| 119 | sbatch --ntasks=300 <script> |
||
| 120 | ``` |
||
| 121 | |||
| 122 | 3 | Argus Rusard | - job parallèle de 640 cœurs avec 10 nœuds complets: |
| 123 | 1 | Argus Rusard | ```bash |
| 124 | 3 | Argus Rusard | sbatch --nodes=10 --tasks-per-node=64 <script> |
| 125 | 1 | Argus Rusard | ``` |
| 126 | |||
| 127 | ## Interroger le système de batchs |
||
| 128 | |||
| 129 | ### Connaître les ressources disponibles |
||
| 130 | |||
| 131 | Pour connaître les nœuds disponibles (idle) dans sa file d'attente de groupe, on peut utiliser la commande: |
||
| 132 | ```bash |
||
| 133 | sinfo -p `id -gn` |
||
| 134 | ``` |
||
| 135 | |||
| 136 | Pour une autre partition (par exemple longq): |
||
| 137 | ```bash |
||
| 138 | sinfo -p longq |
||
| 139 | ``` |
||
| 140 | |||
| 141 | Cette commande fournit le nombre de nœuds selon leur état: |
||
| 142 | - idle: libre |
||
| 143 | - alloc: entièrement alloué |
||
| 144 | - mix: partiellement alloué |
||
| 145 | - down: inaccessible |
||
| 146 | - drain: drainé |
||
| 147 | |||
| 148 | ### Evaluer la date de départ d'un job |
||
| 149 | |||
| 150 | La commande: |
||
| 151 | ```bash |
||
| 152 | squeue --start [-j <jobid>] |
||
| 153 | ``` |
||
| 154 | donne des informations utiles sur la date de départ (prévisible) d'un job. |
||
| 155 | |||
| 156 | ### Avoir des informations sur les jobs (actifs, en attente ou bloqués) |
||
| 157 | |||
| 158 | Jobs en attente classés par priorité décroissante: |
||
| 159 | ```bash |
||
| 160 | squeue --sort=p --state=PENDING |
||
| 161 | ``` |
||
| 162 | |||
| 163 | Faire "`man squeue`" pour plus de détails |
||
| 164 | |||
| 165 | ## lancer des jobs *interactifs* |
||
| 166 | |||
| 167 | 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...). |
||
| 168 | |||
| 169 | 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`". |
||
| 170 | |||
| 171 | **Note:** Pour l'instant, il n'est pas possible de lancer des applications graphiques à partir du nœud de calcul de cette manière. |
||
| 172 | |||
| 173 | ## Lancer des jobs MPI |
||
| 174 | |||
| 175 | Le cluster dispose de plusieurs implémentations de MPI: |
||
| 176 | - OpenMPI |
||
| 177 | - MPICH2 (version [[Spack]]) |
||
| 178 | |||
| 179 | Pour un simple test, OpenMPI sera le plus simple à mettre en œuvre: |
||
| 180 | ```bash |
||
| 181 | #! /bin/bash |
||
| 182 | |||
| 183 | #SBATCH --nodes=2 |
||
| 184 | #SBATCH --tasks-per-node=32 |
||
| 185 | |||
| 186 | module load openmpi |
||
| 187 | |||
| 188 | mpiexec <monexecutable> |
||
| 189 | ``` |
||
| 190 | |||
| 191 | |||
| 192 | Pour des instructions spécifiques aux différentes implémentations, voir [[Jobs MPI]] |
||
| 193 | |||
| 194 | ## Se connecter *quand même* aux nœuds pendant un job |
||
| 195 | |||
| 196 | 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. |
||
| 197 | |||
| 198 | 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. |
||
| 199 | |||
| 200 | 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: |
||
| 201 | ```bash |
||
| 202 | $ sbatch <monscript> |
||
| 203 | Submitted batch job <jobid> |
||
| 204 | ``` |
||
| 205 | |||
| 206 | Il suffit d'utiliser le `<jobid>` alloué par Slurm pour se connecter sur le nœud correspondant: |
||
| 207 | ```bash |
||
| 208 | srun --pty --jobid <jobid> /bin/bash -i |
||
| 209 | ``` |
||
| 210 | |||
| 211 | ## Utilisation "avancée" |
||
| 212 | |||
| 213 | ### Tableau de jobs |
||
| 214 | |||
| 215 | 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 : |
||
| 216 | |||
| 217 | ```bash |
||
| 218 | sbatch -a 1-3 <script> |
||
| 219 | sbatch -a 1,3,4,5-10 <script> |
||
| 220 | ``` |
||
| 221 | |||
| 222 | 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)) |