Comment bien choisir le paramètre mémoire de sbatch?

Bonjour,

Tout d'abord, merci pour tout le travail fourni afin de nous faire profiter de cet outil !

Ensuite, je commence tout juste à utiliser le server (c'est mon 1er post). Aussi, j'aimerai avoir des précisions concernant les bonnes pratiques d'utilisation de la commande sbatch. J'ai lu la doc disponible ici. Cependant, n'ayant personne pour m'expliquer comment les choses fonctionnent, je me tourne vers vous (j'epsère frapper à la bonne porte).

J'ai notamment lu qu'on pouvait avoir un retour sur les caractéristiques du job avec la commande seff qui me retourne ceci :

$ seff 20878188
Job ID: 20878188
Cluster: core
User/Group: cchevalier/cchevalier
State: COMPLETED (exit code 0)
Nodes: 1
Cores per node: 4
CPU Utilized: 06:33:31
CPU Efficiency: 60.31% of 10:52:32 core-walltime
Job Wall-clock time: 02:43:08
Memory Utilized: 1.11 TB
Memory Efficiency: 455.99% of 250.00 GB

Par ailleurs, voici les paramètres donnés à mon script sbatch :

#SBATCH --time=12:00:00
#SBATCH --mem=250GB
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4

Mon job a explosé le quota de mémoire demandé 1,11TB pour 250GB demandé. Pourtant, lorsque j'ai tenté de mettre l'option --mem=500GB, je n'ai pas pu lancer le job, avec ce message d'erreur :

sbatch: error: Memory specification can not be satisfied
sbatch: error: Batch job submission failed: Requested node configuration is not available

Mes questions :
a) Comment prévoir efficacement la quantité de mémoire nécessaire ?
b) Comment en faire la requête dans les paramètres sbatch ?
c) Faut-il que je demande plus de cores, seulement pour accéder à la mémoire ?

