Projet

Général

Profil

Slurm » Historique » Version 1

Argus Rusard, 28/02/2023 17:27

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
- *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 à 120 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 à 30 jours (voir [[Configuration Scheduler]]). L'option à utiliser est "`--time=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 34560 heures (~ 288 cœurs sur 5 jours, voir [[Configuration Scheduler]])
100
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
- job parallèle de 320 cœurs avec 10 nœuds complets:
123
```bash
124
sbatch --nodes=10 --tasks-per-node=32 <script>
125
```
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))