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.