Aller au contenu principal

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.

Attention

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.

Remarque

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.
  • 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-task ne 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 :
    scontrol show job $JOBID # chercher la valeur de la variable mem
    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 --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.