Projet

Général

Profil

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))