Singularity

Présentation

Singularity est une technologie de conteneurs, aussi appelée virtualisation légère (car on note peu ou pas de surcoût en performances comparé à une machine physique), développée originellement pour le HPC au Laurence Berkeley National Laboratory, U.S.A.

C’est un produit assez récent qui bénéficie d’une importante communauté d’utilisateurs, et qui se développe très vite. Le corollaire direct de cet intérêt c’est que les fonctionnalités évoluent très rapidement.

Utilisation de Singularity

Singularity est installé au CC-IN2P3 sur l’ensemble des serveurs interactifs ainsi que sur la platforme de calcul.

Version disponible

Les expériences du LHC s’intéressant également à cette technologie, le CC-IN2P3 a décidé de suivre les versions fournies par WLCG. La version 2.6.1-dist est la version actuellement déployée au CC-IN2P3, issue du dépôt EPEL.

D’autres versions plus récentes sont disponibles via ccenv :

% ccenv singularity --list

Dépôt d’images

Le CC-IN2P3 propose un dépôt d’images Singularity (voir Politique d’utilisation et de gestion des images pour plus de détails) et fournit une image pour les versions majeures des distributions GNU/Linux suivantes :

  • Red Hat Enterprise Linux (ou Scientific Linux)
  • CentOS
  • Ubuntu
  • Debian.

Les images disponibles sont classées en deux catégories : celles pour la platforme de calcul HTC et celles pour le HPC (cette dernière catégorie inclut les images dédiées au GPU). Certaines images peuvent avoir été enrichies avec des logiciels supplémentaires en fonction des besoins exprimés (voir le nom ou les méta-données de l’image).

% ls /cvmfs/singularity.in2p3.fr/images/
HPC/  HTC/
% ls /cvmfs/singularity.in2p3.fr/images/HTC/
sl6/  ubuntu/

La plupart des images sont données au format SquashFS (extension simg ou sif pour les images construites avec Singularity v2 ou v3 respectivement).

Instanciation et utilisation

On pourra alors lancer un script ou une commande dans une image en faisant comme suit :

% singularity exec /cvmfs/singularity.in2p3.fr/images/HTC/sl6/sl6-cc-atlas.simg ls

Ici on instancie un conteneur dans lequel on lance la commande ls dont le résultat apparaîtra à l’écran. Une fois la commande exécutée, le conteneur est détruit. Pour l’ensemble des options pour cette commande, il faut se référer à la documentation.

Dans les exemples suivants on instancie un conteneur et on demande à y ouvrir un shell. On a alors l’environnement système inhérent système d’exploitation choisi.

% singularity shell /cvmfs/singularity.in2p3.fr/images/HTC/sl6/sl6-cc-atlas.simg
Singularity: Invoking an interactive shell within container...
Singularity sl6-cc-atlas_v0.2.simg:/> cat /etc/redhat-release
Scientific Linux release 6.10 (Carbon)
% singularity shell /cvmfs/singularity.in2p3.fr/images/HTC/ubuntu/ubuntu1804-CC3D.simg
Singularity: Invoking an interactive shell within container...
Singularity ubuntu1804-CC3D.simg:/> cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

Note

Un exit ou un CTRL+D suffira à quitter (détruire) le conteneur et retourner au shell original.

Il est possible que des “WARNING” soit retournés à l’instanciation du conteneur. Cela vient en général soit d’une incohérence de configuration du conteneur ou simplement de l’importation des préférences du shell utilisateur dans le conteneur. Ce type de message ne nuit en rien à la bonne instanciation du conteneur.

Avec la version courante de Singularity (version 2.6.1-dist par défaut), il faut préciser à l’instanciation du conteneur les points de montages extérieurs au conteneur que l’on souhaite retrouver à l’intérieur de celui-ci. On pourra par exemple vouloir conserver /sps afin d’y lire et écrire des données. Pour ce faire, on utilisera l’option bind de Singularity comme suit :

