Aller au contenu principal

Conteneurs Singularity

Singularity est la solution de conteneurisation disponible sur Jean Zay.

Il s'agit d'un systÚme de conteneurisation multi-plateformes open source développé par Sylabs. L'un des principaux avantages des conteneurs est de permettre la reproductibilité de calculs scientifiques sans gros effort de portage d'un systÚme à l'autre. Cette solution est performante et trÚs adaptée aussi bien pour le calcul haute performance que pour le calcul en intelligence artificielle.

À l'aide des conteneurs Singularity, les utilisateurs peuvent travailler dans des environnements de leur choix et de leur conception, ces environnements complets pouvant facilement ĂȘtre copiĂ©s et exĂ©cutĂ©s sur le supercalculateur Jean Zay.

Pour plus de détails, vous pouvez consulter la documentation officielle de Singularity.

Remarque
  • Docker n'est pas disponible sur Jean Zay pour des raisons de politiques de sĂ©curitĂ© (accĂšs root nĂ©cessaires). Les images Docker sont nĂ©anmoins exploitables dans un environnement Singularity.
  • Podman n'est pas disponible sur Jean Zay pour des raisons techniques (compatibilitĂ© avec le file system de Jean Zay).

Singularity sur Jean Zay​

Recommendations d'usage

L'image Singularity que vous allez manipuler peut ĂȘtre volumineuse. Il est recommandĂ© de lancer les commandes Singularity (build, pull, run, exec, etc) depuis l'espace $WORK ou $SCRATCH pour Ă©viter une saturation d'espace.

De plus, les ressources en mĂ©moire RAM Ă©tant limitĂ©s Ă  5GB par utilisateur sur les frontales, il est fortement recommandĂ© d'utiliser les nƓuds de prĂ©/post-traitement pour la construction ou la conversion de conteneurs nĂ©cessitants des ressources importantes.

Module​

Singularity est accessible par la commande module :

module load singularity

Pour obtenir des informations sur le module Singularity, il suffit d'utiliser la commande suivante :

module show singularity

Systùme de fichiers temporaire​

Une fois le module chargé, un répertoire temporaire $SINGULARITY_CACHEDIR est créé automatiquement dans votre espace disque $SCRATCH personnel. Il contiendra le systÚme de fichiers du conteneur lors de son exécution.

Important

Il est fortement recommandé de ne pas modifier la variable d'environnement $SINGULARITY_CACHEDIR afin de ne pas dépasser les quotas des autres espaces disques et d'en simplifier le nettoyage automatique.

Environnement d'exĂ©cution​

Une fois votre conteneur prĂȘt, vous devez le placer dans le rĂ©pertoire dĂ©diĂ© $SINGULARITY_ALLOWED_DIR afin qu'il soit analysĂ© et autorisĂ© Ă  l'usage sur les nƓuds de calcul.

remarque

La variable $SINGULARITY_ALLOWED_DIR définit un chemin unique par utilisateur et ce chemin n'est pas modifiable.

La copie et la suppression de conteneurs dans cet espace s'effectue via la commande idrcontmgr. Cette derniÚre autorise ou non la copie des conteneurs sur cet espace, en vérifiant au préalable si le conteneur obéit aux contraintes de sécurité définies par l'IDRIS.

attention

Cet espace $SINGULARITY_ALLOWED_DIR est limité à 20 conteneurs.

Un conteneur peut ĂȘtre copiĂ© dans l'espace d'exĂ©cution autorisĂ© via la commande idrcontmgr de la maniĂšre suivante :

idrcontmgr cp my-container.sif

La suppression s'effectue d'une maniĂšre similaire :

idrcontmgr rm my-container.sif

Cette commande permet également d'afficher le contenu de l'espace d'exécution autorisé :

idrcontmgr ls

Construction d'une image Singularity​

Les modes de construction d'images Singularity nĂ©cessitant d'ĂȘtre super utilisateur (root) ne sont pas disponibles sur Jean Zay. Il n'est donc pas possible de construire une image Singularity Ă  partir d'un fichier de dĂ©finition. Pour ce type d'image, il est donc laissĂ© au soin des utilisateurs de les crĂ©er depuis une autre machine, puis de les rapatrier sur Jean Zay.

Depuis une des frontales de Jean Zay, il est toutefois permis de créer une image Singularity depuis des dépÎts existants (Singularity, Docker, etc) sous forme d'un fichier .sif.

Construction d'une image depuis un dĂ©pĂŽt public​

Depuis l'espace disque $WORK ou $SCRATCH, un utilisateur peut créer une image Singularity depuis un dépÎt public existant (Singularity, Docker, etc...) en lançant la commande singularity build :

singularity build image-singularity-tensorflow.sif docker://tensorflow/tensorflow:latest-gpu-py3

Sur cet exemple, la commande est utilisée pour télécharger une image depuis le dépÎt public Docker, pour ensuite construire une image Singularity au format .sif.

Conversion d'une image SANDBOX au format .sif​

L'utilisation des conteneurs sous forme de SANDBOX n'est pas autorisée sur Jean Zay. Néanmoins, il est tout à fait possible de convertir une image SANDBOX au format .sif. Il suffit d'utiliser la commande singularity build :

singularity build mon_conteneur.sif mon_conteneur_sandbox/

ExĂ©cution d'un shell dans une image Singularity​

La commande singularity run permet de lancer un conteneur Singularity et un shell Ă  l'intĂ©rieur de ce conteneur. L'exĂ©cution de cette commande requiert l'utilisation du mode interactif sur un nƓud de calcul (cf. documentation d'exĂ©cution interactive d'un code CPU et GPU).

Par exemple, pour la partition CPU, il vous faudra ouvrir un terminal directement sur un nƓud de calcul sur lequel des ressources vous sont rĂ©servĂ©es (ici 10 cƓurs) en utilisant la commande suivante :

