Slurm » Historique » Version 4
Argus Rusard, 28/02/2023 17:32
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 | 4 | Argus Rusard | **Note:** Il n'est pas possible de lancer des applications graphiques à partir du nœud de calcul de cette manière. |
172 | 1 | Argus Rusard | |
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)) |