Allocation mémoire

Le gestionnaire de tâches SLURM alloue une mémoire RAM par défaut à chaque processus (sur un coeur). Actuellement elle est de 4Go par coeur de CPU et de 2Go par coeur de GPU. Les processeurs ont des volumes de RAM variables suivant leur type et donc ces valeurs par défaut ne correspondent pas au maximum de RAM disponible sur toutes les architectures.

Si la tâche que vous devez exécuter nécessite moins de mémoire par processus, vous pouvez le spécifier explicitement, afin de permettre un meilleur partage des ressources.

Si la tâche que vous devez exécuter nécessite plus de mémoire par processus, sur les noeuds où cela est possible, vous devez le spécifier explicitement au gestionnaire de tâches SLURM.

Mémoire par coeur

Pour spécifier le volume maximal de mémoire RAM demandé pour votre job, vous devez ajouter cette ligne à votre script SLURM :

#SBATCH --mem-per-cpu=8G # mémoire par cœur

Vous pouvez vérifier les ressources attribuées après soumission par :

scontrol show job <JOBID>

Mémoire par noeud

La mémoire demandée par noeud se spécifie par :

#SBATCH --mem=128G # mémoire par nœud

ou

#SBATCH --mem=128000 # mémoire par nœud

Si votre demande n’est pas compatible avec l’architecture, SLURM rejettera votre demande de ressources.

Pour modifier une demande en cours qui n’a pas encore démarré, faites :

scontrol update job <JOBID> MinMemoryNode=XXXG

Connaître la RAM de chaque noeud

La commande

scontrol show job <JOBID>

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

RealMemory=64000

Elle s’obtient aussi via la commande

sinfo -N -l

où elle est donnée dans la colonne MEMORY. Exemple :

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

La mémoire disponible par coeur est la mémoire disponible par noeud divisé par le nombre de coeurs (dans le colonne CPUS).

Estimer la mémoire RAM requise pour vôtre tâche

Si vous connaissez le nombre maximal de tableaux alloués dans votre programme, vous pouvez estimer la taille de l’exécutable, en particulier lorsque la taille des tableaux est grande.

Par exemple, un programme déclarant 3 tableaux d’un milliards de modes, en double précision, demandera de l’ordre de

10^9 x 8 x 3 = 24 Go

Parfois, notamment lorsque le programme alloue dynamiquement de la mémoire, il est utile de regarder l’usage a posteriori. Cela peut se faire à l’aide de la commande seff, lorsque l’allocation est terminée.

Monitorer l’usage de la mémoire RAM

seff

La commande

seff <JOBID>

renvoie une estimation de la mémoire utilisée (deux dernières lignes) :

(...)
Memory Utilized: 491.83 GB (estimated maximum)
Memory Efficiency: 98.37% of 500.00 GB (3.91 GB/core)

Elles est utile a posteriori.

sacct

Le commande sacct permet aussi d’extraire le maximum de la RAM utilisée par un job.

sacct --format='JobID,Elapsed,MaxRSS,MaxVMSize' -j <JOBID>

htop et ps

Une autre manière de procéder peut consister à se connecter sur le noeud et suivre l’évolution de l’usage de la RAM avec une commande de type top``ou ``htop, mais cela nécessite de regarder l’usage des ressources en direct. Pour faire un suivi en batch, il est préférable d’utiliser la commande ps pour enregistrer l’usage de la RAM.

Par exemple, si votre exécutable est a.out

ps -C A.out -o pcpu= -o pmem= -o rss=

permet d’enregistrer les pourcentages de temps CPU, de RAM et la RSS (Resident Set Size), i.e., le volume de RAM effective (hors swap et en ko), utilisée par le processus.