From 73989a61ca9add8be214f27411ade07d7438deee Mon Sep 17 00:00:00 2001 From: Yannick Carissan Date: Wed, 22 Jan 2025 11:35:35 +0100 Subject: [PATCH 01/18] hedy initial commit --- docs/code_form/hedy/_category_.json | 4 + docs/code_form/hedy/cgu.md | 11 ++ docs/code_form/hedy/connexion.md | 7 + docs/code_form/hedy/description.md | 18 +++ docs/code_form/hedy/jobs.md | 192 +++++++++++++++++++++++++ docs/code_form/hedy/module.md | 208 ++++++++++++++++++++++++++++ static/img/hedy/hedy_lamarr.png | Bin 0 -> 89525 bytes 7 files changed, 440 insertions(+) create mode 100644 docs/code_form/hedy/_category_.json create mode 100644 docs/code_form/hedy/cgu.md create mode 100644 docs/code_form/hedy/connexion.md create mode 100644 docs/code_form/hedy/description.md create mode 100644 docs/code_form/hedy/jobs.md create mode 100644 docs/code_form/hedy/module.md create mode 100644 static/img/hedy/hedy_lamarr.png diff --git a/docs/code_form/hedy/_category_.json b/docs/code_form/hedy/_category_.json new file mode 100644 index 00000000..810840e7 --- /dev/null +++ b/docs/code_form/hedy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Hedy", + "position": 5 +} diff --git a/docs/code_form/hedy/cgu.md b/docs/code_form/hedy/cgu.md new file mode 100644 index 00000000..1762b3b1 --- /dev/null +++ b/docs/code_form/hedy/cgu.md @@ -0,0 +1,11 @@ +--- +title: "CGU" +sidebar_position: 5 +--- + + +# Conditions générales d’utilisation des ressources de calcul du mésocentre d'Aix-Marseille + +Tous les utilisateurs doivent lire et se conformer à la [charte publiée sur le site du mésocentre](https://mesocentre.univ-amu.fr/charte). + +Lien vers la charte : [cliquez ici](https://mesocentre.univ-amu.fr/charte). diff --git a/docs/code_form/hedy/connexion.md b/docs/code_form/hedy/connexion.md new file mode 100644 index 00000000..63b00494 --- /dev/null +++ b/docs/code_form/hedy/connexion.md @@ -0,0 +1,7 @@ +--- +title: "Se connecter à Hedy" +sidebar_position: 2 +--- + +Vous avez besoin d'un compte MesoNET valide. Vous pouvez trouver les étapes pour obtenir un compte [ici](https://www.mesonet.fr/documentation/user-documentation/acces/portail). + diff --git a/docs/code_form/hedy/description.md b/docs/code_form/hedy/description.md new file mode 100644 index 00000000..67318b98 --- /dev/null +++ b/docs/code_form/hedy/description.md @@ -0,0 +1,18 @@ +--- +title: "Description" +sidebar_position: 1 +--- + +# Hedy, la machine IA/GPU H100 de MesoNET + +La machine Hedy dispose de 8 Noeuds PowerEdge XE8640 : + + - 2 x Intel Xeon Platinum 8462Y+ 2,8 GHz, 32C/64T, 16 GT/s, cache 60 Mo, Turbo, HT (300 W), mémoire DDR5 à 4 800 MHz + - 32 Go RAM + - 4 x GPU NVIDIA HGX H100 SXM 80Go + - DD 3,84To + - Network 100Gb + +Elle est accessible via 2 serveurs de login et possède 1 serveur de visualisation. + +[![Portrait d'Hedy Lamarr](/img/hedy/hedy_lamarr.png)](https://fr.wikipedia.org/wiki/Hedy_Lamarr) diff --git a/docs/code_form/hedy/jobs.md b/docs/code_form/hedy/jobs.md new file mode 100644 index 00000000..f9308e65 --- /dev/null +++ b/docs/code_form/hedy/jobs.md @@ -0,0 +1,192 @@ +--- +title: Lancer un calcul +sidebar_position: 3 +--- + +# Prise en main rapide de SLURM + +Le principe d'un gestionnaire de ressources est de vous réserver des cœurs de calcul en fonction de vos besoins. **SLURM** est le gestionnaire installée sur **Vesta**. + +Vous interagissez avec le gestionnaire de ressources par les commandes suivantes : + +* **sbatch** : soumission d'un job dans une file d'attente (appelées partitions dans Slurm) ; +* **scancel** : suppression d'un job ; +* **squeue** : interrogation des jobs ; +* **scontrol** : interrogation détaillée d'un job ou d'une partition ; +* **sinfo** : interrogation des files d'attente ; +* **srun** : exécution immédiate d'une commande ; +* **salloc** : batch interactif, obtention d'un shell, permettant d'enchaîner plusieurs commandes sur les mêmes ressources ; +* **sprio** : priorités relatives entre les jobs en attente. + +Une documentation des commandes de base est disponible ici : [http://slurm.schedmd.com/man_index.html](http://slurm.schedmd.com/man_index.html) + +## Les partitions + +Les différents nœuds de calcul sont regroupés en fonction de différents critères dans des partitions. + Lors de la soumission d'un job, il faut choisir une partition. +Le cluster Vesta ne possède pour le moment qu'une parition nommé **mesonet** qui sera utilisée par défaut pour tous les jobs. Cette parition possède une limite de temps de **24 heures** par job. Cette limite est amenée à évoluer au cours du temps. + +## Lancement d'un job + +Pour lancer un job, il faut créer un script dans lequel il faut demander des ressources puis appeler son programme (voir les exemples plus loin). + +Ce script est ensuite soumi au gestionnaire de file d'attente avec la commande **sbatch**. Par exemple : + +```console +sbatch mon_script +``` + +On obtient alors un numéro de job, qui peut être manipulé avec les commandes scancel, squeue ou scontrol. + +Le script peut être écrit dans le langage de son choix (bash, zsh, tcsh, python, perl...). Il peut être exécuté directement, sans être appelé par sbatch, et dans ce cas, les directives d'allocations de ressources seront ignorées, et il s'exécutera dans le shell local. + +Par défaut, la sortie standard du job (ce qui doit normalement s'afficher sur l'écran lorsque vous exécutez votre programme) sera écrit dans le fichier **slurm-jobid.out**, avec jobid égal au numéro de job. + +Voici un exemple d'un script de soumission demandant 2 nœuds de calcul avec chacun 10 GPUs : + +```console +#! /bin/bash + +#SBATCH -p mesonet # Partition public avec des GPU +#SBATCH -A account # Cet account vous sera fourni à la création de votre projet +#SBATCH -N 2-2 # 2 nœud +#SBATCH --gres=gpu:10 # 10 GPU par nœud + +./mon_code_gpu +``` + +# Pour aller plus loin +## Demande de ressources + +Vos besoins en terme de ressources sont décrits dans l'en-tête d'un fichier via des directives Slurm. Par exemple : + +```console +#SBATCH -N 2 +``` + +demandera une allocation de 2 nœuds. + +D'autres critères peuvent être spécifié via ces directives, comme la taille mémoire souhaitée ou la durée pendant laquelle les ressources seront attribuées. + +En règle générale, plus on sera **parcimonieux dans la demande d'allocation**, plus on aura de chance de voir rapidement son job passer de l'état en attente à l'état en exécution. + +Par exemple, s'il est possible d'estimer précisément la durée nécessaire à une exécution, il peut être profitable de réduire au minimum la durée demandée pour la réservation. Ainsi une exécution se faisant en 3h30 pourra se faire au sein d'un job demandant 4h00 (marge de 30mn par précaution), avec la directive suivante : + +```console +#SBATCH -t 04:00:00 +``` + +Attention toutefois à prendre une marge suffisante, car au-delà du temps demandé, l'exécution est stoppée automatiquement par Slurm. + +Attention : toutes les partitions sont configurées avec une limite de temps d'exécution par défaut, qui s'applique à tout job ne précisant pas combien de temps doit lui être alloué. Pour connaître cette limite, utiliser la commande suivante : + +``` +sinfo -l +``` + +Remarque : tous les arguments de la directive #SBATCH peuvent également être utilisés en arguments des commandes srun, salloc et sbatch. Voir les exemples plus loin. + +## Quelques directives utiles + +* **-p** : partition à utiliser pour le job +* **-A** : compte Slurm à utiliser (il vous est fourni pour chaque projet) +* **-N** : nombre de nœuds (min - max) +* **-n** : nombre de tâches (1 par nœud par défaut) +* **--cpus-per-task** : nombre de cœurs par tâche +* **--tasks-per-node=** : nombre de tâches par nœud +* **-t J-HH:MM:SS** : temps alloué du job, avant qu'il ne soit stoppé (par défaut, celui de la partition; voir sinfo -l) +* **--gres=gpu:N** : nombre de GPU par nœud (N de 1 à 10) +* **--mail-type=END** : envoyer un mail à la fin du job (BEGIN pour en recevoir un au lancement. ALL pour en recevoir un à chaque étape) +* **--mail-user=mon@adresse** : adresse mail à utiliser +* **--mem=0000M** : mémoire par nœud en Mo (pour le dire en Go, remplacer M par G) +* **-o fichier_sortie** : le fichier de sortie du job + +Vous trouverez une liste exhaustive sur le site de Slurm : [https://slurm.schedmd.com/sbatch.html](https://slurm.schedmd.com/sbatch.html) + +## Suivre l'état d'un job + +Il est possible d'obtenir le détail de l'état d'un job, qu'il soit en attente ou en exécution, avec les commandes **scontrol** ou **squeue**. + +**Liste de tous les jobs en cours :** + +```console +squeue +``` + +**Liste des jobs en cours d'un compte particulier :** +```console +squeue -u +``` + +**Détail de l'état d'un job :** + +```console +scontrol show job +``` + +**Mon job est en attente. Quand va-t-il démarrer ?** + +Pour les jobs en attente, Slurm calcul périodiquement un temps probable de démarrage. +2 possibilités pour l'obtenir: + +```console +scontrol show job | grep StartTime= +``` +```console +squeue -o "%S" -j +``` + +## Autorisations / Account + +Pour utiliser une partition, il faut disposer d'un compte Slurm (indépendant du login Unix). Ce compte Slurm est configuré notamment en fonction du **quota d'heures** attribué dans le cadre d'un projet MESONET. + +Pour utiliser la partition associée aux projets, vous aurez accès à un compte Slurm spécifique, configuré avec un quota d'heures suite à une allocation du comité scientifique : + +```console +#SBATCH -p mesonet +#SBATCH -A projet +``` + +## Suivre sa consommation + +Vous pouvez avoir une indication de votre consommation en heures CPU par la commande + +```console +sreport cluster AccountUtilizationByUser start=2023-09-01 accounts=votre_account -t hours +``` + +Notez que **votre_account** correspond au nom du groupe Unix auquel vous appartenez ou alors au numéro du grant que vous avez obtenu lors d'une demande d'attributions d'heures par le comité scientifique. + +## Espace disque temporaire + +À la soumission d’un job et sur le disque dur de chacun des nœuds qui vous sont alloués, Slurm crée un répertoire temporaire de nom **/scratch/job.$SLURM_JOB_ID** + +Vous pouvez utiliser ce répertoire pour y stocker les fichiers temporaires de vos applications en cours d’exécution. Pensez à les recopier sur votre compte à la fin du script. En effet, le répertoire /scratch/job.$SLURM_JOB_ID est automatiquement effacé en fin de job. + +## Variables d'environnement + +Dans certains cas, votre programme a besoin de connaître plus précisément les ressources que Slurm a mis à sa disposition. Pour cela, Slurm fourni un certain nombre de variables d'environnement, qui sont utilisables dans le script qui appelle le programme. En voici une liste non exhaustive : + +* **SLURM_NPROCS** : nombre de cœurs alloués ; +* **SLURM_NNODES** : nombre de nœuds alloués ; +* **SLURM_CPUS_ON_NODE** : nombre de cœurs alloués par nœud ; +* **SLURM_JOB_ID** : job id ; +* **SLURM_JOB_NODELIST** : liste des nœuds alloués, sous une forme synthétique. Pour obtenir une liste détaillée, on peut utiliser la commande "**scontrol show hostname**". + +Liste détaillée : vor chapitre "OUTPUT ENVIRONMENT VARIABLES" sous [https://slurm.schedmd.com/sbatch.html](https://slurm.schedmd.com/sbatch.html) + +## Priorités + +Quand plusieurs jobs sont en même temps en attente dans une file, Slurm calcule une priorité entre ces jobs. Le job ayant la priorité la plus élevée sera le prochain à passer en exécution. + +La priorité des jobs peut être vue avec la commande : + +```console +sprio -l +``` + +La priorité dépend de plusieurs facteurs : + +* le temps d'attente déjà écoulé (AGE) ; +* la taille du job en nombre de cœurs : les gros jobs sont favorisés (JOBSIZE) ; +* la consommation en heures cpu sur le passé récent : plus la consommation a été faible, plus la priorité augmentera (FAIRSHARE). diff --git a/docs/code_form/hedy/module.md b/docs/code_form/hedy/module.md new file mode 100644 index 00000000..1e74a3f5 --- /dev/null +++ b/docs/code_form/hedy/module.md @@ -0,0 +1,208 @@ +--- +title: "Environnements logiciels" +sidebar_position: 4 +--- + +# INTRODUCTION + +Le système de [Modules](https://modules.readthedocs.io/en/latest/#) est un outil qui simplifie l'initialisation du shell et permet aux utilisateurs et utilisatrices de modifier leur environnement facilement avec des fichiers de modules. + +Chaque fichier de module contient les informations requises pour configurer le shell pour une application spécifique. Plusieurs modules sont pré-installés sur **Hedy**. + +Par défaut, le module **[slurm/slurm](jobs)** (notre gestionnaire de ressources, indispensable pour soumettre des jobs) est chargé par défaut dans l'environnement de toutes les personnes se connectant au cluster. + +# UTILISATION +## module list + +Pour lister les modules chargés dans votre environnement, vous pouvez utiliser la commande **module list** (ou son raccourci **ml list**) : + +```console +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) +``` + +On voit ici que le module **slurm/slurm** estchargé, ce qui nous permettra d'utiliser cette application. + +## module load + +Prenons l'exemple de **openmpi**. Voici ce qui se passe si vous essayez de l'utiliser sans charger de module : + +```console +user@hedy:~$ mpirun +-bash: mpirun: command not found +user@hedy:~$ which mpirun +/usr/bin/which: no mpirun in (/usr/local/bin/di:/nfs/mesonet/home/users/hal/HPC_tools/utilities:/nfs/mesonet/home/users/hal/.local/bin:/nfs/mesonet/sw/slurm/slurm-24.05.0/bin:/nfs/mesonet/sw/modules/modules-5.4.0/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/nfs/mesonet/home/users/hal/bin:/nfs/mesonet/sw/munge/munge-0.5.16/bin/) +``` +Le logiciel n'apparaît pas dans votre environnement, et par conséquent vous ne pouvez pas l'utiliser. Il faut donc charger le bon module avec la commande **module load** (ou son raccourci **ml load**) : + +```console +user@hedy:~$ module load openmpi/5.0.3.rocm-6.1.1 +Loading openmpi/5.0.3.rocm-6.1.1 + Loading requirement: rocm/6.1.1 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 +user@hedy:~$ which mpirun +/nfs/mesonet/sw/openmpi/openmpi-5.0.3.rocm-6.1.1/bin/mpirun +``` + +On voit que maintenant **openmpi** est utilisable. On constate également que tous les autres modules desquels **openmpi** dépend ont été chargé automatiquement. Pour désactiver l'affichage du message, vous pouvez utiliser l'option **-s** (ou **--silent**) : +```console + +user@hedy:~$ module -s load openmpi/5.0.3.rocm-6.1.1 +Loading openmpi/5.0.3.rocm-6.1.1 + Loading requirement: rocm/6.1.1 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 +``` +Le message ne s'est pas affiché, mais tous les modules sont bien chargés. Cela peut servir pour alléger les logs de vos jobs. + +## module remove + +Lorsque vous ne voulez plus utiliser un module, vous pouvez le supprimer de votre environnement avec la commande **module remove** (ou ses raccourcis **module rm** ou **ml rm**). Dans notre exemple, le module **openmpi/5.0.3.rocm-6.1.1** n'est plus nécessaire : + +```console +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 +user@hedy:~$ module remove openmpi/5.0.3.rocm-6.1.1 +Unloading openmpi/5.0.3.rocm-6.1.1 + Unloading useless requirement: rocm/6.1.1 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) +``` + +Module va gérer de manière "intelligente" les dépendances. Il a supprimé les dépendances automatiquement. Si vous aviez chargé le module **rocm/6.1.1** avant de charger le module **openmpi/5.0.3.rocm-6.1.1**, ce dernier ne chargera que l'autre dépendance manquante. Lors de la suppression, le module **rocm/6.1.1** sera conservé : + +```console +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) +user@hedy:~$ module load openmpi/5.0.3.rocm-6.1.1 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 +user@hedy:~$ module rm openmpi/5.0.3.rocm-6.1.1 + Unloading useless requirement: openmpi/openmpi-3.1.i18 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) +``` + +À l'inverse, si vous enlevez un module dont dépend d'autres modules, tous les modules seront déchargés : +```console +user@hedy:~$ module load openmpi/5.0.3.rocm-6.1.1 +Loading openmpi/5.0.3.rocm-6.1.1 + Loading requirement: rocm/6.1.1 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 +user@hedy:~$ module rm rocm/6.1.1 +Unloading rocm/6.1.1 + Unloading dependent: openmpi/5.0.3.rocm-6.1.1 +``` + +## module purge + +Vous pouvez supprimer tous vos modules d'un coup pour repartir sur une base nouvelle avec **module purge** (**ml purge**) + +```console +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 4) gcc/13.2.0(latest) +user@hedy:~$ module purge +Unloading slurm/slurm + ERROR: Unload of super-sticky module skipped +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) +``` + +Vous pouvez qu'une erreur indique que le module **slurm/slurm** n'a pas pu être supprimé. C'est tout à fait normal, ce module étant indispensable au fonctionnement du centre de calcul, nous avons décidé de le rendre permanent. Si vous ne souhaitez pas voir l'erreur apparaître, vous pouvez utiliser l'option **-s** : + +```console +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 4) gcc/13.2.0(latest) +user@hedy:~$ module purge -s +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) +``` + +## module switch + +Il est possible de remplacer un module par un autre avec une seule commande **module switch** (**ml switch**) : + +```console +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) +user@hedy:~$ module load aocl/4.2.0.aocc +Loading aocl/4.2.0.aocc + Loading requirement: rocm/6.1.1 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) aocl/4.2.0.aocc +user@hedy:~$ module switch aocl/4.2.0.aocc aocl/4.2.0.gcc +Switching from aocl/4.2.0.aocc to aocl/4.2.0.gcc + Unloading useless requirement: rocm/6.1.1 + Loading requirement: gcc/13.2.0 +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) gcc/13.2.0(latest) 3) aocl/4.2.0.gcc +``` + +Ici on remplace le module **aocl/4.2.0.aocc** par le module **aocl/4.2.0.gcc**. Les dépendances sont gérées automatiquement. + +## module avail + +La commande **module avail** (**ml avail**) permet d'obtenir la liste des modules installés sur le cluster. + +La liste peut être un peu longue et indigeste, il est préférable d'affiner un peu ses recherches avec le nom d'une application par exemple : + +```console +user@hedy:~$ module avail gcc +---------------- /nfs/mesonet/sw/modulefiles ---------------- +gcc/9.5.0 gcc/10.5.0 gcc/11.4.0 gcc/12.3.0 gcc/13.2.0(latest) +``` + +Certains modules ont des tags entre parenthèses. Ces derniers servent à identifier rapidement le module le plus récent. Quand 2 modules partagent le tag *latest*, un autre tag s'ajoute pour les différencier (souvent le compilateur qui a servi a complier l'application). + +D'autres modules sont soulignés. Ces modules représentent les modules qui seront chargés par défaut si on ne précise pas de version de module : + +```console +user@hedy:~$ module load gcc +user@hedy:~$ module list +Currently Loaded Modulefiles: + 1) slurm/slurm(latest) 2) gcc/gcc-13.2.0(latest) +``` + +## .bashrc / .cshrc / .zshrc +Les fichiers **.bashrc** (pour [bash](https://www.gnu.org/software/bash)), **.cshrc** (pour [tcsh](https://www.tcsh.org) ou csh) et **.zshrc** (pour [zsh](https://www.zsh.org)) permettent une personalisation du shell. Vous pouvez y insérer des commandes qui seront lancées à chaque connexion. Il est ainsi possible de charger directement les modules qui vous intéressent dans ce fichier de configuration. Vous pouvez éditer ce fichier avec n'importe quel éditeur de texte installé sur **H** : + +```console +vim ~/.bashrc +``` + +Ces modules seront également utilisés pour vos jobs, donc il n'est plus nécessaire de les charger manuellement dans vos scripts de soumissions. + +Voici un exemple de **.bashrc** qui charge des modules automatiquement : + +```console +# .bashrc + +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +source /usr/local/configfiles/bashrc.default + +module load -s gcc/gcc-13.2.0 +module load -s openmpi/5.0.3.rocm-6.1.1 +module load -s cmake/3.29.5 +``` diff --git a/static/img/hedy/hedy_lamarr.png b/static/img/hedy/hedy_lamarr.png new file mode 100644 index 0000000000000000000000000000000000000000..0f132e02b9108383571594288fe69fcfb847a9ec GIT binary patch literal 89525 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 QssI2007*qoM6N<$f)uy75dZ)H literal 0 HcmV?d00001 From bc9003bc371f8c1cd27926010ad8736d78d1ed16 Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 30 Jan 2025 09:47:09 +0100 Subject: [PATCH 02/18] Update description.md --- docs/code_form/hedy/description.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/code_form/hedy/description.md b/docs/code_form/hedy/description.md index 67318b98..a61f6e06 100644 --- a/docs/code_form/hedy/description.md +++ b/docs/code_form/hedy/description.md @@ -8,9 +8,9 @@ sidebar_position: 1 La machine Hedy dispose de 8 Noeuds PowerEdge XE8640 : - 2 x Intel Xeon Platinum 8462Y+ 2,8 GHz, 32C/64T, 16 GT/s, cache 60 Mo, Turbo, HT (300 W), mémoire DDR5 à 4 800 MHz - - 32 Go RAM - - 4 x GPU NVIDIA HGX H100 SXM 80Go - - DD 3,84To + - 512 Go RAM + - 4 x GPU NVIDIA HGX H100 SXM 80Go connectés via NVSwitch (SXM) + - DD NVMe de 3,84To - Network 100Gb Elle est accessible via 2 serveurs de login et possède 1 serveur de visualisation. From 9fc1734ca982e58f41a763b815b0b5fe4edddced Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 30 Jan 2025 10:15:11 +0100 Subject: [PATCH 03/18] Update connexion.md --- docs/code_form/hedy/connexion.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/code_form/hedy/connexion.md b/docs/code_form/hedy/connexion.md index 63b00494..5632cd84 100644 --- a/docs/code_form/hedy/connexion.md +++ b/docs/code_form/hedy/connexion.md @@ -3,5 +3,30 @@ title: "Se connecter à Hedy" sidebar_position: 2 --- +#Se connecter à Hedy + Vous avez besoin d'un compte MesoNET valide. Vous pouvez trouver les étapes pour obtenir un compte [ici](https://www.mesonet.fr/documentation/user-documentation/acces/portail). +Vous devez également participer à un projet MesoNET ayant demandé l'utilisation de la machien Hedy + +Pour se connecter, il faut au prélable disposer d’un compte MesoNET et avoir déposé un projet demandant l’utilisation de la machine Hedy. + +La connexion s’effectue obligatoirement en ssh. Des clés ssh doivent avoir été créés sur votre poste client et la clé publique doit être déposée sur le portail MesoNET (voir Gérer ses clés SSH). + +La commande de connexion est : + ssh user@hedy.mesocentre.univ-amu.fr -p portnumber + +Il est possible de créer un fichier de configuration ssh pour renseigner les informations de connexion. Ce fichier nommé config est à placer sur le poste de travail, dans le répertoire /home/user/.ssh sur un système Unix ou C:\Users\username\.ssh sous Windows. +Le contenu minimal est : +``` +Host hedy + Hostname hedy.mesocentre.univ-amu.fr + User **user** + Port **portnumber** + IdentityFile **~/.ssh/nom-de-ma-clé-privée** + IdentitiesOnly=yes +```shell +**user** est votre identifiant d’utilisateur sur MesoNET. Vous pouvez avoir plusieurs identifiant MesoNET +**portnumber** est le numéro de port qui vous a été communiqué dans le message électronique de bienvenue. Comme ce n’est pas le port standard, il se peut qu’une autorisation soit nécessaire sur le firewall de votre ordinateur ou sur celui du site depuis lequel vous vous connectez. +**~/.ssh/nom-de-ma-clé-privée** il s'agit de la clé privée correspondant à la clé publique déposée sur le portail mesoent (par ex: ssh ~/.ssh/id_ed25519) + From cd2f64d56c99bb0e096728d0fe582ae1cb862f83 Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 30 Jan 2025 10:40:17 +0100 Subject: [PATCH 04/18] Update connexion.md --- docs/code_form/hedy/connexion.md | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/docs/code_form/hedy/connexion.md b/docs/code_form/hedy/connexion.md index 5632cd84..98d63238 100644 --- a/docs/code_form/hedy/connexion.md +++ b/docs/code_form/hedy/connexion.md @@ -3,30 +3,33 @@ title: "Se connecter à Hedy" sidebar_position: 2 --- -#Se connecter à Hedy +# Se connecter à Hedy Vous avez besoin d'un compte MesoNET valide. Vous pouvez trouver les étapes pour obtenir un compte [ici](https://www.mesonet.fr/documentation/user-documentation/acces/portail). -Vous devez également participer à un projet MesoNET ayant demandé l'utilisation de la machien Hedy +Vous devez également participer à un projet MesoNET ayant demandé l'utilisation de la machien Hedy. Le dépôt de projet se fait [ici](https://www.mesonet.fr/documentation/user-documentation/acces/projets/). -Pour se connecter, il faut au prélable disposer d’un compte MesoNET et avoir déposé un projet demandant l’utilisation de la machine Hedy. +La connexion s’effectue obligatoirement par clés ssh. Elles doivent avoir été créés sur votre poste client et la clé publique doit être déposée sur le portail MesoNET ([Gérer ses clés SSH)](https://www.mesonet.fr/documentation/user-documentation/acces/ssh/). -La connexion s’effectue obligatoirement en ssh. Des clés ssh doivent avoir été créés sur votre poste client et la clé publique doit être déposée sur le portail MesoNET (voir Gérer ses clés SSH). - -La commande de connexion est : - ssh user@hedy.mesocentre.univ-amu.fr -p portnumber +Depuis un terminal, la commande pour se connecter est : +``` +ssh user@hedy.mesocentre.univ-amu.fr -p portnumber +``` +Il est recommandé de créer un fichier indiquant les informations de connexion ssh. Ce fichier nommé config est à placer sur le poste de travail, dans le répertoire /home/user/.ssh sur un système Unix ou C:\Users\username\.ssh sous Windows. -Il est possible de créer un fichier de configuration ssh pour renseigner les informations de connexion. Ce fichier nommé config est à placer sur le poste de travail, dans le répertoire /home/user/.ssh sur un système Unix ou C:\Users\username\.ssh sous Windows. Le contenu minimal est : ``` Host hedy Hostname hedy.mesocentre.univ-amu.fr - User **user** - Port **portnumber** - IdentityFile **~/.ssh/nom-de-ma-clé-privée** + User user + Port portnumber + IdentityFile ~/.ssh/nom-de-ma-clé-privée IdentitiesOnly=yes -```shell -**user** est votre identifiant d’utilisateur sur MesoNET. Vous pouvez avoir plusieurs identifiant MesoNET -**portnumber** est le numéro de port qui vous a été communiqué dans le message électronique de bienvenue. Comme ce n’est pas le port standard, il se peut qu’une autorisation soit nécessaire sur le firewall de votre ordinateur ou sur celui du site depuis lequel vous vous connectez. +``` +**user** est votre identifiant utilisateur sur MesoNET. Vous pouvez avoir plusieurs identifiants MesoNET, un par machine et un par projet, il faut veiller à renseigner l'identifiant correspondant. + +**portnumber** est le numéro de port qui vous a été communiqué dans le message électronique de bienvenue. +Comme ce n’est pas le port standard, il se peut qu’une autorisation soit nécessaire sur le firewall de votre ordinateur ou sur celui du site depuis lequel vous vous connectez. + **~/.ssh/nom-de-ma-clé-privée** il s'agit de la clé privée correspondant à la clé publique déposée sur le portail mesoent (par ex: ssh ~/.ssh/id_ed25519) From d9b97dc8ae19c17338777cd3963a358a80fe61a3 Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 30 Jan 2025 15:45:34 +0100 Subject: [PATCH 05/18] Update jobs.md --- docs/code_form/hedy/jobs.md | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/code_form/hedy/jobs.md b/docs/code_form/hedy/jobs.md index f9308e65..5eb5660e 100644 --- a/docs/code_form/hedy/jobs.md +++ b/docs/code_form/hedy/jobs.md @@ -2,6 +2,59 @@ title: Lancer un calcul sidebar_position: 3 --- +# Lancer un calcul + +**Les calculs ne doivent jamais être exécutés sur les frontales de loggin mais sur les nœuds de calcul.** + +Il n’y a pas d'espace scratch sur la machine Hedy. C'est le disque local des nœuds, de technologie NVMe offrant de bonnes performances en lecture/écriture qui fait office de scratch. L’usage recommandé est donc de copier les données d’entrée sur le répertoire /tmp au début du job (si elles ne sont pas trop volumineuses) et, à l'issue de l'exécution du programme, de déplacer les résultats depuis /tmp vers le home. Cette étape est essentielle car toutes les données seront supprimées du nœud à la fin du job. + +Hedy utilise l’ordonnanceur [slurm]( https://slurm.schedmd.com/overview.html) qui assure l’ordonnancement et la planification des travaux. La soumission des jobs à Slurm se fait à partir d'un script shell ou en ligne de commande. + +# Soumission par script + +Il faut écrire un script shell comportant les directives Slurm (#SBATCH) et les commandes appropriées. + +Exemple de script shell qui sollicite la réservation pour 24 heures de 2 GPUs GH100, 16 CPUs et exécute le programme mon_programme : +``` +#!/bin/bash +#SBATCH --job-name=mon_job_gpu +#SBATCH --account=b1001 +#SBATCH --partition=gpu +#SBATCH --nodes=1 +#SBATCH --gres=gpu:GH100:2 +#SBATCH --cpus-per-gpu=8 +#SBATCH --time=24:00:00 + +# copie des données d’entrée sur le nœud alloué +mkdir /tmp/input +cp /home/user/.../* /tmp/input/. + +# lancement du programme +~/soft/.../mon_progamme + +# déplacement des résultats sur le home +mv /tmp/output/* /home/user/…/. +``` +Il suffit ensuite d'envoyer le script à Slurm par la commande qui le mettra en file d'attente. +``` +sbatch mon_programme.sh +``` + +# Soumission par ligne de commande + + + +# Ouverture d’une session interactive +Il est également possible d'accéder à une session La commande pour ouvrir une session en mode interactif : +``` +srun --pty bash -i +``` +Vous serez alors connecté sur un nœud en utilisant les critères de connexion par défaut. Il est recommandé de préciser les options à appliquer à la session, par exemple le numéro de projet (--account), la durée de session --time), le nombre de ressources GPU (--gres), le nombre de cœurs (--ntasks-per-node). + +La liste complète des directives Slum est disponible [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/sbatch.html#lbAG). +La documentation de SLURM est [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/) + + # Prise en main rapide de SLURM From 0865b136bcaa6fb4e841d20ce4adf59ead81db2f Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 30 Jan 2025 15:56:49 +0100 Subject: [PATCH 06/18] Update jobs.md --- docs/code_form/hedy/jobs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/code_form/hedy/jobs.md b/docs/code_form/hedy/jobs.md index 5eb5660e..92fa3a84 100644 --- a/docs/code_form/hedy/jobs.md +++ b/docs/code_form/hedy/jobs.md @@ -4,11 +4,11 @@ sidebar_position: 3 --- # Lancer un calcul -**Les calculs ne doivent jamais être exécutés sur les frontales de loggin mais sur les nœuds de calcul.** +**Les calculs ne doivent jamais être exécutés sur les frontales de loggin mais sur les nœuds de calcul.** -Il n’y a pas d'espace scratch sur la machine Hedy. C'est le disque local des nœuds, de technologie NVMe offrant de bonnes performances en lecture/écriture qui fait office de scratch. L’usage recommandé est donc de copier les données d’entrée sur le répertoire /tmp au début du job (si elles ne sont pas trop volumineuses) et, à l'issue de l'exécution du programme, de déplacer les résultats depuis /tmp vers le home. Cette étape est essentielle car toutes les données seront supprimées du nœud à la fin du job. +Il n’y a pas d'espace scratch global sur la machine Hedy. Le disque local des nœuds, de technologie NVMe offre de bonnes performances en lecture/écriture et fait office de scratch. L’usage recommandé est de copier au début du job les données d’entrée sur le répertoire /tmp (si elles ne sont pas trop volumineuses) et, à l'issue de l'exécution du programme, de déplacer les résultats depuis /tmp vers le home. Cette étape est essentielle car toutes les données seront supprimées du nœud à la fin du job. -Hedy utilise l’ordonnanceur [slurm]( https://slurm.schedmd.com/overview.html) qui assure l’ordonnancement et la planification des travaux. La soumission des jobs à Slurm se fait à partir d'un script shell ou en ligne de commande. +Hedy utilise l’ordonnanceur [Slurm]( https://slurm.schedmd.com/overview.html) qui assure l’ordonnancement et la planification des travaux de calcul. La soumission à Slurm des travaux de calcul se fait à partir d'un script shell ou en ligne de commande. # Soumission par script From 6a3f4c28c4fbe1b1a38f0baf49aa3936af469140 Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 30 Jan 2025 16:32:45 +0100 Subject: [PATCH 07/18] Update jobs.md --- docs/code_form/hedy/jobs.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/code_form/hedy/jobs.md b/docs/code_form/hedy/jobs.md index 92fa3a84..afe68c95 100644 --- a/docs/code_form/hedy/jobs.md +++ b/docs/code_form/hedy/jobs.md @@ -14,7 +14,7 @@ Hedy utilise l’ordonnanceur [Slurm]( https://slurm.schedmd.com/overview.html) Il faut écrire un script shell comportant les directives Slurm (#SBATCH) et les commandes appropriées. -Exemple de script shell qui sollicite la réservation pour 24 heures de 2 GPUs GH100, 16 CPUs et exécute le programme mon_programme : +Exemple de script shell qui sollicite la réservation pour 24 heures de 2 GPUs GH100, 16 CPUs et exécute le programme mon_programme.sh : ``` #!/bin/bash #SBATCH --job-name=mon_job_gpu @@ -35,21 +35,26 @@ cp /home/user/.../* /tmp/input/. # déplacement des résultats sur le home mv /tmp/output/* /home/user/…/. ``` -Il suffit ensuite d'envoyer le script à Slurm par la commande qui le mettra en file d'attente. +Il suffit ensuite d'envoyer le script à Slurm par la commande sbatch qui le mettra en file d'attente. ``` sbatch mon_programme.sh ``` -# Soumission par ligne de commande - +# Soumission en ligne de commande +Il est possible d'utiliser directement sbatch en ligne de commande avec pour arguments les directives Slurm et le nom du programme. +``` +srun --job-name=mon_job_gpu --account=b1001 --partition=gpu --nodes=1 --gres=gpu:GH100:2 --time=24:00:00 mon_script.sh +``` # Ouverture d’une session interactive -Il est également possible d'accéder à une session La commande pour ouvrir une session en mode interactif : +Il est également possible d'accéder à une session interactive en précisant les ressources souhaitées. + +Par exemple : ``` -srun --pty bash -i +srun --job-name=mon_job_gpu --account=b1001 --partition=gpu --nodes=1 --gres=gpu:GH100:2 --time=24:00:00 --pty bash -i ``` -Vous serez alors connecté sur un nœud en utilisant les critères de connexion par défaut. Il est recommandé de préciser les options à appliquer à la session, par exemple le numéro de projet (--account), la durée de session --time), le nombre de ressources GPU (--gres), le nombre de cœurs (--ntasks-per-node). +Vous serez alors connecté sur un nœud et pourrez utiliser les commandes unix et lancer vos directement en ligne de commande. La liste complète des directives Slum est disponible [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/sbatch.html#lbAG). La documentation de SLURM est [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/) From 22d76425f8b91cfd2d13ec5500e3e9ab557ca70c Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 30 Jan 2025 16:36:52 +0100 Subject: [PATCH 08/18] Update jobs.md --- docs/code_form/hedy/jobs.md | 200 +----------------------------------- 1 file changed, 5 insertions(+), 195 deletions(-) diff --git a/docs/code_form/hedy/jobs.md b/docs/code_form/hedy/jobs.md index afe68c95..4da75ba8 100644 --- a/docs/code_form/hedy/jobs.md +++ b/docs/code_form/hedy/jobs.md @@ -10,7 +10,7 @@ Il n’y a pas d'espace scratch global sur la machine Hedy. Le disque local des Hedy utilise l’ordonnanceur [Slurm]( https://slurm.schedmd.com/overview.html) qui assure l’ordonnancement et la planification des travaux de calcul. La soumission à Slurm des travaux de calcul se fait à partir d'un script shell ou en ligne de commande. -# Soumission par script +## Soumission par script Il faut écrire un script shell comportant les directives Slurm (#SBATCH) et les commandes appropriées. @@ -40,14 +40,14 @@ Il suffit ensuite d'envoyer le script à Slurm par la commande sbatch qui le met sbatch mon_programme.sh ``` -# Soumission en ligne de commande +## Soumission en ligne de commande Il est possible d'utiliser directement sbatch en ligne de commande avec pour arguments les directives Slurm et le nom du programme. ``` srun --job-name=mon_job_gpu --account=b1001 --partition=gpu --nodes=1 --gres=gpu:GH100:2 --time=24:00:00 mon_script.sh ``` -# Ouverture d’une session interactive +## Ouverture d’une session interactive Il est également possible d'accéder à une session interactive en précisant les ressources souhaitées. Par exemple : @@ -56,195 +56,5 @@ srun --job-name=mon_job_gpu --account=b1001 --partition=gpu --nodes=1 --gres=gpu ``` Vous serez alors connecté sur un nœud et pourrez utiliser les commandes unix et lancer vos directement en ligne de commande. -La liste complète des directives Slum est disponible [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/sbatch.html#lbAG). -La documentation de SLURM est [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/) - - - -# Prise en main rapide de SLURM - -Le principe d'un gestionnaire de ressources est de vous réserver des cœurs de calcul en fonction de vos besoins. **SLURM** est le gestionnaire installée sur **Vesta**. - -Vous interagissez avec le gestionnaire de ressources par les commandes suivantes : - -* **sbatch** : soumission d'un job dans une file d'attente (appelées partitions dans Slurm) ; -* **scancel** : suppression d'un job ; -* **squeue** : interrogation des jobs ; -* **scontrol** : interrogation détaillée d'un job ou d'une partition ; -* **sinfo** : interrogation des files d'attente ; -* **srun** : exécution immédiate d'une commande ; -* **salloc** : batch interactif, obtention d'un shell, permettant d'enchaîner plusieurs commandes sur les mêmes ressources ; -* **sprio** : priorités relatives entre les jobs en attente. - -Une documentation des commandes de base est disponible ici : [http://slurm.schedmd.com/man_index.html](http://slurm.schedmd.com/man_index.html) - -## Les partitions - -Les différents nœuds de calcul sont regroupés en fonction de différents critères dans des partitions. - Lors de la soumission d'un job, il faut choisir une partition. -Le cluster Vesta ne possède pour le moment qu'une parition nommé **mesonet** qui sera utilisée par défaut pour tous les jobs. Cette parition possède une limite de temps de **24 heures** par job. Cette limite est amenée à évoluer au cours du temps. - -## Lancement d'un job - -Pour lancer un job, il faut créer un script dans lequel il faut demander des ressources puis appeler son programme (voir les exemples plus loin). - -Ce script est ensuite soumi au gestionnaire de file d'attente avec la commande **sbatch**. Par exemple : - -```console -sbatch mon_script -``` - -On obtient alors un numéro de job, qui peut être manipulé avec les commandes scancel, squeue ou scontrol. - -Le script peut être écrit dans le langage de son choix (bash, zsh, tcsh, python, perl...). Il peut être exécuté directement, sans être appelé par sbatch, et dans ce cas, les directives d'allocations de ressources seront ignorées, et il s'exécutera dans le shell local. - -Par défaut, la sortie standard du job (ce qui doit normalement s'afficher sur l'écran lorsque vous exécutez votre programme) sera écrit dans le fichier **slurm-jobid.out**, avec jobid égal au numéro de job. - -Voici un exemple d'un script de soumission demandant 2 nœuds de calcul avec chacun 10 GPUs : - -```console -#! /bin/bash - -#SBATCH -p mesonet # Partition public avec des GPU -#SBATCH -A account # Cet account vous sera fourni à la création de votre projet -#SBATCH -N 2-2 # 2 nœud -#SBATCH --gres=gpu:10 # 10 GPU par nœud - -./mon_code_gpu -``` - -# Pour aller plus loin -## Demande de ressources - -Vos besoins en terme de ressources sont décrits dans l'en-tête d'un fichier via des directives Slurm. Par exemple : - -```console -#SBATCH -N 2 -``` - -demandera une allocation de 2 nœuds. - -D'autres critères peuvent être spécifié via ces directives, comme la taille mémoire souhaitée ou la durée pendant laquelle les ressources seront attribuées. - -En règle générale, plus on sera **parcimonieux dans la demande d'allocation**, plus on aura de chance de voir rapidement son job passer de l'état en attente à l'état en exécution. - -Par exemple, s'il est possible d'estimer précisément la durée nécessaire à une exécution, il peut être profitable de réduire au minimum la durée demandée pour la réservation. Ainsi une exécution se faisant en 3h30 pourra se faire au sein d'un job demandant 4h00 (marge de 30mn par précaution), avec la directive suivante : - -```console -#SBATCH -t 04:00:00 -``` - -Attention toutefois à prendre une marge suffisante, car au-delà du temps demandé, l'exécution est stoppée automatiquement par Slurm. - -Attention : toutes les partitions sont configurées avec une limite de temps d'exécution par défaut, qui s'applique à tout job ne précisant pas combien de temps doit lui être alloué. Pour connaître cette limite, utiliser la commande suivante : - -``` -sinfo -l -``` - -Remarque : tous les arguments de la directive #SBATCH peuvent également être utilisés en arguments des commandes srun, salloc et sbatch. Voir les exemples plus loin. - -## Quelques directives utiles - -* **-p** : partition à utiliser pour le job -* **-A** : compte Slurm à utiliser (il vous est fourni pour chaque projet) -* **-N** : nombre de nœuds (min - max) -* **-n** : nombre de tâches (1 par nœud par défaut) -* **--cpus-per-task** : nombre de cœurs par tâche -* **--tasks-per-node=** : nombre de tâches par nœud -* **-t J-HH:MM:SS** : temps alloué du job, avant qu'il ne soit stoppé (par défaut, celui de la partition; voir sinfo -l) -* **--gres=gpu:N** : nombre de GPU par nœud (N de 1 à 10) -* **--mail-type=END** : envoyer un mail à la fin du job (BEGIN pour en recevoir un au lancement. ALL pour en recevoir un à chaque étape) -* **--mail-user=mon@adresse** : adresse mail à utiliser -* **--mem=0000M** : mémoire par nœud en Mo (pour le dire en Go, remplacer M par G) -* **-o fichier_sortie** : le fichier de sortie du job - -Vous trouverez une liste exhaustive sur le site de Slurm : [https://slurm.schedmd.com/sbatch.html](https://slurm.schedmd.com/sbatch.html) - -## Suivre l'état d'un job - -Il est possible d'obtenir le détail de l'état d'un job, qu'il soit en attente ou en exécution, avec les commandes **scontrol** ou **squeue**. - -**Liste de tous les jobs en cours :** - -```console -squeue -``` - -**Liste des jobs en cours d'un compte particulier :** -```console -squeue -u -``` - -**Détail de l'état d'un job :** - -```console -scontrol show job -``` - -**Mon job est en attente. Quand va-t-il démarrer ?** - -Pour les jobs en attente, Slurm calcul périodiquement un temps probable de démarrage. -2 possibilités pour l'obtenir: - -```console -scontrol show job | grep StartTime= -``` -```console -squeue -o "%S" -j -``` - -## Autorisations / Account - -Pour utiliser une partition, il faut disposer d'un compte Slurm (indépendant du login Unix). Ce compte Slurm est configuré notamment en fonction du **quota d'heures** attribué dans le cadre d'un projet MESONET. - -Pour utiliser la partition associée aux projets, vous aurez accès à un compte Slurm spécifique, configuré avec un quota d'heures suite à une allocation du comité scientifique : - -```console -#SBATCH -p mesonet -#SBATCH -A projet -``` - -## Suivre sa consommation - -Vous pouvez avoir une indication de votre consommation en heures CPU par la commande - -```console -sreport cluster AccountUtilizationByUser start=2023-09-01 accounts=votre_account -t hours -``` - -Notez que **votre_account** correspond au nom du groupe Unix auquel vous appartenez ou alors au numéro du grant que vous avez obtenu lors d'une demande d'attributions d'heures par le comité scientifique. - -## Espace disque temporaire - -À la soumission d’un job et sur le disque dur de chacun des nœuds qui vous sont alloués, Slurm crée un répertoire temporaire de nom **/scratch/job.$SLURM_JOB_ID** - -Vous pouvez utiliser ce répertoire pour y stocker les fichiers temporaires de vos applications en cours d’exécution. Pensez à les recopier sur votre compte à la fin du script. En effet, le répertoire /scratch/job.$SLURM_JOB_ID est automatiquement effacé en fin de job. - -## Variables d'environnement - -Dans certains cas, votre programme a besoin de connaître plus précisément les ressources que Slurm a mis à sa disposition. Pour cela, Slurm fourni un certain nombre de variables d'environnement, qui sont utilisables dans le script qui appelle le programme. En voici une liste non exhaustive : - -* **SLURM_NPROCS** : nombre de cœurs alloués ; -* **SLURM_NNODES** : nombre de nœuds alloués ; -* **SLURM_CPUS_ON_NODE** : nombre de cœurs alloués par nœud ; -* **SLURM_JOB_ID** : job id ; -* **SLURM_JOB_NODELIST** : liste des nœuds alloués, sous une forme synthétique. Pour obtenir une liste détaillée, on peut utiliser la commande "**scontrol show hostname**". - -Liste détaillée : vor chapitre "OUTPUT ENVIRONMENT VARIABLES" sous [https://slurm.schedmd.com/sbatch.html](https://slurm.schedmd.com/sbatch.html) - -## Priorités - -Quand plusieurs jobs sont en même temps en attente dans une file, Slurm calcule une priorité entre ces jobs. Le job ayant la priorité la plus élevée sera le prochain à passer en exécution. - -La priorité des jobs peut être vue avec la commande : - -```console -sprio -l -``` - -La priorité dépend de plusieurs facteurs : - -* le temps d'attente déjà écoulé (AGE) ; -* la taille du job en nombre de cœurs : les gros jobs sont favorisés (JOBSIZE) ; -* la consommation en heures cpu sur le passé récent : plus la consommation a été faible, plus la priorité augmentera (FAIRSHARE). +## Pour aller plus loin +La liste complète des directives Slum est disponible [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/sbatch.html#lbAG) et la documentation complète [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/). From 6d6ba3ac69628dccffe3dfbcd4359624ca98ef98 Mon Sep 17 00:00:00 2001 From: Henry Areiza Date: Tue, 11 Feb 2025 16:55:14 +0100 Subject: [PATCH 09/18] [ADD] Correcting and completing the connection information of the Hedy machine --- docs/code_form/hedy/connexion.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/code_form/hedy/connexion.md b/docs/code_form/hedy/connexion.md index 98d63238..2170af6c 100644 --- a/docs/code_form/hedy/connexion.md +++ b/docs/code_form/hedy/connexion.md @@ -7,7 +7,7 @@ sidebar_position: 2 Vous avez besoin d'un compte MesoNET valide. Vous pouvez trouver les étapes pour obtenir un compte [ici](https://www.mesonet.fr/documentation/user-documentation/acces/portail). -Vous devez également participer à un projet MesoNET ayant demandé l'utilisation de la machien Hedy. Le dépôt de projet se fait [ici](https://www.mesonet.fr/documentation/user-documentation/acces/projets/). +Vous devez également participer à un projet MesoNET ayant demandé l'utilisation de la machine Hedy. Le dépôt de projet se fait [ici](https://www.mesonet.fr/documentation/user-documentation/acces/projets/). La connexion s’effectue obligatoirement par clés ssh. Elles doivent avoir été créés sur votre poste client et la clé publique doit être déposée sur le portail MesoNET ([Gérer ses clés SSH)](https://www.mesonet.fr/documentation/user-documentation/acces/ssh/). @@ -15,7 +15,8 @@ Depuis un terminal, la commande pour se connecter est : ``` ssh user@hedy.mesocentre.univ-amu.fr -p portnumber ``` -Il est recommandé de créer un fichier indiquant les informations de connexion ssh. Ce fichier nommé config est à placer sur le poste de travail, dans le répertoire /home/user/.ssh sur un système Unix ou C:\Users\username\.ssh sous Windows. + +Il est recommandé de créer un fichier indiquant les informations de connexion ssh. Ce fichier nommé config est à placer sur le poste de travail, dans le répertoire `/home/user/.ssh` sur un système Unix ou `C:\Users\username\.ssh` sous Windows. Le contenu minimal est : ``` @@ -31,5 +32,10 @@ Host hedy **portnumber** est le numéro de port qui vous a été communiqué dans le message électronique de bienvenue. Comme ce n’est pas le port standard, il se peut qu’une autorisation soit nécessaire sur le firewall de votre ordinateur ou sur celui du site depuis lequel vous vous connectez. -**~/.ssh/nom-de-ma-clé-privée** il s'agit de la clé privée correspondant à la clé publique déposée sur le portail mesoent (par ex: ssh ~/.ssh/id_ed25519) +**~/.ssh/nom-de-ma-clé-privée** il s'agit de la clé privée correspondant à la clé publique déposée sur le portail MesoNET (par ex: `~/.ssh/id_ed25519`) +Une fois le fichier config correctement créé, il est possible de se connecter à la machine Hedy simplement avec la commande : +``` +ssh user@hedy +``` +N'oubliez pas de remplacer le mot `user` par votre propre identifiant utilisateur. From ffe4904f1bb987c6272a23e2129121575feb9e30 Mon Sep 17 00:00:00 2001 From: aclement13 Date: Wed, 12 Feb 2025 09:47:42 +0100 Subject: [PATCH 10/18] Update connexion.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pas besoin de préciser le user dans la commande ssh s'il est dans le fichier config. --- docs/code_form/hedy/connexion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code_form/hedy/connexion.md b/docs/code_form/hedy/connexion.md index 2170af6c..fca77a02 100644 --- a/docs/code_form/hedy/connexion.md +++ b/docs/code_form/hedy/connexion.md @@ -36,6 +36,6 @@ Comme ce n’est pas le port standard, il se peut qu’une autorisation soit né Une fois le fichier config correctement créé, il est possible de se connecter à la machine Hedy simplement avec la commande : ``` -ssh user@hedy +ssh hedy ``` N'oubliez pas de remplacer le mot `user` par votre propre identifiant utilisateur. From bc62293a92ad0a7fe1f8e96f01f89dae27f2b1fc Mon Sep 17 00:00:00 2001 From: aclement13 Date: Wed, 12 Feb 2025 09:56:47 +0100 Subject: [PATCH 11/18] Update connexion.md --- docs/code_form/hedy/connexion.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/code_form/hedy/connexion.md b/docs/code_form/hedy/connexion.md index fca77a02..18818ddd 100644 --- a/docs/code_form/hedy/connexion.md +++ b/docs/code_form/hedy/connexion.md @@ -38,4 +38,3 @@ Une fois le fichier config correctement créé, il est possible de se connecter ``` ssh hedy ``` -N'oubliez pas de remplacer le mot `user` par votre propre identifiant utilisateur. From 3198e5f1e600a67442a70ca78d345297f5945245 Mon Sep 17 00:00:00 2001 From: Yannick Carissan Date: Mon, 17 Feb 2025 11:36:57 +0100 Subject: [PATCH 12/18] test --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 32597363..b06ae185 100644 --- a/README.md +++ b/README.md @@ -22,4 +22,3 @@ L'adresse de la documentation est celle-ci : https://www.mesonet.fr/documentatio - on installe docusaurus : `cd mesodoc && yarn install` ou `cd mesodoc && npm install` - On édite ce que l'on souhaite - On construit le site et lance un serveur web localement pour le prévisualiser : `yarn serve` ou `npm run start` - From 42b6f24cda34951577c19e37191b44ab4caec42f Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 20 Feb 2025 09:31:08 +0100 Subject: [PATCH 13/18] Update cgu.md Change of position 5=>6 --- docs/code_form/hedy/cgu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code_form/hedy/cgu.md b/docs/code_form/hedy/cgu.md index 1762b3b1..aa8a250b 100644 --- a/docs/code_form/hedy/cgu.md +++ b/docs/code_form/hedy/cgu.md @@ -1,6 +1,6 @@ --- title: "CGU" -sidebar_position: 5 +sidebar_position: 6 --- From 4a4397b3637fa827553d1d12482f37ba8e65c4d7 Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 20 Feb 2025 10:00:33 +0100 Subject: [PATCH 14/18] Create visu.md --- docs/code_form/hedy/visu.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 docs/code_form/hedy/visu.md diff --git a/docs/code_form/hedy/visu.md b/docs/code_form/hedy/visu.md new file mode 100644 index 00000000..4a1a9350 --- /dev/null +++ b/docs/code_form/hedy/visu.md @@ -0,0 +1,15 @@ +--- +title: "Noeud de visulation" +sidebar_position: 5 +--- + +# Utilisation du noeud de visualisation + +L’accès au noeud de visualisation se fait en deux temps : + +## Création d'une session de visualisation : + +Elle s’effectue depuis la frontale de connexion, par l’intermédiaire de la commande svisu. + +Sans paramètres additionnels, la commande réservera une session en utilisation patagée (accès à 6 cœurs et 36 Go de RAM du nœud de visu), pour un walltime de 30 minutes, utilisant le gestionnaire de fenêtres fluxbox et le projet par défaut de l’utilisateur (utilisé pour le décompte du temps d’utilisation du nœud). +Vous avez besoin d'un compte MesoNET valide. Vous pouvez trouver les étapes pour obtenir un compte [ici](https://www.mesonet.fr/documentation/user-documentation/acces/porta From e487eab1f67075b77f31fae388037e16aaad213d Mon Sep 17 00:00:00 2001 From: aclement13 Date: Thu, 20 Feb 2025 12:07:09 +0100 Subject: [PATCH 15/18] Update visu.md --- docs/code_form/hedy/visu.md | 39 +++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/docs/code_form/hedy/visu.md b/docs/code_form/hedy/visu.md index 4a1a9350..1651bb3f 100644 --- a/docs/code_form/hedy/visu.md +++ b/docs/code_form/hedy/visu.md @@ -5,11 +5,42 @@ sidebar_position: 5 # Utilisation du noeud de visualisation -L’accès au noeud de visualisation se fait en deux temps : +Ce noeud permet de visualiser vos résultats de calcul à distance, directement sur le cluster et évite de les copier sur votre poste de travail. +L’accès se fait en deux étape : -## Création d'une session de visualisation : +## Création d'une session Elle s’effectue depuis la frontale de connexion, par l’intermédiaire de la commande svisu. +``` +# svisu -h +usage: svisu [-h] [--debug] [--verbose] [--desktop {xfce4,gnome}] [--geometry GEOMETRY] [--view-only-users] + [--account {b1001}] [--time TIME] [--exclusive] [--extra-args EXTRA_ARGS] -Sans paramètres additionnels, la commande réservera une session en utilisation patagée (accès à 6 cœurs et 36 Go de RAM du nœud de visu), pour un walltime de 30 minutes, utilisant le gestionnaire de fenêtres fluxbox et le projet par défaut de l’utilisateur (utilisé pour le décompte du temps d’utilisation du nœud). -Vous avez besoin d'un compte MesoNET valide. Vous pouvez trouver les étapes pour obtenir un compte [ici](https://www.mesonet.fr/documentation/user-documentation/acces/porta +Start TurboVNC/VirtualGL server through Slurm. + +optional arguments: + -h, --help show this help message and exit + --debug, -d Debug mode. No VNC server will be executed here. + --verbose, -v Verbose mode. + --desktop {xfce4,gnome}, -b {xfce4,gnome} + Select desktop environment. + --geometry GEOMETRY, -g GEOMETRY + Select screen resolution. + --view-only-users, -u + Allow view-only user(s) to connect on the session. + --account {b1001}, -A {b1001} + Use the specified project. + --time TIME, -t TIME Select time limit (default: 00:30:00, max: 04:00:00 or 02:00:00 for exclusive mode). + --exclusive, -n Allocate nodes in exclusive mode. + --extra-args EXTRA_ARGS, -B EXTRA_ARGS + Add extra Slurm options (ex: -B="--reservation=username_1"). + +``` + +Sans paramètres additionnels, la commande réserver une session en utilisation patagée (6 cœurs, 6 Go/coeur, pour une durée de 30 minutes). + +## Accès à la session + +Il s’effectue par l’intermédiaire d’un client vnc installé sur votre poste de travail (TurboVNC ou TigerVNC par exemple). + +Les paramètres de connexion (adresse IP, port de connexionVNC, mot de passe) sont communiqués par la commande svisu. From 1bd714f0028b1486655a720735b4c9d6e8c5b8a3 Mon Sep 17 00:00:00 2001 From: Henry Areiza Date: Fri, 22 Aug 2025 16:23:31 +0200 Subject: [PATCH 16/18] [UPD,ADD] Adding accounting and quotas info and some job-related config. --- docs/code_form/hedy/cgu.md | 2 +- docs/code_form/hedy/jobs.md | 14 ++++++---- docs/code_form/hedy/module.md | 12 ++++----- docs/code_form/hedy/quotas.md | 50 +++++++++++++++++++++++++++++++++++ docs/code_form/hedy/visu.md | 2 +- 5 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 docs/code_form/hedy/quotas.md diff --git a/docs/code_form/hedy/cgu.md b/docs/code_form/hedy/cgu.md index aa8a250b..1f9fdf70 100644 --- a/docs/code_form/hedy/cgu.md +++ b/docs/code_form/hedy/cgu.md @@ -1,6 +1,6 @@ --- title: "CGU" -sidebar_position: 6 +sidebar_position: 7 --- diff --git a/docs/code_form/hedy/jobs.md b/docs/code_form/hedy/jobs.md index 4da75ba8..9a24306b 100644 --- a/docs/code_form/hedy/jobs.md +++ b/docs/code_form/hedy/jobs.md @@ -1,10 +1,12 @@ --- title: Lancer un calcul -sidebar_position: 3 +sidebar_position: 4 --- # Lancer un calcul -**Les calculs ne doivent jamais être exécutés sur les frontales de loggin mais sur les nœuds de calcul.** +:::caution +Les calculs ne doivent jamais être exécutés sur les frontales de login mais sur les nœuds de calcul. +::: Il n’y a pas d'espace scratch global sur la machine Hedy. Le disque local des nœuds, de technologie NVMe offre de bonnes performances en lecture/écriture et fait office de scratch. L’usage recommandé est de copier au début du job les données d’entrée sur le répertoire /tmp (si elles ne sont pas trop volumineuses) et, à l'issue de l'exécution du programme, de déplacer les résultats depuis /tmp vers le home. Cette étape est essentielle car toutes les données seront supprimées du nœud à la fin du job. @@ -14,7 +16,7 @@ Hedy utilise l’ordonnanceur [Slurm]( https://slurm.schedmd.com/overview.html) Il faut écrire un script shell comportant les directives Slurm (#SBATCH) et les commandes appropriées. -Exemple de script shell qui sollicite la réservation pour 24 heures de 2 GPUs GH100, 16 CPUs et exécute le programme mon_programme.sh : +Exemple de script shell qui sollicite la réservation pour 24 heures de 2 GPUs GH100 et exécute le programme mon_programme.sh : ``` #!/bin/bash #SBATCH --job-name=mon_job_gpu @@ -22,7 +24,6 @@ Exemple de script shell qui sollicite la réservation pour 24 heures de 2 GPUs G #SBATCH --partition=gpu #SBATCH --nodes=1 #SBATCH --gres=gpu:GH100:2 -#SBATCH --cpus-per-gpu=8 #SBATCH --time=24:00:00 # copie des données d’entrée sur le nœud alloué @@ -35,6 +36,9 @@ cp /home/user/.../* /tmp/input/. # déplacement des résultats sur le home mv /tmp/output/* /home/user/…/. ``` +:::info +L'allocation des ressources est basée sur l'utilisation du GPU, on vous demande donc de NE PAS indiquer le nombre de cœurs CPU et la mémoire requise dans un Job car ces ressources seront allouées automatiquement, aussi efficacement que possible, en fonction du nombre de GPU (```CPU = nombre_de_GPUs * 16 cœurs``` , ```RAM = nombre_de_GPUs * 120000 MB```). +::: Il suffit ensuite d'envoyer le script à Slurm par la commande sbatch qui le mettra en file d'attente. ``` sbatch mon_programme.sh @@ -57,4 +61,4 @@ srun --job-name=mon_job_gpu --account=b1001 --partition=gpu --nodes=1 --gres=gpu Vous serez alors connecté sur un nœud et pourrez utiliser les commandes unix et lancer vos directement en ligne de commande. ## Pour aller plus loin -La liste complète des directives Slum est disponible [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/sbatch.html#lbAG) et la documentation complète [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/). +Quelques tutoriels sur Slurm sont disponibles [ici](../../HOWTO/slurm/slurm.md), la liste complète des directives Slum est disponible [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/sbatch.html#lbAG) et la documentation complète [ici]( https://slurm.schedmd.com/archive/slurm-24.05.5/). diff --git a/docs/code_form/hedy/module.md b/docs/code_form/hedy/module.md index 1e74a3f5..298c7bdf 100644 --- a/docs/code_form/hedy/module.md +++ b/docs/code_form/hedy/module.md @@ -1,6 +1,6 @@ --- title: "Environnements logiciels" -sidebar_position: 4 +sidebar_position: 5 --- # INTRODUCTION @@ -47,12 +47,10 @@ user@hedy:~$ which mpirun /nfs/mesonet/sw/openmpi/openmpi-5.0.3.rocm-6.1.1/bin/mpirun ``` -On voit que maintenant **openmpi** est utilisable. On constate également que tous les autres modules desquels **openmpi** dépend ont été chargé automatiquement. Pour désactiver l'affichage du message, vous pouvez utiliser l'option **-s** (ou **--silent**) : +On voit que maintenant **openmpi** est utilisable. On constate également que tous les autres modules desquels **openmpi** dépend ont été chargé automatiquement. Pour désactiver l'affichage du message, vous pouvez utiliser l'option **-q** (ou **--quiet**) : ```console -user@hedy:~$ module -s load openmpi/5.0.3.rocm-6.1.1 -Loading openmpi/5.0.3.rocm-6.1.1 - Loading requirement: rocm/6.1.1 +user@hedy:~$ module -q load openmpi/5.0.3.rocm-6.1.1 user@hedy:~$ module list Currently Loaded Modulefiles: 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 @@ -121,13 +119,13 @@ Currently Loaded Modulefiles: 1) slurm/slurm(latest) ``` -Vous pouvez qu'une erreur indique que le module **slurm/slurm** n'a pas pu être supprimé. C'est tout à fait normal, ce module étant indispensable au fonctionnement du centre de calcul, nous avons décidé de le rendre permanent. Si vous ne souhaitez pas voir l'erreur apparaître, vous pouvez utiliser l'option **-s** : +Vous pouvez qu'une erreur indique que le module **slurm/slurm** n'a pas pu être supprimé. C'est tout à fait normal, ce module étant indispensable au fonctionnement du centre de calcul, nous avons décidé de le rendre permanent. Si vous ne souhaitez pas voir l'erreur apparaître, vous pouvez utiliser l'option **-q** : ```console user@hedy:~$ module list Currently Loaded Modulefiles: 1) slurm/slurm(latest) 2) rocm/6.1.1(latest) 3) openmpi/5.0.3.rocm-6.1.1 4) gcc/13.2.0(latest) -user@hedy:~$ module purge -s +user@hedy:~$ module purge -q user@hedy:~$ module list Currently Loaded Modulefiles: 1) slurm/slurm(latest) diff --git a/docs/code_form/hedy/quotas.md b/docs/code_form/hedy/quotas.md new file mode 100644 index 00000000..ca287d41 --- /dev/null +++ b/docs/code_form/hedy/quotas.md @@ -0,0 +1,50 @@ +--- +title: "Comptabilité et quotas" +sidebar_position: 3 +--- +# Comptabilité et quotas + +L'utilisation de la machine est comptabilisée sur la base du nombre de GPU utilisés (1 heure GPU correspond à l'utilisation d'une carte H100 pendant une heure). Le cluster est composé de 8 nœuds, chacun avec 4 GPU H100. Le nombre d'heures GPU attribuées à chaque projet doit être spécifié lors de la création de celui-ci, avec une limite maximale de 10000 heures GPU pouvant être demandée. + + +## Stockage + +Une fois le projet validé, un dossier est créé pour chaque membre du projet dans le `/home/` de la machine (`/home//`), ainsi qu'un dossier partagé pour tous les membres du projet où ils peuvent partager librement des fichiers (`/home/projects//`). Le dossier `/home/` est accessible depuis tous les nœuds du cluster et les quotas de stockage sont attribués par défaut de la manière suivante : + +| | Limite d'espace | Limite de fichiers | +| ----------------- | :------------------: | :-------------------: | +| **Utilisateur** | 500 Go | 10000000 | +| **Projet** | 1000 Go | 5000000 | + + +## Informations utiles + +La commande `hedy_info` peut être lancée depuis les frontales de login pour obtenir des informations pertinentes sur le projet, telles que le nombre d'heures attribuées, la consommation actuelle, l'utilisation du disque dur et les jobs récents. L'option `-e` peut être utilisée pour obtenir ces mêmes informations en anglais. + +``` +[user2@m-login01 ~]$ hedy_info + +UTILISATEUR: user2 + +------------------------------------------------------------------------------------------- +COMPTE: m20000 +ATTRIBUTION: 5002.00 heures GPU +UTILISÉ: 20.47 heures GPU (0.41%) +ÉNERGIE CONSOMMÉE: 0.09 kWh (0.32 MJ) +DÉTAILS DE LA CONSOMMATION: + Utilisateur | Utilisé (h) | % | Énergie (kWh) + user1 | 13.18 | 0.26 | 0.04 + user2 | 7.28 | 0.15 | 0.04 +QUOTA DISQUE: + || ESPACE || FICHIERS + || Utilisé | Limite Faible | Limite Dur || Utilisé | Limite Faible | Limite Dur + m20000 || 0K | 900G | 1000G || 1 | 9000k | 10000k + user1 || Informations confidentielles de l'utilisateur || Informations confidentielles de l'utilisateur + user2 || 48K | 450G | 500G || 13 | 4500k | 5000k +DERNIERS JOBS: + JobID | JobName | User | État | Début | Écoulé | AllocTRES + 5095 | sleep_job | user2 | COMPLETED | 2025-08-13T14:32:20 | 00:10:02 | billing=16,cpu=64,energy=546910,gres/gpu:gh100=4,gres/gpu=4,mem=480000M,node=1 + 5101 | test_job | user1 | COMPLETED | 2025-08-16T15:30:11 | 00:10:01 | billing=8,cpu=32,energy=266730,gres/gpu:gh100=2,gres/gpu=2,mem=240000M,node=1 + 5126 | sleep_job2 | user2 | FAILED | None | 00:00:00 | + 5127 | test_job2 | user1 | COMPLETED | 2025-08-19T15:31:36 | 00:10:01 | billing=16,cpu=64,energy=535860,gres/gpu:gh100=4,gres/gpu=4,mem=480000M,node=1 +``` \ No newline at end of file diff --git a/docs/code_form/hedy/visu.md b/docs/code_form/hedy/visu.md index 1651bb3f..76cb4948 100644 --- a/docs/code_form/hedy/visu.md +++ b/docs/code_form/hedy/visu.md @@ -1,6 +1,6 @@ --- title: "Noeud de visulation" -sidebar_position: 5 +sidebar_position: 6 --- # Utilisation du noeud de visualisation From 4fcfd8edf7092399decbd6972521cac6040f0961 Mon Sep 17 00:00:00 2001 From: Henry Areiza Date: Sun, 24 Aug 2025 17:38:11 +0200 Subject: [PATCH 17/18] [UPD] Updating quotas info about slurm limits. --- docs/code_form/hedy/quotas.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/code_form/hedy/quotas.md b/docs/code_form/hedy/quotas.md index ca287d41..f32780f1 100644 --- a/docs/code_form/hedy/quotas.md +++ b/docs/code_form/hedy/quotas.md @@ -13,10 +13,16 @@ Une fois le projet validé, un dossier est créé pour chaque membre du projet d | | Limite d'espace | Limite de fichiers | | ----------------- | :------------------: | :-------------------: | -| **Utilisateur** | 500 Go | 10000000 | -| **Projet** | 1000 Go | 5000000 | +| **Utilisateur** | 500 Go | 5000000 | +| **Projet** | 1000 Go | 10000000 | +## Limites de calcul + +Par ailleurs, certaines limites de calcul sont définies par défaut dans Slurm afin de garantir une utilisation équilibrée et équitable du cluster pour tous les utilisateurs. Le nombre maximal de GPU qu'un utilisateur peut occuper simultanément est de 4 H100, ce qui équivaut aux ressources d'un nœud complet. De même, le nombre maximal de jobs qu'un utilisateur peut lancer, y compris les jobs en attente d'exécution, est de 10. + +Il est important que tous les utilisateurs respectent ces règles afin de garantir une utilisation raisonnable des ressources du cluster. Si une modification de ces limites et quotas s'avère nécessaire, une demande spéciale et dûment justifiée devra être remplie afin de faire l'objet d'une évaluation avant d'être validée en fonction des disponibilités. + ## Informations utiles La commande `hedy_info` peut être lancée depuis les frontales de login pour obtenir des informations pertinentes sur le projet, telles que le nombre d'heures attribuées, la consommation actuelle, l'utilisation du disque dur et les jobs récents. L'option `-e` peut être utilisée pour obtenir ces mêmes informations en anglais. From 30a30b39753cc8ea9293ca6749b1ed0cd8a83e3f Mon Sep 17 00:00:00 2001 From: Henry Areiza Date: Fri, 19 Sep 2025 17:28:33 +0200 Subject: [PATCH 18/18] [UPD] Warning about pre-prod and some corrections --- docs/code_form/hedy/description.md | 4 ++++ docs/code_form/hedy/quotas.md | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/code_form/hedy/description.md b/docs/code_form/hedy/description.md index a61f6e06..85fad19e 100644 --- a/docs/code_form/hedy/description.md +++ b/docs/code_form/hedy/description.md @@ -5,6 +5,10 @@ sidebar_position: 1 # Hedy, la machine IA/GPU H100 de MesoNET +:::caution +HEDY est en pré production : le nombre de projets est limité +::: + La machine Hedy dispose de 8 Noeuds PowerEdge XE8640 : - 2 x Intel Xeon Platinum 8462Y+ 2,8 GHz, 32C/64T, 16 GT/s, cache 60 Mo, Turbo, HT (300 W), mémoire DDR5 à 4 800 MHz diff --git a/docs/code_form/hedy/quotas.md b/docs/code_form/hedy/quotas.md index f32780f1..d173cd17 100644 --- a/docs/code_form/hedy/quotas.md +++ b/docs/code_form/hedy/quotas.md @@ -33,7 +33,7 @@ La commande `hedy_info` peut être lancée depuis les frontales de login pour ob UTILISATEUR: user2 ------------------------------------------------------------------------------------------- -COMPTE: m20000 +PROJET: m20000 ATTRIBUTION: 5002.00 heures GPU UTILISÉ: 20.47 heures GPU (0.41%) ÉNERGIE CONSOMMÉE: 0.09 kWh (0.32 MJ) @@ -43,7 +43,7 @@ DÉTAILS DE LA CONSOMMATION: user2 | 7.28 | 0.15 | 0.04 QUOTA DISQUE: || ESPACE || FICHIERS - || Utilisé | Limite Faible | Limite Dur || Utilisé | Limite Faible | Limite Dur + || Utilisé | Limite Faible | Limite Dure || Utilisé | Limite Faible | Limite Dure m20000 || 0K | 900G | 1000G || 1 | 9000k | 10000k user1 || Informations confidentielles de l'utilisateur || Informations confidentielles de l'utilisateur user2 || 48K | 450G | 500G || 13 | 4500k | 5000k