Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

4 changes: 4 additions & 0 deletions docs/code_form/hedy/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Hedy",
"position": 5
}
11 changes: 11 additions & 0 deletions docs/code_form/hedy/cgu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
title: "CGU"
sidebar_position: 7
---


# 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).
40 changes: 40 additions & 0 deletions docs/code_form/hedy/connexion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
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 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/).

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.

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
```
**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 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 hedy
```
22 changes: 22 additions & 0 deletions docs/code_form/hedy/description.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
title: "Description"
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
- 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.

[![Portrait d'Hedy Lamarr](/img/hedy/hedy_lamarr.png)](https://fr.wikipedia.org/wiki/Hedy_Lamarr)
64 changes: 64 additions & 0 deletions docs/code_form/hedy/jobs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
---
title: Lancer un calcul
sidebar_position: 4
---
# Lancer un 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.

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

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 et exécute le programme mon_programme.sh :
```
#!/bin/bash
#SBATCH --job-name=mon_job_gpu
#SBATCH --account=b1001
#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --gres=gpu:GH100:2
#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/…/.
```
:::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
```

## 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 interactive en précisant les ressources souhaitées.

Par exemple :
```
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 et pourrez utiliser les commandes unix et lancer vos directement en ligne de commande.

## Pour aller plus loin
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/).
206 changes: 206 additions & 0 deletions docs/code_form/hedy/module.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
---
title: "Environnements logiciels"
sidebar_position: 5
---

# 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 **-q** (ou **--quiet**) :
```console

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
```
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 **-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 -q
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
```
Loading