Orienté micro-services
Orienté calcul scientifique
Veuillez vérifier les éléments suivants:
# Vérifiez votre connexion SSH
# Utilisez vos identifiants destinées à vous connecter sur la ferme
$ ssh -l user cca.in2p3.fr
# Activer l'environment Singularity 3.0.3
$ ccenv singularity 3.0.3
Depuis Singularity Hub
$ singularity pull shub://vsoch/hello-world
Depuis Docker Hub
$ singularity pull docker://hello-world
Depuis Singularity Hub
$ singularity build hello-world.sif shub://vsoch/hello-world
Depuis Docker Hub
$ singularity build hello-world.sif docker://hello-world
$ singularity shell hello-world.sif
Singularity: Invoking an interactive shell within container...
Singularity hello-world.sif:~/prez> cat /etc/issue
Ubuntu 14.04.5 LTS \n \l
Pour quitter:
CTRL-d ou exit
$ cat /etc/issue
Ubuntu 18.04.1 LTS
$ singularity exec hello-world.sif cat /etc/issue
Ubuntu 14.04.5 LTS
$ singularity exec hello-world.sif ls /
anaconda-post.log etc lib64 mnt root singularity tmp
bin home lost+found opt run srv usr
dev lib media proc sbin sys var
$ singularity run hello-world.sif
RaawwWWWWWRRRR !!
Nous verrons plus tard comment définir le runscript.
# Singularity 2.X
$ singularity help hello-world.simg
No runscript help is defined for this image.
# Singularity 3.X
$ singularity run-help hello-world.sif
Nous verrons plus tard comment définir l'aide.
$ singularity inspect hello-world.sif
{
"org.label-schema.usage.singularity.deffile.bootstrap": "docker",
"MAINTAINER": "vanessasaur",
"org.label-schema.usage.singularity.deffile": "Singularity",
"org.label-schema.schema-version": "1.0",
"WHATAMI": "dinosaur",
"org.label-schema.usage.singularity.deffile.from": "ubuntu:14.04",
"org.label-schema.build-date": "2017-10-15T12:52:56+00:00",
"org.label-schema.usage.singularity.version": "2.4-feature-
squashbuild-secbuild.g780c84d",
"org.label-schema.build-size": "333MB"
}
user1@hst:~/prez$ singularity shell hello-world.sif
Singularity hello-world.sif:~/prez> whoami
user1
Singularity hello-world.sif:~/prez> id
uid=1000(user1) gid=1000(user1) groups=1000(user1),4(adm),[…]
→ Le conteneur s'execute en conservant le même utilisateur.
user1@hst:~/prez$ su test
test@hst:/home/user1/prez$ singularity shell hello-world.sif
Singularity hello-world.sif:~> whoami
test
Singularity hello-world.sif:~> id
uid=1001(test) gid=1001(test) groups=1001(test),4(adm),[...]
→ Pas besoin de compte root pour executer le conteneur.
user1@hst:~/prez$ singularity shell hello-world.sif
Singularity hello-world.sif:~/prez> pwd
/home/user1/prez
test@hst:/home/guillaume/prez$ singularity shell hello-world.sif
Singularity hello-world.sif:~> pwd
/home/test
Singularity hello-world.sif:~> ls /home/user1
ls: cannot access /home/user1: No such file or directory
Remarque:
L'image est par défaut en read-only.
Seuls les montages seront en read-write.
Utilisation de --bind ou -B
→ -B src:dst
$ ls ~/tests
test.py
$ singularity shell -B ~/tests:/mnt hello-world.sif
Singularity hello-world.sif:~/prez> ls /mnt
test.py
Possibilité d'omettre dst si src == dst:
$ cat /mnt/test.txt
Ceci est un test
$ singularity shell -B /mnt hello-world.sif
Singularity hello-world.sif:~/prez> cat /mnt/test.txt
Ceci est un test
Possibilité de monter plusieurs points:
$ singularity shell -B /mnt,~/tests:/mnt1 hello-world.sif
Possibilité d'indiquer si montage lecture seule ou non
$ singularity shell -B ~/tests:/mnt:ro hello-world.sif
$ singularity shell -B ~/tests:/mnt:rw hello-world.sif
Overlay: montage sur un répertoire non-existant
→ Activé par défaut
$ singularity shell -B /mnt:/mnt1 hello-world.sif
ccenv singularity 3.1.1
cd ~
echo "It's alive!" > test.txt
$ singularity exec -B [...] hello-world.sif cat [...]/test.txt
It's alive!
Utiliser l'intégration continue pour construire son image ?
singularity:
image: "gitlab-registry.in2p3.fr/cc-in2p3-containers/singularity-docker/3.1.1:latest"
script:
- singularity build myimg.sif Singularity.def
artifacts:
name: myimg.sif
paths:
- ./myimg.sif
Versions de singularity disponibles: 2.5.1, 2.5.2, 2.6.0, 2.6.1, 3.0.0, 3.0.1, 3.0.2, 3.0.3, 3.1.0, 3.1.1
Bootstrap: docker
From: ubuntu
$ sudo singularity build ubuntu.sif ubunturecipe
Using container recipe deffile: ubunturecipe
Sanitizing environment
Adding base Singularity environment to container
Docker image path: index.docker.io/library/ubuntu:latest
[...]
Building Singularity image...
Singularity container built: ubuntu.sif
Cleaning up…
Attention lorsque vous buildez plusieurs fois une image en faisant des modifications successives, pensez à supprimer la précédente car Singularity ne gère pas correctement la réécriture des données !
Bootstrap: debootstrap
OSVersion: bionic
MirrorURL: http://us.archive.ubuntu.com/ubuntu/
Include: somepackage
Affiche une aide lorsque demandé
Bootstrap: docker
From: ubuntu
%help
Ceci est mon conteneur
$ sudo singularity build ubuntu.sif ubunturecipe
$ singularity run-help ubuntu.sif
Ceci est mon conteneur
Enregistre des métadonnées personnalisées
%labels
Maintainer User1
MyLabel LabelToRuleThemAll
$ singularity inspect ubuntu.sif
{
"MAINTAINER": "User1",
"MYLABEL": "LabelToRuleThemAll",
}
Commandes exécutées par l'OS hôte après le build de l'image de base
%setup
touch ${SINGULARITY_ROOTFS}/test1
touch test2
user1@hst:~/prez$ singularity exec ubuntu.sif ls /
bin boot dev environment etc home lib lib64 media mnt opt proc
root run sbin singularity srv sys test1 tmp usr var
user1@hst:~/prez$ ls
test2 ubunturecipe ubuntu.sif
Copie de fichiers depuis l'OS hôte vers le conteneur.
Basé sur cp.
$ touch test{1,2,3}
$ cat ubunturecipe
[...]
%files
test* /opt
$ singularity exec ubuntu.sif ls /opt
test1 test2 test3
Définit des variables d'environnement utilisées après le build
%environment
export SCRIPT_OPT=option
$ singularity inspect -e ubuntu.sif
export SCRIPT_OPT=option
$ singularity exec ubuntu.sif echo $SCRIPT_OPT
$ singularity shell ubuntu.sif
Singularity ubuntu.sif:~/prez> echo $SCRIPT_OPT
option
Commandes executées dans le conteneur
Etape principale pour la personnalisation
Attention ! Pas de commande interactive
%post
apt-get update
apt-get install -y python3
$ singularity exec ubuntu.sif python3
Python 3.6.7
>>>
Définit les commandes à lancer lorsqu'on exécute le conteneur (run)
Simplifie l'utilisation du conteneur au détriment de sa polyvalence
$ cat ubunturecipe
[...]
%runscript
echo "This is a runscript"
$ singularity run ubuntu.sif
This is a runscript
Pour pouvoir interpréter les arguments passés en paramètres lors du lancement du conteneur
avec la commande run, il faut utiliser "$@".
Exemple:
%runscript
python /opt/myscript.py "$@"
$ singularity run mycontainer.sif arg1 arg2
CVMFS | banque d'images fournies par le CC-IN2P3 |
PBS | vos images |
Gitlab CI | artifacts des jobs |
Les images de CVMFS sont organisés par usage (HPC/HTC, CPU/GPU, ...) et sont maintenus par le CC-IN2P3
Dans /pbs, vous disposez d'un:
Pour uploader vos images dans votre HOME:
scp mycontainer.sif formationX@cca.in2p3.fr:
Pour soumettre un job utilisant une image singularity 2.X sur la ferme batch:
-- hello.sh --
#!/bin/bash
/bin/singularity exec /cvmfs/singularity.in2p3.fr/images/
HTC/ubuntu/ubuntu1804-CC3D.simg /bin/hostname
-- Execution du wrapper --
$ qsub -q long /pbs/home/john/hello.sh
Pour soumettre un job utilisant une image singularity 3.X sur la ferme batch depuis une interactive:
# Lister les version de singularity disponible
ccenv singularity --list
Software:
Version:
singularity:
- 3.0.3
# Activer une version
ccenv singularity 3.0.3
Pour soumettre un job utilisant une image singularity 3.X sur la ferme batch depuis un worker:
source /pbs/software/centos-7-x86_64/singularity/ccenv.[c]sh 3.0.3
Comment soumettre un job utilisant les GPUs ?
Le Catalogue répertorie les images disponibles ainsi que les modules python de Deep Learning compatibles
https://gitlab.in2p3.fr/ccin2p3-support/c3/hpc/gpu
La description des logiciels installés se trouve dans les Labels
$ singularity inspect centos7_cuda10-1_cudnn7-5_nccl2-4-2.simg
"org.label-schema.build-date": "Thu,_21_Mar_2019_14:53:06_+0100",
"AUTHOR": "Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr",
"org.label-schema.usage.singularity.deffile.osversion": "7",
"MAINTAINER": "Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr",
"DESCRIPTION": "Singularity CentOS 7 image with CUDA 10.1, CUDnn 7.5 and NCCL 2.4.2",
"org.label-schema.usage.singularity.version": "2.6.1-dist",
"org.label-schema.usage.singularity.deffile.include": "yum",
"org.label-schema.schema-version": "1.0",
"org.label-schema.usage.singularity.deffile.bootstrap": "yum",
"OS": "OS CentOS Linux release 7.6.1810 (Core)",
"CUDA": "cuda-repo-rhel7-10-1-local-10.1.105-418.39-1.0-1.x86_64.rpm (https://developer.download.nvidia.com)",
"NCCL": "nccl_2.4.2-1+cuda10.1_x86_64.txz (https://developer.nvidia.com/nccl - registration required)",
"CUDNN": "cudnn-10.1-linux-x64-v7.5.0.56.tgz (https://developer.nvidia.com/cudnn - registration required)",
"org.label-schema.build-size": "8791MB",
"ORGANIZATION": "CC-IN2P3 / CNRS",
"DEF_FILE_REPO": "https://gitlab.in2p3.fr/ccin2p3-support/c3",
"org.label-schema.usage.singularity.deffile.mirrorurl": "http://mirror.centos.org/centos-%{OSVERSION}/%{OSVERSION}/os/$basearch/",
"org.label-schema.usage.singularity.deffile": "centos7_cuda10-1_cudnn7-5_nccl2-4-2.def"
Le fichier de définition est aussi mis à disposition
BootStrap: yum
OSVersion: 7
MirrorURL: http://mirror.centos.org/centos-%{OSVERSION}/%{OSVERSION}/os/$basearch/
Include: yum
%labels
ORGANIZATION CC-IN2P3 / CNRS
AUTHOR Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr
MAINTAINER Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr
DESCRIPTION Singularity CentOS 7 image with CUDA 10.1, CUDnn 7.5 and NCCL 2.4.2
OS OS CentOS Linux release 7.6.1810 (Core)
CUDA cuda-repo-rhel7-10-1-local-10.1.105-418.39-1.0-1.x86_64.rpm (https://developer.download.nvidia.com)
CUDNN cudnn-10.1-linux-x64-v7.5.0.56.tgz (https://developer.nvidia.com/cudnn - registration required)
NCCL nccl_2.4.2-1+cuda10.1_x86_64.txz (https://developer.nvidia.com/nccl - registration required)
DEF_FILE_REPO https://gitlab.in2p3.fr/ccin2p3-support/c3
%files
cuda-repo-rhel7-10-1-local-10.1.105-418.39-1.0-1.x86_64.rpm /opt/cuda.rpm
cudnn-10.1-linux-x64-v7.5.0.56.tgz /opt/cudnn.tgz
nccl_2.4.2-1+cuda10.1_x86_64.txz /opt/nccl.txz
%post
yum install -y wget bzip2 zip unzip tar.x86_64 which elfutils-libelf-devel file gzip kernel-devel-uname-r kmod systemd git patch vim
## Install CUDA 10.1 ##
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -O /opt/dkms.rpm
rpm -ivh /opt/dkms.rpm
yum install -y dkms
rm /opt/dkms.rpm
rpm -ivh /opt/cuda.rpm
yum install -y cuda
rm /opt/cuda.rpm
## Install CUDNN 7.5 ##
tar -xvzf /opt/cudnn.tgz -C /opt
mv /opt/cuda/lib64/* /usr/local/cuda/lib64/
mv /opt/cuda/include/* /usr/local/cuda/include/
## Install NCCL 2.4.2 ##
tar -xvf /opt/nccl.txz -C /opt
mv /opt/nccl_2.4.2-1+cuda10.1_x86_64/lib /usr/local/cuda/
mv /opt/nccl_2.4.2-1+cuda10.1_x86_64/include/* /usr/local/cuda/include/
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> $SINGULARITY_ENVIRONMENT
echo 'export PATH=/usr/local/cuda/bin:/opt/conda/bin:/opt/bazel/output:$PATH' >> $SINGULARITY_ENVIRONMENT
mkdir /afs /scratch /sps /pbs /cvmfs /cvmfscache
commande de soumission (depuis une machine interactive)
qsub -l sps=1,GPU=<nb_gpus>,GPUtype=<K80-V100> -q <queue> -pe multicores_gpu 4
-o <output_path> -e <error_path> -V <path_to>/batch_launcher.sh
batch_launcher.sh (executé sur le worker)
#!/bin/bash
/bin/singularity exec --nv --bind /sps:/sps --bind /pbs:/pbs <image_path> <path_to>/start.sh
start.sh (executé à travers l'image Singularity sur le worker)
#!/bin/bash
source <path_to_python_env> activate <env>
python <path_to>/program.py
Depuis Singularity > 3.0, possibilité de signer (avec GPG) et vérifier des conteneurs.
Pour cela, plusieurs étapes:
singularity keys newpair
Il faudra fournir:
Par défaut les clés sont stockées dans ${HOME}/.singularity/sypgp
Pour lister les clés publiques locales:
singularity keys list
0) (U)ser: Jean Bon (preprod-key) <jean.bon@example.com>
(C)reation date & time: 2019-04-23 07:24:34 +0000 UTC
(F)ingerprint: 289ECC21945F0C495ADB0DC1B99C0CD7AF36AE97
(L)ength: 4096
--------
Stockage des clés dans un keystore public en utilisant la commande push.
# L'option -k permet de spécifier la clé à utiliser
# (cf singularity key list)
$ singularity sign mycontainer.sif
$ singularity verify mycontainer.sif
Verifying image: mycontainer.sif
Data integrity checked, authentic and signed by:
Jean Bon (preprod-key) <jean.bon@example.com>, KeyID B99C0CD7AF36AE97
Différentes applications avec des dépendances communes:
plusieurs conteneurs → un seul conteneur avec des layers différents: les apps
Sections équivalentes à une recette standard:
Exemple de recette contenant 2 apps:
Bootstrap: docker
From: debian
%apphelp app1
"This is the help section for app1"
%appinstall app1
apt-get install -y sl
%apprun app1
exec /usr/games/sl
%apphelp app2
"This is the help section for app2"
%appenv app2
export APP=app2
%applabels app2
APP app2
%appinstall app2
touch test.exec
Pour executer une app en particulier, il faut la spécifier lors du lancement du conteneur:
$ singularity run --app app1 mycontainer.sif
$ singularity exec --app app1 mycontainer.sif env | grep APP
APP=app2
Permet de lancer un conteneur en mode démon afin qu'il s'execute en arrière plan.
Exemple: Serveur web nginx
Bootstrap: docker
From: nginx
Includecmd: no
%startscript
nginx
Démarrer une instance:
[command] [image] [name of instance]
$ singularity instance start alpine.sif instance1
Lister les instances en cours d'exécution:
$ singularity instance list
INSTANCE NAME PID IMAGE
instance1 1337 /home/john/alpine.sif
Lancer des actions dans l'instance:
$ singularity [run | exec | shell] instance://instance1
Stopper une instance:
$ singularity instance stop instance 1
Nous allons vous fournir deux fichiers :
ccenv singularity 3.0.3
$ singularity run ubuntu-ocr.sif /path/to/nddp_image.pdf
Sorties :
Trois niveaux de difficulté :
Connexion à un worker:
$ ssh -l formationX cca.in2p3.fr
Repository du TP: Support formation
Nous allons vous demander d'écrire une recette de conteneur, de le builder et de l'exécuter sur un worker (machine cca).