srun --pty --ntasks=1 --cpus-per-task=10 --hint=nomultithread [--other-options] bash

puis lancer le conteneur en mode shell via la commande suivante :

singularity shell $SINGULARITY_ALLOWED_DIR/mon_conteneur_cpu.sif

Pour la partition GPU, la manipulation est quasi identique en allouant les bonnes ressources sur un nƓud GPU, puis en lançant le conteneur shell comme prĂ©cĂ©demment, en utilisant l'option --nv afin de prendre en compte les cartes NVIDIA :

singularity shell --nv $SINGULARITY_ALLOWED_DIR/mon_conteneur_gpu.sif

ExĂ©cution d'un code dans une image Singularity en mode batch​

ExĂ©cution d'un code parallĂšle MPI​

Pour soumettre un travail MPI en batch sur Jean Zay, il faut :

  • CrĂ©er un script de soumission
    Voici un exemple pour la partition CPU par dĂ©faut (40 cƓurs physiques), enregistrĂ© dans le fichier singularity_mpi.slurm :
singularity_mpi.slurm
#!/bin/bash
#SBATCH --job-name=SingularityMPI # nom du job
#SBATCH --ntasks=40 # Nombre total de processus MPI
#SBATCH --ntasks-per-node=40 # Nombre de processus MPI par noeud
# /!\ Attention, la ligne suivante est trompeuse mais dans le vocabulaire
# de Slurm "multithread" fait bien référence à l'hyperthreading.
#SBATCH --hint=nomultithread # 1 processus MPI par coeur physique (pas d'hyperthreading)
#SBATCH --time=00:10:00 # Temps d’exĂ©cution maximum demande (HH:MM:SS)
#SBATCH --output=SingularityMPI%j.out # Nom du fichier de sortie
#SBATCH --error=SingularityMPI%j.out # Nom du fichier d'erreur (ici commun avec la sortie)

# on se place dans le répertoire de soumission
cd ${SLURM_SUBMIT_DIR}

# nettoyage des modules charges en interactif et herites par defaut
module purge

# chargement des modules
module load singularity

# echo des commandes lancées
set -x

# exĂ©cution du code depuis l'espace d’exĂ©cution autorisĂ©.
# Selon l’implĂ©mentation de MPI installĂ©e dans le conteneur, on positionnera l'option --mpi=pmix_v2 ou --mpi=pmix_v3
srun --mpi=pmix_v2 singularity exec $SINGULARITY_ALLOWED_DIR/my-container_CPU.sif ./exec_mpi
important

Pour l'exĂ©cution d'un code parallĂšle MPI depuis une image Singularity, et selon l’implĂ©mentation de MPI installĂ©e dans le conteneur, on positionnera l'option --mpi=pmix_v2 ou --mpi=pmix_v3 Ă  l'exĂ©cution.

  • Soumettre ce script via la commande sbatch
sbatch singularity_mpi.slurm

ExĂ©cution d'un code GPU​

Pour soumettre un travail GPU en batch sur Jean Zay, il faut :

  • CrĂ©er un script de soumission
    Voici un exemple pour la partition GPU par dĂ©faut (nƓuds 4-GPU V100 avec 40 cƓurs physiques), enregistrĂ© dans le fichier singularity_gpu.slurm :
singularity_gpu.slurm
#!/bin/bash
#SBATCH --job-name=SingularityGPU # nom du job
##SBATCH --partition=gpu_p2 # de-commente pour la partition gpu_p2
#SBATCH --ntasks=1 # nombre total de taches (= nombre de GPU ici)
#SBATCH --gres=gpu:1 # nombre de GPU per nƓud (1/4 des GPU)
#SBATCH --cpus-per-task=10 # nombre de coeurs CPU par tache (1/4 du noeud 4-GPU)
##SBATCH --cpus-per-task=3 # nombre de coeurs CPU par tache (pour gpu_p2 : 1/8 du noeud 8-GPU)
# /!\ Attention, "multithread" fait reference Ă  l'hyperthreading dans la terminologie Slurm
#SBATCH --hint=nomultithread # hyperthreading desactive
#SBATCH --time=00:10:00 # Temps d’exĂ©cution maximum demande (HH:MM:SS)
#SBATCH --output=SingularityGPU%j.out # Nom du fichier de sortie
#SBATCH --error=SingularityGPU%j.out # Nom du fichier d'erreur (ici commun avec la sortie)

# on se place dans le répertoire de soumission
cd ${SLURM_SUBMIT_DIR}

# nettoyage des modules charges en interactif et herites par defaut
module purge

# chargement des modules
module load singularity

# echo des commandes lancées
set -x

# exĂ©cution du code depuis espace d’exĂ©cution autorisĂ© avec l'option --nv afin de prendre en compte les cartes NVIDIA
srun singularity exec --nv $SINGULARITY_ALLOWED_DIR/my-container_GPU.sif python ./my_model.py
  • Soumettre ce script via la commande sbatch
sbatch singularity_gpu.slurm

Remarques​

  • La virtualisation de rĂ©seau de type ipvlan, macvlan, ptp, bridge, etc... n'est pas autorisĂ©e (car nĂ©cessitant d'ĂȘtre root). Le rĂ©seau du host est utilisĂ©.
  • L’exĂ©cution de conteneur en mode fakeroot n'est pas autorisĂ©e sur Jean Zay.
  • L’option --bind permet de monter des rĂ©pertoires depuis le host vers le conteneur :
    --bind directory_host1:directory_container1,directory_host2:directory_container2
  • Il n'est pour le moment pas possible de lancer Jupyter (Notebook ou Lab) et TensorBoard depuis un conteneur Singularity.