Projet

Général

Profil

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