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.