Allocation mémoire avec Slurm
Les options Slurm --mem, --mem-per-cpu et --mem-per-gpu sont désactivées
sur Jean Zay car elles ne permettent pas de configurer convenablement l'allocation
mémoire par nœud d'un travail. Celle-ci est donc déterminée automatiquement à partir
du nombre de CPU réservé par nœud.
Pour ajuster la quantité de mémoire allouée à votre travail, il faut donc ajuster
le nombre de CPU réservés par tâche (ou processus) en spécifiant l'option suivante
dans vos scripts batch, ou lors d'un salloc en mode interactif :
--cpus-per-task=... # --cpus-per-task=1 par défaut
La valeur maximale pouvant être indiquée dans --cpus-per-task dépend du nombre de
processus/tâche demandés par nœud (--ntasks-per-node) et du profil des nœuds utilisés
(nombre total de cœurs par nœud) qui lui dépend de la partition utilisée.
Sur la partition CPU, la quantité de mémoire allouée par défaut avec --cpus-per-task=1
est suffisante pour la plupart des travaux lancés. La majorité des utilisateurs n'a donc
pas à modifier la valeur de cette option. Cette page s'adresse aux utilisateurs qui ont
un besoin en mémoire plus important.
Pour les partitions GPU, comme par défaut --cpus-per-task=1, si vous ne changez pas
cette valeur comme expliqué ci-dessous, vous ne pourrez pas accéder à la totalité de
la mémoire potentiellement accessible par tâche/GPU réservé. En particulier, vous
risquez de faire rapidement des débordements mémoire au niveau des processus s'exécutant
sur les processeurs.
Notez qu'il peut aussi se produire des débordements mémoire au niveau des GPU car ils disposent d'une mémoire individuelle dont la taille varie suivant le type de GPU et donc la partition utilisée. Une solution consiste alors à utiliser plus de GPU.
Sur la partition cpu_p1 (défaut)
Les nœuds de la partition cpu_p1 donnent accès à 156 Go de mémoire
utile, pour 40 cœurs CPU. L'allocation mémoire y est déterminée
automatiquement à hauteur de :
- 3,9 Go par cœur CPU lorsque l'hyperthreading est désactivé
(option Slurm
--hint=nomultithread)
Par exemple, un travail spécifiant --ntasks=1 --cpus-per-task=5 sur la
partition cpu_p1 aura accès à 1 x 5 x 3,9 Go = 19,5 Go de mémoire si
l'hyperthreading est désactivé (comptez la moitié sinon).
Notez que si votre code est purement séquentiel ou purement MPI, vous pouvez ainsi demander plus de mémoire par tache si nécessaire (besoin de plus de mémoire par processus). Mais ceci va engendrer une surfacturation du travail (attribution par Slurm de ressources CPU supplémentaires qui ne sont pas utilisées) : les heures CPU consommées par le travail seront alors calculées comme si vous aviez réservé plus de CPU pour le travail mais sans qu'ils soient utilisés et donc sans bénéfice pour les temps de calcul (voir les remarques en bas de page).
Sur la partition prepost
Les nœuds de la partition prepost donnent accès à 2,88 To de
mémoire utile, pour 48 cœurs CPU. L'allocation mémoire y est déterminée
automatiquement à hauteur de :
- 60 Go par cœur CPU lorsque l'hyperthreading est désactivé
(option Slurm
--hint=nomultithread)
Par exemple, un travail spécifiant --ntasks=1 --cpus-per-task=12 sur la
partition prepost aura accès à 1 x 12 x 60 Go = 720 Go de mémoire si
l'hyperthreading est désactivé (comptez la moitié sinon).
Sur la partition gpu_p13 (défaut)
Les nœuds de la partition gpu par défaut disposent de 156 Go de mémoire utile et 40 cœurs CPU. L'allocation mémoire y est donc déterminée automatiquement à hauteur de :
- 156/40 = 3,9 Go par cœur CPU réservé lorsque l'hyperthreading est
désactivé (option Slurm
--hint=nomultithread)
Chaque nœud de calcul de la partition gpu par défaut contient 4 GPU et 40 cœurs CPU. Vous pouvez donc réserver 1/4 de la mémoire du nœud par GPU en demandant 10 CPU (i.e. 1/4 des 40 cœurs) par GPU :
--cpus-per-task=10 # reservation d'1/4 de la memoire par GPU (partition gpu par défaut)
Vous réservez ainsi 3,9*10 = 39 Go de la mémoire du nœud par GPU, lorsque l'hyperthreading est désactivé (comptez la moitié sinon).
Notez que vous pouvez demander plus de 39 Go de mémoire par GPU si nécessaire (besoin de plus de mémoire par processus). Mais ceci va engendrer une surfacturation du travail (attribution par Slurm de ressources GPU supplémentaires qui ne sont pas utilisées) : les heures GPU consommées par le travail seront alors calculées comme si vous aviez réservé plus de GPU pour le travail mais sans qu'ils soient utilisés et donc sans bénéfice pour les temps de calcul (voir les remarques en bas de page).
Sur la partition gpu_p2
La partition gpu_p2 est subdivisée en deux sous-partitions :
- la sous-partition
gpu_p2sà 360 Go de mémoire utile par nœud - la sous-partition
gpu_p2là 720 Go de mémoire utile par nœud
Comme chaque nœud de cette partition contient 24 cœurs CPU, l'allocation mémoire est déterminée automatiquement à hauteur de :
- 320/24 = 15 Go par cœur CPU réservé sur la partition
gpu_p2s, lorsque l'hyperthreading est désactivé (option Slurm--hint=nomultithread) - 720/24 = 30 Go par cœur CPU réservé sur la partition
gpu_p2l, lorsque l'hyperthreading est désactivé
Chaque nœud de calcul de la partition gpu_p2 contient 8 GPU et 24
cœurs CPU. Vous pouvez donc réserver 1/8 de la mémoire du nœud par GPU
en demandant 3 CPU (i.e. 1/8 des 24 cœurs) par GPU :
--cpus-per-task=3 # reservation d'1/8 de la memoire par GPU (partition gpu_p2)
Vous réservez ainsi, lorsque l'hyperthreading est désactivé (comptez la moitié sinon) :
- 45 Go de mémoire par GPU sur la sous-partition
gpu_p2s - 90 Go de mémoire par GPU sur la sous-partition
gpu_p2l
Notez que vous pouvez demander plus de 45 Go (sur gpu_p2s) ou 90 Go (sur
gpu_p2l) de mémoire par GPU si nécessaire (besoin de plus de mémoire
par processus). Mais ceci va engendrer une surfacturation du travail
(attribution par Slurm de ressources GPU supplémentaires qui ne sont pas
utilisées) : les heures GPU consommées par le travail seront alors calculées
comme si vous aviez réservé plus de GPU pour le travail mais sans qu'ils
soient utilisés et donc sans bénéfice pour les temps de calcul (voir les
remarques en bas de page).
Sur la partition gpu_p5
Les nœuds de la partition gpu_p5 disposent de 468 Go de mémoire utile
et 64 cœurs CPU. L'allocation mémoire y est donc déterminée
automatiquement à hauteur de :
- 468/64 = 7,3 Go par cœur CPU réservé lorsque l'hyperthreading est
désactivé (option Slurm
--hint=nomultithread)
Chaque nœud de calcul de la partition gpu_p5 contient 8 GPU et 64
cœurs CPU. Vous pouvez donc réserver 1/8 de la mémoire du nœud par GPU
en demandant 8 CPU (i.e. 1/8 des 64 cœurs) par GPU :
--cpus-per-task=8 # reservation d'1/8 de la memoire par GPU (partition gpu_p5)
Vous réservez ainsi 8*7,3 = 58 Go de la mémoire du nœud par GPU, lorsque l'hyperthreading est désactivé (comptez la moitié sinon).
Notez que vous pouvez demander plus de 58 Go de mémoire par GPU si nécessaire (besoin de plus de mémoire par processus). Mais ceci va engendrer une surfacturation du travail (attribution par Slurm de ressources GPU supplémentaires qui ne sont pas utilisées) : les heures GPU consommées par le travail seront alors calculées comme si vous aviez réservé plus de GPU pour le travail mais sans qu'ils soient utilisés et donc sans bénéfice pour les temps de calcul (voir les remarques en bas de page).
Sur la partition gpu_p6
Les nœuds de la partition gpu_p6 disposent de 468 Go de mémoire utile
et 96 cœurs CPU. L'allocation mémoire y est donc déterminée
automatiquement à hauteur de :
- 468/96 = 4,87 Go par cœur CPU réservé lorsque l'hyperthreading est
désactivé (option Slurm
--hint=nomultithread)
Chaque nœud de calcul de la partition gpu_p6 contient 4 GPU et 96
cœurs CPU. Vous pouvez donc réserver 1/4 de la mémoire du nœud par GPU
en demandant 24 CPU (i.e. 1/4 des 96 cœurs) par GPU :
--cpus-per-task=24 # reservation d'1/4 de la memoire par GPU (partition gpu_p6)
Vous réservez ainsi 4*4,87 = 117 Go de la mémoire du nœud par GPU, lorsque l'hyperthreading est désactivé (comptez la moitié sinon).
Notez que vous pouvez demander plus de 117 Go de mémoire par GPU si nécessaire (besoin de plus de mémoire par processus). Mais ceci va engendrer une surfacturation du travail (attribution par Slurm de ressources GPU supplémentaires qui ne sont pas utilisées) : les heures GPU consommées par le travail seront alors calculées comme si vous aviez réservé plus de GPU pour le travail mais sans qu'ils soient utilisés et donc sans bénéfice pour les temps de calcul (voir les remarques en bas de page).
Remarques
- Vous pouvez réserver plus de mémoire en augmentant la valeur de
--cpus-per-task, tant que la demande ne dépasse pas la totalité de la mémoire disponible sur le nœud. Attention, les heures de calcul seront décomptées en proportion, par exemple :- sur la partition CPU, en spécifiant les options
--ntasks=10 --cpus-per-task=2, 20 cœurs CPU seront réservés et donc comptabilisés pour votre travail. - si vous réservez 1 GPU sur la partition GPU par défaut avec les options
--ntasks=1 --gres=gpu:1 --cpus-per-task=20, l'équivalent d'un travail sur 2 GPU vous sera facturé en raison de--cpus-per-task=20.
- sur la partition CPU, en spécifiant les options
- Si vous réservez un nœud de calcul en exclusivité, vous avez accès à
la totalité de la mémoire du nœud, indépendamment de la valeur
donnée à
--cpus-per-task. L'équivalent d'un travail sur le nœud entier vous est alors facturé. - Pour les codes OpenMP : si la valeur donnée à l'option
--cpus-per-taskne coïncide pas avec le nombre de threads sur lequel vous souhaitez exécuter votre code, il faut spécifier la variable d'environnement :export OMP_NUM_THREADS=... - La quantité de mémoire allouée pour votre travail est visible en lançant
la commande Slurm :
Attention, tant que le travail est en queue (statut PENDING), Slurm estime la mémoire allouée à un travail sur la base de cœurs logiques. Si vous avez réservé des cœurs physiques (avec
scontrol show job $JOBID # chercher la valeur de la variable mem--hint=nomultithread), la valeur indiquée peut donc être deux fois inférieure à la valeur attendue. Celle-ci est mise à jour et devient correcte lors du démarrage du travail.