Débuter avec SLURM

SLURM (Simple Linux Utility for Resource Management) est un planificateur de tâches gratuit et open source pour les noyaux de type Linux et Unix, utilisé par de nombreux superordinateurs et grappes d’ordinateurs dans le monde.

Principales commandes

Commmande

Utilité

sinfo

interrogation des files d’attente

sbatch

soumission d’un job dans une file d’attente (appelées partitions dans SLURM)

salloc

réservation de ressources en interactif

srun

crée une allocation de ressources, à utiliser avec sbatch ou salloc

scancel

suppression d’un job

scancel

suppression d’un job

squeue

liste des jobs dans les files d’attente

sprio

prorités relatives des jobs en attente

scontrol

affiche des données relatives aux tâches

seff

affiche l’efficatité d’un job terminé

L’usage de chaque commande peut être explicité avec le manuel en ligne, par exemple comme

man sinfo

Avant de soumettre un job

Il peut être utile de regarder quelles sont les ressources immédiatement disponibles. Pour cela, vous pouvez utiliser la commande sinfo avec l’option :

sinfo -s

qui affiche un tableau contenant le nom des partitions (la partition par défaut est indiquée avec une étoile *), leur disponibilité, le temps maximal de calcul permis dans cette partition (qui diffère du temps proposé par défaut), le nombre de noeuds total (T) et la liste des noeuds présents dans la partition :

PARTITION AVAIL  TIMELIMIT   NODES(A/I/O/T) NODELIST
haswell*     up 14-00:00:0       33/31/0/64 haswell-f20-[01-03],haswell-t16-[03-54],haswell-x20-[01-08],haswell-x44-01
skylake      up 7-00:00:00        20/0/0/20 skylake-f32-[01-06],skylake-t32-[01-14]
cascade      up 7-00:00:00        49/3/0/52 cascade-f32-[01-08],cascade-t32-[01-40],cascade-x32-[01-04]
gpu          up 4-00:00:00          1/1/0/2 cascade-gpu-[01-02]
test         up    1:00:00          0/2/0/2 haswell-t16-[01-02]

Pour donner les informations sur une partition donnée :

sinfo -p <partition>

par exemple :

sinfo -p haswell
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
haswell*     up 14-00:00:0      3    mix haswell-x20-[01,04,06]
haswell*     up 14-00:00:0     58  alloc haswell-f20-[01-03],haswell-t16-[03-47,49-54],haswell-x20-[05,07-08],haswell-x44-01
haswell*     up 14-00:00:0      3   idle haswell-t16-48,haswell-x20-[02-03]

Pour connaître le détail de la configuration de chaque partition, vous pouvez faire

scontrol show partition <partition-name>
PartitionName=haswell
AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
AllocNodes=ALL Default=YES QoS=N/A
DefaultTime=01:00:00 DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
MaxNodes=UNLIMITED MaxTime=14-00:00:00 MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED
Nodes=haswell-t16-[03-54],haswell-f20-[01-03],haswell-x20-[01-08],haswell-x44-01
PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=YES:4
OverTimeLimit=NONE PreemptMode=OFF
State=UP TotalCPUs=1096 TotalNodes=64 SelectTypeParameters=NONE
JobDefaults=(null)
DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED

Notez que la limite de la ressource mémoire par noeud n’est pas spécifiée lorsque la partition est hétérogène. Pour connaître le détail de la mémoire de chaque noeud, vous pouvez regarder une commande équivalente par noeud

scontrol show node haswell-t16-26
NodeName=haswell-t16-26 Arch=x86_64 CoresPerSocket=8
   CPUAlloc=0 CPUTot=16 CPULoad=0.01
   AvailableFeatures=Haswell,QLogic
   ActiveFeatures=Haswell,QLogic
   Gres=(null)
   NodeAddr=haswell-t16-26 NodeHostName=haswell-t16-26 Version=20.11.8
   OS=Linux 3.10.0-1160.66.1.el7.x86_64 #1 SMP Wed May 18 16:02:34 UTC 2022
   RealMemory=64000 AllocMem=0 FreeMem=62993 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=haswell
   BootTime=2022-05-20T15:16:56 SlurmdStartTime=2022-05-20T15:18:11
   CfgTRES=cpu=16,mem=62.50G,billing=16
   AllocTRES=
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s
   Comment=(null)

où la mémoire du noeud est donnée en Mo par

RealMemory=64000

et la mémoire effectivement disponible, inférieure au maximum de l’architecture, est donnée en Mo par

FreeMem=62993

