^ [[technique:accueil#mots_cles|Mots clés]] | {{tag> "cluster de calcul" hpc stargate}} |
@Misc{HPC_LERIA,
title = {High Performance Computing Cluster of LERIA},
year = {2018},
note = {slurm/debian cluster of 27 nodes(700 logical CPU, 2 nvidia GPU tesla k20m, 1 nvidia P100 GPU), 120TB of beegfs scratch storage}
}
star242 | Dell R730 | 1 | Tesla P100 | 1 | [[https://ark.intel.com/fr/products/92986/Intel-Xeon-Processor-E5-2620-v4-20M-Cache-2-10-GHz-|intel-E5-2620]] | 2 | 8 | 16 | 32 | 128 Go | 1 To | 2*10Gb/s |
| star[199-195] | Dell R415 | 5 | X | 0 | [[https://www.cpubenchmark.net/cpu.php?cpu=AMD+Opteron+6134&id=1566|amd-opteron-6134]] | 1 | 8 | 16 | 16 | 32 Go | 1 To | 2*1Gb/s |
| star[194-190] | Dell R415 | 5 | X | 0 | [[https://www.cpubenchmark.net/cpu.php?cpu=AMD+Opteron+4184&id=278|amd-opteron-4184]] | 1 | 6 | 12 | 12 | 32 Go | 1 To | 2*1Gb/s |
| star100 | Dell T640 | 1 | RTX 2080 Ti | 4 | [[https://ark.intel.com/content/www/fr/fr/ark/products/123540/intel-xeon-bronze-3106-processor-11m-cache-1-70-ghz.html|intel-xeon-bronze-3106]] | 1 | 8 | 16 | 16 | 96 Go | X | 2*10 Gb/s |
| star101 | Dell R740 | 1 | Tesla V100 32 Go | 3 | [[https://ark.intel.com/content/www/us/en/ark/products/193390/intel-xeon-silver-4208-processor-11m-cache-2-10-ghz.html|intel-xeon-server-4208]] | 2 | 8 | 16 | 32 | 96 Go | X | 2*10 Gb/s |
==== Architecture logicielle ====
L'architecture logicielle de soumissions de taches s’appuie sur l'outil //Slurm//.
Slurm est un système de planification et de gestion de grappes open source, tolérant aux pannes et extrêmement évolutif, conçu pour les clusters Linux.
Au sens de Slurm, les nœuds (serveurs) de calculs sont nommés //nodes//, et ces nœuds sont regroupés en famille appelée //partition// (qui n'ont rien à voir avec la notion de partition qui segmente un périphérique de stockage de masse)
Notre cluster dispose de 5 partitions nommées :
* gpu
* intel-E5-2695
* ram
* amd
* std
Chacune de ces partitions contient des nœuds.
Les nœuds de calcul fonctionnent avec un système d'exploitation debian stable. Vous pouvez trouvez la liste des logiciels installés dans la section [[leria:centre_de_calcul:cluster#listes_des_logiciels_installes_pour_le_calcul_haute_performance|listes des logiciels installés pour le calcul haute performance]].
==== Politique d'utilisation ====
#include
int main() {
std::cout<<"Hello world!"<
On pourra le compiler en utilisant un des nœuds de la partition intel-E5-2695 via la commande :
username_ENT@stargate:~$ srun --partition=intel-E5-2695 g++ -Wall main.cpp hello
Slurm affecte une partition par défaut à chaque utilisateur. Par conséquent, si intel-E5-2695 est votre partition par défaut (repérée par une étoile * dans le retour de **sinfo**) alors la commande précédente est équivalente à la suivante
username_ENT@stargate:~$ srun g++ -Wall main.cpp hello
==== Exécution interactive ====
Finalement, on pourra exécuter ce programme fraichement compilé avec
user@stargate:~$ srun -p intel-E5-2695 ./hello
La plupart du temps, une exécution interactive ne vous intéressera pas, vous préférerez et vous devez utiliser la soumission d'un job en mode batch (traitement par lot). L’exécution interactive peut-être intéressante pour la compilation ou pour du "débuguage".
==== Exécution en mode batch (traitement par lot) ====
* C'est dans ce mode que l'on utilise un cluster de calcul pour l'exécution de ses processus
* Vous devez rédiger un script de soumission, celui ci contient 2 sections:
* Les ressources que vous souhaitez utiliser
* Les variables destinés à slurm sont précédées par #SBATCH
* Les commandes nécessaires pour exécuter le programme
=== Exemple ===
#!/bin/bash
# hello.slurm
#SBATCH --job-name=hello
#SBATCH --output=hello.out
#SBATCH --error=hello.err
#SBATCH --mail-type=end
#SBATCH --mail-user=user@univ-angers.fr
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --partition=intel-E5-2695
/path/to/hello && sleep 5
user@stargate:~$ sbatch hello.slurm # Soumission du job
user@stargate:~$ squeue # Place et état des jobs dans la queue de soumission
user@stargate:~$ cat hello.out # Affiche ce qu'aurait affiché la sortie standard en mode interactif (resp. hello.err pour la sortie d'erreur)
Très souvent, on souhaite exécuter un seul et même programme pour un ensemble de fichier ou un ensemble de parametres, dans ce cas, il y a 2 solutions à privilégier:
* Utiliser un array job (facile à utiliser, **c'est la solution à privilégier**).
* Utiliser les steps job (plus complexe à mettre en œuvre).
===== IMPORTANT: Disponibilité et politique de gestion des ressources =====
Slurm est un planificateur de tâches. La planification est un problème d'optimisation difficile et gourmand en ressources. Il est beaucoup plus facile pour un planificateur de planifier des jobs dont il connaît:
* sa durée
* les ressources à utiliser (CPU, Mémoire)
De fait, il a été définit des ressources par défaut:
* la durée d'un job est de 20 minutes
* la mémoire disponible par CPU est de 200 Mo
Il est tout a fait possible de surcharger ces valeurs par défaut avec les options --mem-per-cpu et --time. Toutefois,
ATTENTION:
* vous ne devriez pas surévaluer les ressources de vos jobs. En effet, slurm fonctionne avec une notion de partage juste (fair share): si vous réservez des ressources, peu importe que vous les utilisiez ou non. Lors de vos prochaines soumissions, slurm considérera que vous aviez effectivement consommé ces ressources. Potentiellement, vous pourriez être considéré comme un utilisateur gourmand et être moins prioritaire que un utilisateur ayant correctement définit ses ressources pour la même quantité de travail effectué.
* Si vous avez un grand nombre de job à faire, **vous devez utiliser la soumission par array job**.
* Si ces jobs ont de grandes durées d'exécutions (plus de 1 journée), **vous devez limiter le nombre d’exécution en parallèle afin de ne pas saturer le cluster**. Nous laissons la possibilité aux utilisateurs de fixer cette limite, mais en cas de problème de partage de ressources avec les autres utilisateurs, **nous supprimerons les jobs ne respectant pas ces conditions**.
==== Limitations ====
| | MaxWallDurationPerJob | MaxJobs | MaxSubmitJobs | FairSharePriority |
| leria-user | 14 days | | 10000 | 99 |
| guest-user | 7 days | 20 | 50 | 1 |
=== Quota espace disque ===
Voir aussi [[leria:centre_de_calcul:cluster#politique_d_utilisation|politique d'utilisation]] et [[leria:centre_de_calcul:cluster#stockage_des_donnees|stockage des données]].
Par défaut le quota d'espace disque est limité à 50Go. Vous pouvez facilement savoir quels sont les fichiers qui vous prennent le plus de place grâce à la commande:
user@stargate ~ # ncdu
===== Stockage des données =====
Voir aussi [[leria:centre_de_calcul:cluster#architecture_globale|architecture globale]].
* Le cluster de calcul utilise un pool de serveurs de stockages distribués [[https://www.beegfs.io/content/|beegfs]] . Ce stockage beegfs est indépendant des serveurs de calcul. Cette zone de stockage est accessible naturellement dans l’arborescence de n'importe quel nœud de calcul sous /home/$USER. Étant donné que ce stockage est distant, toute lecture/écriture dans votre home est dépendante du réseau. Notre stockage Beegfs et le réseau sous-jacent sont très performant, mais pour certains traitement lourd, vous gagneriez peut-être à vous servir des disques locaux des serveurs de calcul. Pour ce faire, vous pouvez utiliser le répertoire /local_working_directory des serveurs de calculs. Ce répertoire fonctionne de la même manière que /tmp à la différence que les données sont persistante en cas de redémarrage du serveur.
* Si vous souhaitez créer des groupes, merci d'envoyer un email à technique.info [at] listes.univ-angers.fr avec le nom du groupe et les utilisateurs associés.
* Pour rappel, **par défaut**, les droits de votre home sont définis à 755, donc **tout le monde peut lire et exécuter vos données**.
===== Utilisation avancée =====
==== Array jobs ====
Vous devriez commencer par lire la [[https://slurm.schedmd.com/job_array.html|documentation officielle]]. Cette [[http://scicomp.aalto.fi/triton/tut/array.html|page]] présente des cas d'utilisations intéressants.
Si vous avez un grand nombre de fichier ou de parametres à traiter avec un seul exécutable, vous devez utiliser un [[https://slurm.schedmd.com/job_array.html|array job]].
C'est facile à mettre en œuvre, il suffit de rajouter l'option --array à notre script batch:
=== Test paramétriques ===
Il est facile d'utiliser les array jobs pour faire des test paramétrique. C'est à dire, utiliser le même exécutable, éventuellement sur un même fichier, mais en faisant varier un paramètre en options de l’exécutable. Pour cela, si les paramètres sont contigus ou régulier, on utilisera un batch comme celui-ci:
#!/bin/bash
#SBATCH -J Job_parametre_régulier
#SBATCH -N 1
#SBATCH --ntasks-per-node=1
#SBATCH -t 10:00:00
#SBATCH --array=0-9
#SBATCH -p intel-E5-2670
#SBATCH -o %A-%a.out
#SBATCH -e %A-%a.err
#SBATCH --mail-type=end,fail
#SBATCH --mail-user=username@univ-angers.fr
/path/to/exec --optionParamExec $SLURM_ARRAY_TASK_ID
L'options --array peut prendre des syntaxes particulières, pour des valeurs irrégulières ou pour des sauts de valeurs:
# Valeurs irrégulières 0,3,7,11,35,359
--array=0,3,7,11,35,359
# Valeur séparé par des sauts de +2: 1, 3, 5 et 7
--array=1-7:2
=== Job pour multiples instances ===
Il est courant de devoir exécuter un programme de nombreuses fois sur de nombreuses instances (benchmark).
Soit l'arborescence suivante:
job_name
├── error
├── instances
│ ├── bench1.txt
│ ├── bench2.txt
│ └── bench3.txt
├── job_name_exec
├── output
└── submit_instances_dir.slurm
Il est facile d'utiliser un array job pour exécuter job_name_exec sur l'ensemble des fichiers à traiter dans le répertoire instances. Il suffit d'éxécuter la commande suivante:
mkdir error output 2>/dev/null || sbatch --job-name=$(basename $PWD) --array=0-$(($(ls -1 instances|wc -l)-1)) submit_instances_dir.slurm
avec le batch submit_instances_dir.slurm suivant:
#!/bin/bash
#SBATCH --mail-type=END,FAIL
#SBATCH --mail-user=YOUR-EMAIL
#SBATCH -o output/%A-%a
#SBATCH -e error/%A-%a
#INSTANCES IS ARRAY OF INSTANCE FILE
INSTANCES=(instances/*)
./job_name_exec ${INSTANCES[$SLURM_ARRAY_TASK_ID]}
=== Job pour multiples instances avec multiples exécutions (Seed number) ===
Parfois il faut lancer plusieurs fois l'exécution sur une instance en modifiant la graine qui permet de générer des nombres aléatoire.
Soit l'arborescence suivante:
job_name
├── error
├── instances
│ ├── bench1.txt
│ ├── bench2.txt
│ └── bench3.txt
├── job_name_exec
├── output
├── submit_instances_dir_with_seed.slurm
└── submit.sh
Il suffit d’exécuter la commande suivante:
./submit.sh
avec le fichier submit.sh suivant (pensez à modifier la variable NB_SEED):
#!/bin/bash
readonly NB_SEED=50
for instance in $(ls instances)
do
sbatch --output output/${instance}_%A-%a --error error/${instance}_%A-%a --array 0-${NB_SEED} submit_instances_dir_with_seed.slurm instances/${instance}
done
exit 0
et le batch submit_instances_dir_with_seed.slurm suivant:
#!/bin/bash
#SBATCH --mail-type=END,FAIL
#SBATCH --mail-user=YOUR-EMAIL
echo "####### INSTANCE: ${1}"
echo "####### SEED NUMBER: ${SLURM_ARRAY_TASK_ID}"
echo
srun echo nomApplication ${1} ${SLURM_ARRAY_TASK_ID}
Avec cette méthode, la variable SLURM_ARRAY_TASK_ID contient la graine. Et vous soumettez autant de array job que ce qu'il y a d'instance dans le répertoire instance.
Vous retrouvez facilement vos sortie qui sont nommées comme ceci:
output/nom_instance-ID_job-graine
=== Dépendances entre job ===
Vous pouvez déterminer des dépendances entre jobs via l'options --depend de sbatch:
== Exemple ==
# Attendre que certains du job array soient terminés
sbatch --depend=after:123_4 my.job
sbatch --depend=afterok:123_4:123_8 my.job2
# Attendre que tout un job soit terminé
sbatch --depend=afterany:123 my.job
# Attendre que tout un job array soit terminé avec succès
sbatch --depend=afterok:123 my.job
Vous pouvez également voir cette [[https://hpc.nih.gov/docs/job_dependencies.html|page]]
==== Steps jobs ====
L'utilisation des steps jobs ne devrait se faire que dans de très rare cas. La plupart du temps, vous devriez vous en sortie avec des array jobs, ce qui permet également au scheduler (slurm) d'être plus efficace pour le placement des jobs
Vous pouvez utiliser les steps jobs pour des exécutions multiples et variées.
Les steps jobs:
* permettent de découper un job en plusieurs tâches
* sont créés en préfixant la commande du programme à exécuter par la commande Slurm "srun"
* peuvent s'exécuter séquentiellement ou parallèlement
Chaque steps peut utiliser n tâches (task) sur N noeuds de calculs (options -n et -N de srun). Une task a cpus-per-task CPU à sa disposition, et il y a ntasks allouée par étape (step).
=== Exemple ===
#SBATCH --job-name=nameOfJob # Nom du Job
#SBATCH --cpus-per-task=1 # Allocation de 1 CPUs par task
#SBATCH --ntasks=2 # Nombre de tâches (tasks) : 2
#SBATCH --mail-type=END # Notification par email de la
#SBATCH --mail-user=username@univ-angers.fr # fin de l’exécution du job.
# Step de 2 Tasks
srun before.sh
# 2 Step en parallèle (grâce à &): task1 et task2 s’exécute en parallèle. Il n'y a qu'une seule task par Step (option -n1)
srun -n1 -N1 /path/to/task1 -threads $SLURM_CPUS_PER_TASK &
srun -n1 -N1 /path/to/task2 -threads $SLURM_CPUS_PER_TASK &
# On attend la fin de task1 et task2 avant d'excuter la dernière étape after.sh
wait
srun after.sh
=== Structures Shell (Bash) de création de Steps en fonction de la source des données ===
Récupéré d'[[http://osirim.irit.fr/site/recette/fr/articles/description-slurm|ici]]
== Exemple ==
# Boucle sur les éléments d'un tableau (ici des fichiers) :
files=('file1' 'file2' 'file3' ...)
for f in "${files[@]}"; do
# Adaptez "-n1" et "-N1" en fonction de vos besoins
srun -n1 -N1 [...] "$f" &
done
# Boucle sur les fichiers d'un répertoire :
while read f; do
# Adaptez "-n1" et "-N1" en fonction de vos besoins
srun -n1 -N1 [...] "$f" &
done < <(ls "/path/to/files/")
# Utilisez "ls -R" ou "find" pour un parcours récursif des dossiers
# Lecture ligne par ligne d'un fichier :
while read line; do
# Adaptez "-n1" et "-N1" en fonction de vos besoins
srun -n1 -N1 [...] "$line" &
done <"/path/to/file"
==== Comment utiliser OpenMp ? ====
Il suffit d'ajouter l'option --cpus-per-task et d'exporter la variable OMP_NUM_THREADS
#!/bin/bash
# openmp_exec.slurm
#SBATCH --job-name=hello
#SBATCH --output=openmp_exec.out
#SBATCH --error=openmp_exec.err
#SBATCH --mail-type=end
#SBATCH --mail-user=user@univ-angers.fr
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --partition=intel-E5-2695
#SBATCH --cpus-per-task=20
export OMP_NUM_THREADS=20
/path/to/openmp_exec
===== Utilisation spécifique=====
==== Accès ssh des noeuds de calcul ====
Par défaut, il est impossible de se connecter en ssh directement sur les nœuds de calcul. Cependant, si c'est justifié, nous pouvons facilement faire des exceptions si celles ci sont temporaires. Dans ce cas, merci de faire une demande explicite à technique [at] info.univ-angers.fr
Les utilisateurs ayant un accès en ssh doivent être abonnés à la liste calcul-hpc-leria-no-slurm-mode@listes.univ-angers.fr.
Pour s'inscrire à cette liste de diffusion, il suffit d'envoyer un mail à sympa@listes.univ-angers.fr avec pour objet: subscribe calcul-hpc-leria-no-slurm-mode Nom Prénom
__Règle par défaut:__ on ne lance pas un calcul sur un serveur sur lequel tourne déjà un calcul d'un autre utilisateur, **même si celui-ci n'utilise pas toute les ressources**.
Exception pour les processus boinc. Ces processus se mettent en pause lorsque vous exécutez vos calculs.
La commande htop vous permet de savoir qui calcule avec quelles ressources et depuis combien de temps.
Si vous avez un doute, contactez l'utilisateur qui calcule directement par email ou via la liste calcul-hpc-leria-no-slurm-mode@listes.univ-angers.fr
==== Cuda ====
Des cartes GPU sont présentent sur les noeuds star{242,253,254}:
* star242: P100
* star253: 2*k20m
* star254: 2*k20m
Actuellement, c'est la version 9.1 de cuda-sdk-toolkit qui est installé.
Ces nœuds sont pour l'instant hors des listes de soumissions de slurm (bien que la partition gpu existe déjà). Pour pouvoir vous en servir, merci d'en faire la demande explicite à technique [at] info.univ-angers.fr
==== Nœud RAM ====
Le leria dispose d'un nœud composé de 1,5 To de ram, il s'agit de star243.
Ce nœud est accesible par soumissions via slurm (partition ram). Pour pouvoir vous en servir, merci d'en faire la demande explicite à technique [at] info.univ-angers.fr
==== Cplex ====
Le Leria a une licence académique pour le logicielle Cplex.
Le chemin pour la bibliothèque Cplex est le chemin par défaut /opt/ibm/ILOG/CPLEX_Studio129 (version 12.9)
==== Environnements conda (Python) ====
La commande **conda activate **, permettant d'activer un environnement conda n'est pas utilisable avec slurm. À la place, il faut utiliser au début du script de lancement :
source ./anaconda3/bin/activate
Il sera peut être également nécessaire de mettre à jour les variables d'environnement et d'initialiser conda sur le noeud de calcul :
source .bashrc
conda init bash
L'environnement restera alors actif d'une exécution à une autre. Pour le désactiver, il faudra utiliser :
source ./anaconda3/bin/deactivate
===== FAQ =====
* Comment savoir quelles sont les ressources d'une partition, exemple avec la partition std:
user@stargate~# scontrol show Partition std
* Que signifie "Some of your processes may have been killed by the cgroup out-of-memory handler" ?
Vous avez dépassé la limite de mémoire que vous avez fixé ou celle par défaut (paramètre --mem-per-cpu)
* Comment obtenir un prompt shell interactif dans un nœud de calcul de votre partition par défaut ?
user@stargate~# salloc
Il s'agit d'un comportement par défaut. La commande en réalité passé est :
srun -n1 -N1 --mem-per-cpu=0 --pty --preserve-env --cpu-bind=no --mpi=none $SHELL
* Comment obtenir un prompt shell interactif dans un nœud de calcul spécifique ?
user@stargate~# srun -w NODE_NAME -n1 -N1 --pty bash -i
user@NODE_NAME~#
* Comment puis je citer les ressources du LERIA dans mes rédactions scientifiques ?
Vous pouvez utiliser l'entrée misc de bibtex suivante pour citer le cluster de calcul dans vos publications:
@Misc{HPC_LERIA,
title = {High Performance Computing Cluster of LERIA},
year = {2018},
note = {slurm/debian cluster of 27 nodes(700 logical CPU, 2 nvidia GPU tesla k20m, 1 nvidia P100 GPU), 120TB of beegfs scratch storage}
}
==== Erreur lors de la soumission de job ====
* Lorsque je soumet mes jobs, j'ai le message d'erreur suivant:
srun: error: Unable to allocate resources: Requested node configuration is not available
Cela signifie surement que vous essayez d'utiliser un noeud sans avoir spécifier la partition dans laquelle il se trouve. Vous devez utiliser l'option -p ou --partition suivi du nom de la partition dans laquelle se trouve le noeud. Pour avoir cette information, vous pouvez faire:
user@stargate# scontrol show node NODE_NAME|grep Partitions
===== Listes des logiciels installés pour le calcul haute performance =====
==== Via apt-get ====
* automake
* bison
* boinc-client
* bowtie2
* build-essential
* cmake
* flex
* freeglut3
* freeglut3-dev
* g++
* g++-8
* g++-7
* g++-6
* git
* glibc-doc
* glibc-source
* gnuplot
* libglpk-dev
* libgmp-dev
* liblapack3
* liblapack-dev
* liblas3
* liblas-dev
* libtool
* libopenblas-base
* maven
* nasm
* openjdk-8-jdk-headless
* r-base
* r-base-dev
* regina-rexx
* samtools
* screen
* strace
* subversion
* swiprolog
* tmux
* valgrind
* valgrind-dbg
* valgrind-mpi
==== Via pip ====
* keras
* scikit-learn
* tensorflow
* tensorflow-gpu # Sur nœuds gpu
==== Nœuds GPU via apt-get ====
* libglu1-mesa-dev
* libx11-dev
* libxi-dev
* libxmu-dev
* libgl1-mesa-dev
* linux-source
* linux-headers
* linux-image
* nvidia-cuda-toolkit
==== Installation d'un logiciel ====
Peut-être un programme est il manquant dans les liste ci dessus. Dans ce cas, 5 options s'offrent à vous:
* Faire une demande à technique [at] info.univ-angers.fr du/des logiciels que vous souhaitez installer
* Faire vous même l'installation via pip, pip2 ou pip3
* Faire vous même l'installation via conda: [[https://www.anaconda.com/download/#linux|téléchargement]] et [[https://conda.io/docs/user-guide/install/linux.html|installation]]
* Faire vous même l'installation en compilant les sources dans votre home_directory
===== Visualiser la charge du cluster de calcul haute performance =====
Pour les liens ci dessous, vous devrez vous authentifier avec votre login et mot de passe ldap (idem ENT).
==== Vue d'ensemble du cluster ====
https://grafana.leria.univ-angers.fr/d/_0Bh3sxiz/vue-densemble-du-cluster
==== Détails par nœuds ====
https://grafana.leria.univ-angers.fr/d/000000007/noeuds-du-cluster
Vous pouvez sélectionner le nœud qui vous intéresse en utilisant le menu déroulant "HOST"
====== Remerciements ======
[[leria:centre_de_calcul:remerciements|Remerciements]]