--bind <système de fichiers à monter>:<point de montage dans le conteneur (qui doit exister dans l'image)>

Un point de montage par défaut existe dans le conteneur, il s’agit de /srv. On souhaite par exemple conserver l’accès à /sps/hep/phenix/ dans le conteneur, on fera donc :

% ls /sps/hep/phenix/
Run2pp/  Run3dAu/  Run3pp/  Run4AuAu/  Run7AuAu/
% singularity shell --bind /sps/hep/phenix:/srv /cvmfs/singularity.in2p3.fr/images/HTC/sl6/sl6-cc-atlas.simg
Singularity: Invoking an interactive shell within container...

sh-4.1$ ls /srv
Run2pp/  Run3dAu/  Run3pp/  Run4AuAu/  Run7AuAu/
sh-4.1$

Les images officielles CC-IN2P3 possède également un point de montage /sps. On pourra ainsi monter deux systèmes de fichiers à l’intérieur du conteneur :

% singularity shell --bind /sps/hep/phenix:/sps --bind /pbs/throng/phenix:/srv /cvmfs/singularity.in2p3.fr/images/HTC/sl6/sl6-cc-atlas.simg

Note

Il faudra bien mettre à jour les chemins en conséquence de ces montages pour les scripts exécutés dans le conteneur.

Warning

Contrairement à la configuration de Singularity par défaut, le $HOME de l’utilisateur n’est pas monté automatiquement au CC-IN2P3

Comme dit ci-dessus, le montage de son $HOME n’est plus automatique dans le conteneur au CC-IN2P3. Si l’on souhaite pouvoir y accéder, il faudra donc utiliser l’option - - bind ou -B afin de le monter. Le répertoire $HOME étant dans PBS, tout comme les $THRONG, il sera alors judicieux de monter la racine /pbs dans le conteneur, ce qui permettra d’accéder à la fois à son $HOME et à son $THRONG.

Soumettre un job dans un conteneur

Pour soumettre un job sur la platforme de calcul, on pourra utiliser la première méthode donnée ci-dessus, c’est-à-dire qu’on demandera à exécuter un script dans le conteneur.

Pour example, voici le script mon_job_singularity.sh que je souhaite exécuter dans la platforme de calcul :

#!/usr/bin/env bash
singularity exec /cvmfs/singularity.in2p3.fr/images/HTC/sl6/sl6-cc-atlas.simg $HOME/mon_script.sh

Puis, on lancera le job :

% qsub -q long mon_job_singularity.sh

Ici, on exécute donc le script mon_script.sh dans un conteneur SL6, lui-même s’exécutant sous CentOS-7.

Une autre commande intéressante pour exécuter un conteneur Singularity, c’est la commande run, voir Singularity run.

Pour de plus amples informations, vous pouvez vous référer à la documentation officielle ou contacter notre support utilisateurs.

Utilisation et de gestion des images

Le CC-IN2P3 fournit des images pour pour les versions majeures de ces systèmes d’exploitation GNU/Linux :

  • Red Hat Enterprise Linux (ou Scientific Linux)
  • CentOS
  • Ubuntu
  • Debian

Ces images ont été testées et sont disponibles via CVMFS :

% ls /cvmfs/singularity.in2p3.fr/images/
HPC/  HTC/
% ls /cvmfs/singularity.in2p3.fr/images/HTC/
sl6/  ubuntu/

Le support utilisateurs du CC-IN2P3 pourra vous aider à résoudre les problèmes que vous rencontrerez en utilisant l’une de ces images.

Il vous est également possible de créer et d’importer vos images. Les images pouvant être importantes en taille, afin de minimiser la pénalité en performances lors de l’utilisation de celles-ci, il est conseillé de les stocker dans un stockage ayant de bonnes performances en lecture/écriture, et si possible d’éviter les formats d’archives compressées.

Pour répondre à cette contrainte, le Centre vous propose de les stocker dans un stratum 0 (un répertoire) de CVMFS créé spécifiquement pour ce besoin, et de préférence sous format d’arborescence de répertoires (on utilise alors une fonctionnalité de CVMFS qui permet de lire fichier par fichier à la demande et donc de minimiser le coût en lecture). Il s’agit du même dépôt que celui présenté précédemment.

Pour vous aider à importer une image au CC-IN2P3, vous devez contacter notre support utilisateurs.

Pour ces images non officielles, le CC-IN2P3 ne pourra garantir leur bon fonctionnement sur ses serveurs, ni ne sera tenu de fournir un support. Nos experts feront néanmoins le maximum pour vous aider à résoudre vos difficultés.

Un autre type d’image qui peut être intéressant, du fait de sa popularité, ce sont les images Docker . Singularity peut en effet instancier sans difficulté des images Docker. Pour plus d’information, veuillez vous référer à la ection Singularity and Docker dans la documentation officielle.