Ici, le noeud regardé étant libre (idle), vous pourriez demander le maximum de la mémoire du noeud dans votre script SLURM, en spécifiant

%SBATCH --mem=64000

ce qui vous allouera, par noeud, la ressource maximale disponible, à savoir :

mem=62.50G

Pour connaître la mémoire de chaque architecture, vous pouvez faire :

sinfo -N -l

ce qui retourne une liste du type

NODELIST        NODES PARTITION       STATE CPUS    S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON              
cascade-f32-01      1   cascade   allocated 32     2:16:1 384000        0     10 CascadeL none                
cascade-f32-02      1   cascade   allocated 32     2:16:1 384000        0     10 CascadeL none                
(...)
cascade-f32-08      1   cascade   allocated 32     2:16:1 384000        0     10 CascadeL none                
cascade-gpu-01      1       gpu       down* 16      2:8:1 190000        0     50 GPU,Mell Not responding      
cascade-gpu-02      1       gpu completing~ 16      2:8:1 190000        0     50 GPU,Mell none                
cascade-gpu-03      1       gpu    drained* 16      2:8:1 380000        0     50 GPU,Mell need nvidia driver  
cascade-t32-01      1   cascade   allocated 32     2:16:1 190000        0      1 CascadeL none                
(...)
cascade-t32-40      1   cascade   allocated 32     2:16:1 190000        0      1 CascadeL none                
cascade-x32-01      1   cascade   allocated 32     2:16:1 768000        0     20 CascadeL none                
(...)
cascade-x32-04      1   cascade   allocated 32     2:16:1 768000        0     20 CascadeL none                
haswell-f20-01      1  haswell*       mixed 20     2:10:1 270000        0     10 Haswell, none                
(...)
haswell-f20-03      1  haswell*   allocated 20     2:10:1 270000        0     10 Haswell, none                
haswell-t16-01      1      test        idle 16      2:8:1  64000        0      1 Haswell, none                
(...)
haswell-t16-54      1  haswell*        idle 16      2:8:1  64000        0      1 Haswell, none                
haswell-x20-01      1  haswell*   allocated 20     2:10:1 384000        0     20 Haswell, none                
(...)
haswell-x20-08      1  haswell*        idle 20     2:10:1 384000        0     20 Haswell, none                
haswell-x44-01      1  haswell*   allocated 44     2:22:1 512000        0     30  Haswell none                
skylake-f32-01      1   skylake   allocated 32     2:16:1 384000        0     10 SkyLake, none                
(...)
skylake-f32-06      1   skylake   allocated 32     2:16:1 384000        0     10 SkyLake, none                
skylake-t32-01      1   skylake   allocated 32     2:16:1 190000        0      1 SkyLake, none                
(...)
skylake-t32-14      1   skylake   allocated 32     2:16:1 190000        0      1 SkyLake, none                

Soumettre un job

La commande qui soumet une tâche au gestionnaire de tâches est

sbatch <script.slurm>

<script.slurm> est un fichier de soumission, dans laquelle les ressources demandées sont spécifiées dans un en-tête et les commandes à effectuer sur ces ressources sont scriptées ensuite, en bash.

Pour modifier les ressources demandées, il est possible de les passer en options avant le nom du script. Par exemple, pour aller sur la partition test avec 2 processus, vous pouvez faire

sbatch -p test -n 2 <script.slurm>

Une demande d’allocation de ressources en interactive exploite généralement la spécification des options en ligne de commande. Par exemple pour réserver 1 noeud de la queue test avec 1Go de mémoire, et 4 processus par noeud :

salloc -p test -N 1 -n 4 -mem=1G $SHELL

ou directement

srun -p test -N 1 -n 4 -mem=1G --pty $SHELL

Après soumission du job

Lister ses job en queue

squeue -u <user>

Avoir une estimation de l’heure à laquelle le job démarre

squeue --start

Détailler l’ensemble des informations traitées par SLURM pour un job donné

scontrol show job <jobid>

Une fois l’exécution du job achevée

Vous pouvez consulter votre historique en faisant

sreport cluster UserUtilizationByAccount account=<user> -t hours

Si le job s’est terminé avec succès, une estimation de l’efficacité de l’usage des ressources peut être obtenu par

seff <jobid>

Pour obtenir la liste des jobs que vous avez traités, vous pouvez utiliser la commande sacct. Par exemple

sacct -u <user> -S 2020-01-01 --partition cascade

retourne l’ensemble des jobs de <user> sur la partition cascade depuis le 1er janvier 2020.