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.
- 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â
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.
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.
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.
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 fichiersingularity_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
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 fichiersingularity_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
--bindpermet 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.