Singularity
Singularity peut être vu comme le "docker du calcul". Il résout tous les problèmes d'environnement en permettant de définir un système complet qui vient se raccorder sur le noyau en cours.
Les "images" qui définissent ce sur-système peuvent par ailleurs être copiées et utilisées à l'identique sur d'autres machines, notamment sur sa machine personnelle. Il devient donc possible d'utiliser exactement les mêmes environnements sur votre machine et sur le cluster.
Il existe du reste une quantité énorme d'images déjà prêtes, proposées par la communauté ou des entreprises. Singularity permet en particulier de charger des images docker, comme celles - très nombreuses - que vous pouvez trouver sur dockerhub. Vous pourrez aussi trouver un certain nombre d'images sur cloud.sylabs.io (plus orienté calcul).
Installation
Singularity est disponible sur le cluster via un module. Pour l'activer, vous pouvez taper
module load Singularity
C'est ce n'est pas déjà fait, vous pouvez aussi l'installer sur votre machine (et c'est conseillé pour tester et préparer de façon simple).
Récupération d'une image déjà prête
Pour charger une image déjà préparée, on utilise la commande pull
:
# on fait un exemple avec la librairie fenics qui est
# notoirement difficile à installer par d'autres biais
singularity pull docker://pymor/fenics_py3.8
Cette commande crée un fichier .sif
, qui contient toutes les données de l'image. On peut copier et utiliser ce fichier où on veut (y compris en dehors du cluster), pourvu qu'on soit sur le même type d'architecture de base (x86, arm, ...).
Utilisation du fichier .sif
Shell interactif
Il est possible de lancer un shell interactif, comme dans :
singularity shell fenics_py3.8_latest.sif
# > ... vous pouvez taper n'importe quelle commande du shell choisi
Liens vers les répertoires de l'hôte
Singularity met automatiquement en place un lien vers votre $HOME, en plus du répertoire dans lequel la commande est lancée.
Si ce n'est pas suffisant, vous pouvez ajouter des liens vers d'autres répertoire de l'hôte avec l'option --bind
, comme dans
singularity shell --bind /workdir/<login> fenics_py3.8_latest.sif
# > ls /workdir/<login> vous donnera bien le contenu de votre workdir
Exécution de programme
On peut demander l'exécution directe un programme avec exec
:
singularity exec fenics_py3.8_latest.sif python ft01_poisson.py
Par ailleurs, si l'image contient un exécutable à lancer par défaut, vous pouvez utiliser run
:
$ singularity pull docker://sylabsio/lolcow
$ singularity run lolcow_latest.sif
_______________________________
< Fri Apr 22 07:25:20 CEST 2022 >
-------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
GPU
Pour donner accès aux GPUs, il suffit d'ajouter --nv
aux options de lancement (run
, shell
, ...) comme dans :
singularity pull docker://bitnami/pytorch
# on lance nvidia-smi sur le noeud 15, dans l'environnement pytorch_latest.sif
srun -w node15 singularity exec --nv pytorch_latest.sif nvidia-smi
MPI
Singularity s'occupe automatiquement de transférer les variables d'environnement nécessaires au fonctionnement de mpi. Pensez simplement à ajouter --mpi=pmi2
dans les flags de srun
, comme dans :
srun -n2 --mpi=pmi2 singularity exec mpi4py_latest.sif python test_mpi.py
Accès par ssh, configuration des IDEs
Vous pouvez enregistrer l'environnement comme une machine sur laquelle se connecter en ajoutant un RemoteCommand
dans votre .ssh/config
:
Host <mon_env>
# ProxyJump <cinaps_ou_autre> si c'est à lancer sur une autre machine
RemoteCommand singularity shell <mon_image.sif>
HostName localhost
RequestTTY yes
Après ça, vous pourrez notamment y connecter votre IDE favori.
Pour visual code cependant, il faudra penser à ajouter "remote.SSH.enableRemoteCommand": true
dans settings.json
(accessible via ctrl-shift-p
puis Open settings (JSON)
). Après ça, vous pourrez lancer la commande Remote-SSH: connect to host
pour vous connecter à <mon_env>
. Vous aurez ensuite accès à l'autocomplétion qui correspond à votre environnement.
Modification du contenu des images
Par défaut, les fichiers du système géré par Singularity sont en lecture seule.
Une possibilité pour changer ces fichiers est de passer par un "bac à sable" : les fichiers du système seront stockés dans un répertoire modifiable par Singularity.
# pour charger une image, on passe par build à la place de pull
singularity build --sandbox lolcow/ library://sylabs-jms/testing/lolcow
# on ajoute le flag --writable à shell, run ou exec
singularity shell --writable lolcow_latest.sif
# => on peut faire un `apt install` ou autre
Définition d'une nouvelle image
Pour définir le contenu d'un fichier .sif
, Singularity propose son propre format.
Vous n'aurez pas besoin d'être root pour construire une image. Cependant, il faut que le fichier /etc/setbuid
soit défini pour vous, ce qui n'est pas le cas par défaut pour tous les systèmes. Si vous rencontrez un problème à ce sujet là, n'hésitez pas à nous contacter.
Voici un exemple de fichier de définition d'image
# test.def
Bootstrap: library # ou "docker" par exemple si vous prenez l'image dans dockerhub
From: ubuntu:21.04
Stage: build
%post
# un exemple où on charge quelques paquets
apt-get -y update
apt-get -y install software-properties-common
add-apt-repository -y universe
apt-get -y update
apt-get -y install gcc libopenmpi-dev
%runscript
echo "Container was created $NOW"
echo "Arguments received: $*"
On peut la compiler avec :
singularity build --fakeroot test.sif test.def
et utiliser le .sif
résultant de la même manière que ceux qu'on a chargé sur un hub.
Vous trouverez une description plus détaillée dans cette page.