Dans mon script R, je fais bien appelle à plusieurs ẁorkersen utilisant la librairiefuture`. Je suis donc content de voir que la durée CPU est bien supérieure au temps d'execution du job.

Bien cordialement,
Céline

Bonjour Céline,

Je dois avouer que quelque chose m'échappe. En effet, au vu de la demande (--mem=250GB) et du fait de la capacité du serveur (256G de mémoire physique) , il n'est pas possible que le job en question est utilisé 1.11 TB. Mais, en effet, c'est pourtant bien ce que remontent les outils (comme seff, ou sacct)...

Je penche pour une erreur d'enregistrement ou un bug. @team.ifbcorecluster avez-vous déjà rencontré ce type d'anomalie ?

Quelques éléments de réponses à vos questions:

a) Comment prévoir efficacement la quantité de mémoire nécessaire ?

L'habitude ou les tests... Il n'y a pas à ma connaissance d'outils ou de méthodes.
La commande seff, comme vous l'avez fait, est alors très utile pour évaluer les ressources utilisées.

b) Comment en faire la requête dans les paramètres sbatch ?

Exactement comme vous avez fait :slight_smile:
On peut spécifier la mémoire totale dont on a besoin (indépendamment du nombre de CPU):

#SBATCH --mem=200GB

Ou en spécifiant un taille de mémoire par CPU. Dans ce cas, la mémoire totale allouée dépendra du nombre de CPU demandé (soit ici 10*20GB = 200 GB):

#SBATCH --cpus-per-task=10
#SBATCH --mem-per-cpu=20GB

c) Faut-il que je demande plus de cores, seulement pour accéder à la mémoire ?

Pas forcément (cf. réponse ci-dessus).
Usuellement plus on utilise de mémoire, plus on utilise de CPU mais c'est pas une règle absolue.
Il faut noter aussi que si on demande 250GB de mémoire (soit la totalité de la mémoire disponible sur un nœud de calcul standard de l'IFB Core), alors autant utiliser la totalité des CPU de ce nœud (puisque faute de mémoire encore disponible, il ne pourra y avoir d'autre jobs exécuté sur ce nœud). Cf la liste des noeuds de calcul avec leur capacité CPU et mémoire: https://ifb-elixirfr.gitlab.io/cluster/doc/slurm_at_ifb/#ifb-core-cluster-computing-nodes

Dites-nous si ce n'est pas clair ou si vous avez besoin de complément d'information.

Bonjour David,

Merci beaucoup pour cette réponse. Elle m'aide à mieux comprendre comment tout cela fonctionne.

Concernant l'excédent de mémoire, j'ai peut-être un élément de réponse à vous proposer. La taille des objets utilisés dans mon script sont de plusieurs Giga. Donc après chaque manipulation des données, je supprime toutes les données temporaires et effectue un "garbage collection". Cela pourrai expliquer pourquoi il y a une sur-allocation des ressources, et surtout comment une unité physique de stockage peut être utilisée à plusieurs reprises. Cependant, je reste surprise face à un tel écart !

Pour ce qui est de la réservation de tous les CPUs d'un noeud, il suffirait que j'ajoute la commande #SBATCH --exclusive à mon fichier ?

Paramètres demandés au début de la discussion :

#SBATCH --time=12:00:00
#SBATCH --mem=250GB
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4

Paramètres faisant suite à notre discussion ?

#SBATCH --time=5:00:00
#SBATCH --exclusive
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4

Cela veux dire que je peux aussi passer le paramètre --cpus-per-task à 38 ou 56 (selon le noeud de calcul) ?

Encore merci pour tous ces précieux conseils.
Céline

1 « J'aime »

Bonjour Céline,

Je reste déconcerté par le retour des commandes seff/sacct. Normalement, peu importe l'usage de la mémoire (manipulation, suppression, garbage collector, etc), on ne devrait pas observer une utilisation supérieur à 100%.

Pour ce qui est de la réservation de tous les CPUs d'un noeud, il suffirait que j'ajoute la commande #SBATCH --exclusive à mon fichier ?

L'option exclusive indique que vous souhaiter utiliser la totalité des ressources de la machines (ie seul votre job tournera sur le nœud).
C'est donc une possibilité pour utiliser la totalité des CPU ou de la mémoire.
Par contre, il faut faire attention, puisque les noeuds de calcul sont souvent hétérogènes.
Vous pourriez donc tomber sur un nœud avec 128G de RAM / 30 CPU (au lieu des 250Go escompté).

Je conseille donc plutôt d'expliciter la mémoire que l'on veut avec --mem ou --mem-per-cpu.
Ça permets également d'indiquer les ressources nécessaires pour le traitement (quand on replonge quelques mois plus tard dans son script ou quand on le partage).

Dans votre cas, j'opterais pour les paramètres suivants:

#SBATCH --time=12:00:00  # A ajuster suivant les premiers tests (prendre une marge !)
#SBATCH --mem=250GB
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=54  # Les noeuds avec 250Go de mémoire, ont 54 CPU utilisables

Ou si j'utilise finalement moins de mémoire (par exemple):

#SBATCH --time=12:00:00  # A ajuster suivant les premiers tests (prendre une marge !)
#SBATCH --mem=128GB
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=27  # Les noeuds avec 250Go de mémoire, ont 54 CPU utilisables

A noter:

  • la quantité de CPU/RAM varie suivant les caractéristiques matériel des noeuds de calcul disponible sur le site (sur l'IFB Core: https://ifb-elixirfr.gitlab.io/cluster/doc/slurm_at_ifb/#ifb-core-cluster-computing-nodes)
  • la quantité à demander dépends beaucoup voire exclusivement du logiciel et des données à traiter
  • lorsqu'on souhaite utliiser plusieurs CPU pour un même traitement, il faut souvent l'indiquer au logiciel via une option (par exemple -t nombre de thread, -p nombre de processus ou -c nombre de core/cpu). A défaut ou si rien est indiqué dans la documentation, il est probable qu'un seul CPU sera utilisé.

Bonjour David,

Merci pour ces précieux conseils !!!
A bien y réfléchir, il est bon d'expliciter un maximum les ressources. Pour rappel, je n'avais jamais eu besoin d'utiliser ce type d'infrastructure auparavant :slight_smile:

Faut-il que je laisse le topic ouvert, étant donné les retours des commandes seff et sacct ?
De mon côté, tout est bon, vous avez su répondre à mes interrogations.

Bonne continuation,
Céline

Parfait. Je marque le sujet résolu mais dans tous les cas on peut continuer à en discuter si besoin (ou si jamais on trouve une explication au mystère :p).

Bon calcul !

J'en profite pour signaler que j'ai déjà un autre job qui a un résultat similaire en terme de mémoire.

J'avais déjà anticipé la réservation de 54 noeuds pour avoir un maximum de mémoire. Et voilà !
Si cela peut aider, je vous tiendrai au courant si j'ai d'autres résultats similaires.

$ seff 20974872
Job ID: 20974872
Cluster: core
User/Group: cchevalier/cchevalier
State: COMPLETED (exit code 0)
Nodes: 1
Cores per node: 54
CPU Utilized: 10:26:38
CPU Efficiency: 3.29% of 13-05:05:06 core-walltime
Job Wall-clock time: 05:52:19
Memory Utilized: 473.27 GB
Memory Efficiency: 189.31% of 250.00 GB