{{Draft}}
Dans le but de minimiser le gaspillage de ressources dans nos grappes, nous vous présentons ici les erreurs les plus fréquentes que nous avons observées chez nos utilisateurs, ainsi que les correctifs à appliquer. Les exemples sont répartis en trois catégories: CPU, GPU et mémoire.
Les différents graphiques proviennent des portails de Narval et Béluga, et sont présentés à la page suivante: [[Portail|Portail]].
== CPU ==
=== Demander plusieurs coeurs dans le contexte d’une tâche en série. ===
Une tâche en série est une tâche qui s'exécute sur un seul processeur ou cœur de calcul à la fois, sans parallélisme. Contrairement aux tâches parallèles qui peuvent mobiliser plusieurs processeurs ou cœurs simultanément pour accélérer le traitement, les tâches en série suivent une exécution strictement séquentielle. La mémoire est partagée par les processus et fils d’exécution.
Voici un exemple de script de soumission pour une tâche en série. Un seul coeur est demandé à l'aide de l'option --cpus-per-task=1
.
{{File
|name=simple_job.sh
|lang="sh"
|contents=
#!/bin/bash
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=4G
#SBATCH --time=02:00:00
#SBATCH --account=def-someuser
module load python/3.11
python3 mon_script.py
}}
Quelle est l’apparence d’une tâche en série dans l’interface du portail ?
L'échelle verticale du graphique CPU est fixée à 1, ce qui correspond à un cœur demandé. L'utilisation est représentée en bleu et remplit entièrement le graphique, indiquant une utilisation proche de 100%.
--cpus-per-task=8
).
{{File
|name=simple_job.sh
|lang="sh"
|contents=
#!/bin/bash
#SBATCH --cpus-per-task=8
#SBATCH --mem-per-cpu=32G
#SBATCH --time=03:00:00
#SBATCH --account=def-someuser
module load python/3.11
python3 mon_script.py
}}
Dans le graphique CPU, bien que l'échelle verticale représente un total de 8 coeurs, comme demandé, on observe qu'il y a seulement un seul coeur qui est actif. L'activité des différents fils d'exécution reste inférieure à l’utilisation d’un seul cœur. Dans cet exemple, 7 coeur sont gaspillés. Le correctif consisterait à demander seulement 1 coeur au lieu de 8 (--cpus-per-task=1
).
--mem-per-cpu=6G
.
--cpus-per-task
sera supérieur à 1. On peut utiliser la variable d'environnement $SLURM_CPUS_PER_TASK
pour représenter le nombre de coeurs dans notre programme. Un seul noeud est nécessaire, car seules les tâches distribuées peuvent utiliser plusieurs noeuds. Voir la section sur les tâche multiprocesseur (ajouter le lien). Les fils d'exécution partagent la mémoire allouée. Dans cet exemple, nous aurons un total de 64 Go ( 16 coeurs x 4 Go).
{{File
|name=simple_job.sh
|lang="sh"
|contents=
#!/bin/bash
#SBATCH --cpus-per-task=16
#SBATCH --mem-per-cpu=4G
#SBATCH --time=00:15:00
#SBATCH --account=def-someuser
monscript --threads $SLURM_CPUS_PER_TASK
}}
À quoi ressemble une tâche multifil sur le portail?
L'échelle verticale du graphique CPU est fixée à 16, ce qui correspond aux coeurs demandés dans le script de soumission. L'utilisation de chaque coeur est représenté par une couleur différente. Chaque coeur est utilisé à 100%, puisque la somme des utilisations remplit entièrement le graphique.
#SBATCH --cpus-per-task=10
. Voir le graphique Processes and threads à titre de référence.
#SBATCH --mem-per-cpu=1
à #SBATCH --mem-per-cpu=3
, pour un total de 30 Go.
#SBATCH --mem=0
, on demande à allouer toute la mémoire disponible du noeud. Cette option est valable uniquement si tous les coeurs du noeud sont également alloués et utilisés. Dans ce cas, il est possible de demander la totalité de la mémoire associée au noeud.
#SBATCH --ntasks=24
pour #SBATCH --ntasks=16
.
#SBATCH --mem-per-cpu=1G
.
#SBATCH --cpus-per-task>1
. Dans le cas d’une tâche multiprocesseur qui n’est pas multithreadée (c’est-à-dire qui utilise un seul fil d’exécution par processus), un seul cœur est requis par processus. Si davantage de cœurs sont alloués, ils resteront inutilisés, car chaque processus ne peut exploiter qu’un seul fil.
Cela se reflète dans le graphique d’utilisation du CPU : on observe que seulement la moitié des cœurs sont actifs, car un seul des deux cœurs alloués par processus est effectivement utilisé.
#SBATCH --mem-per-cpu=2g
afin de limiter la marge excédentaire.
#SBATCH --cpus-per-task=2
est utilisée, on constate qu'il y a deux fois moins de fils d'exécution actifs que de coeurs alloués. Cela indique que chaque processus n’utilise qu’un seul fil, laissant l’autre cœur inutilisé. Prenons par exemple le noeud '''nc30408''', où l'on retrouve 16 coeurs alloués (section Ressources du Portail), mais seulement 8 fils d'exécutions actifs (graphique Processes and threads).