Slurm » Historique » Version 5
Minerva Mac Gonagall, 01/03/2023 09:06
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 | # SBATCH --chdir=. |
||
58 | |||
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 | 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`. |
111 | - **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>`. |
||
112 | - **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]]) |
||
113 | 1 | Argus Rusard | |
114 | ### Exemples |
||
115 | |||
116 | 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. |
||
117 | |||
118 | - job séquentiel de 2 heures |
||
119 | |||
120 | ```bash |
||
121 | sbatch --time=2:00:00 <script> |
||
122 | ``` |
||
123 | |||
124 | - job openmp 4 cœurs (sur un seul nœud) de 1 jour |
||
125 | |||
126 | ```bash |
||
127 | sbatch --time=24:00:00 --ntasks=1 --cpus-per-task=4 <script> |
||
128 | ``` |
||
129 | |||
130 | - job parallèle de 300 cœurs (répartis au hasard) |
||
131 | ```bash |
||
132 | sbatch --ntasks=300 <script> |
||
133 | ``` |
||
134 | |||
135 | 3 | Argus Rusard | - job parallèle de 640 cœurs avec 10 nœuds complets: |
136 | 1 | Argus Rusard | ```bash |
137 | 3 | Argus Rusard | sbatch --nodes=10 --tasks-per-node=64 <script> |
138 | 1 | Argus Rusard | ``` |
139 | |||
140 | ## Interroger le système de batchs |
||
141 | |||
142 | ### Connaître les ressources disponibles |
||
143 | |||
144 | Pour connaître les nœuds disponibles (idle) dans sa file d'attente de groupe, on peut utiliser la commande: |
||
145 | ```bash |
||
146 | sinfo -p `id -gn` |
||
147 | ``` |
||
148 | |||
149 | Pour une autre partition (par exemple longq): |
||
150 | ```bash |
||
151 | sinfo -p longq |
||
152 | ``` |
||
153 | |||
154 | Cette commande fournit le nombre de nœuds selon leur état: |
||
155 | - idle: libre |
||
156 | - alloc: entièrement alloué |
||
157 | - mix: partiellement alloué |
||
158 | - down: inaccessible |
||
159 | - drain: drainé |
||
160 | |||
161 | ### Evaluer la date de départ d'un job |
||
162 | |||
163 | La commande: |
||
164 | ```bash |
||
165 | squeue --start [-j <jobid>] |
||
166 | ``` |
||
167 | donne des informations utiles sur la date de départ (prévisible) d'un job. |
||
168 | |||
169 | ### Avoir des informations sur les jobs (actifs, en attente ou bloqués) |
||
170 | |||
171 | Jobs en attente classés par priorité décroissante: |
||
172 | ```bash |
||
173 | squeue --sort=p --state=PENDING |
||
174 | ``` |
||
175 | |||
176 | Faire "`man squeue`" pour plus de détails |
||
177 | |||
178 | 5 | Minerva Mac Gonagall | ## Lancer des jobs *interactifs* |
179 | 1 | Argus Rusard | |
180 | 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...). |
||
181 | |||
182 | 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`". |
||
183 | |||
184 | 4 | Argus Rusard | **Note:** Il n'est pas possible de lancer des applications graphiques à partir du nœud de calcul de cette manière. |
185 | 1 | Argus Rusard | |
186 | ## Lancer des jobs MPI |
||
187 | |||
188 | Le cluster dispose de plusieurs implémentations de MPI: |
||
189 | - OpenMPI |
||
190 | - MPICH2 (version [[Spack]]) |
||
191 | |||
192 | Pour un simple test, OpenMPI sera le plus simple à mettre en œuvre: |
||
193 | ```bash |
||
194 | #! /bin/bash |
||
195 | |||
196 | #SBATCH --nodes=2 |
||
197 | #SBATCH --tasks-per-node=32 |
||
198 | |||
199 | module load openmpi |
||
200 | |||
201 | mpiexec <monexecutable> |
||
202 | ``` |
||
203 | |||
204 | |||
205 | Pour des instructions spécifiques aux différentes implémentations, voir [[Jobs MPI]] |
||
206 | |||
207 | ## Se connecter *quand même* aux nœuds pendant un job |
||
208 | |||
209 | 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. |
||
210 | |||
211 | 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. |
||
212 | |||
213 | 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: |
||
214 | ```bash |
||
215 | $ sbatch <monscript> |
||
216 | Submitted batch job <jobid> |
||
217 | ``` |
||
218 | |||
219 | Il suffit d'utiliser le `<jobid>` alloué par Slurm pour se connecter sur le nœud correspondant: |
||
220 | ```bash |
||
221 | srun --pty --jobid <jobid> /bin/bash -i |
||
222 | ``` |
||
223 | |||
224 | ## Utilisation "avancée" |
||
225 | |||
226 | ### Tableau de jobs |
||
227 | |||
228 | 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 : |
||
229 | |||
230 | ```bash |
||
231 | sbatch -a 1-3 <script> |
||
232 | sbatch -a 1,3,4,5-10 <script> |
||
233 | ``` |
||
234 | |||
235 | 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)) |