Projet

Général

Profil

Exécution de conteneurs sur le cluster

Il est possible d'exécuter des conteneurs (container) sur le cluster via apptainer.

  • apptainer est grossièrement comparable à docker, mais adapté aux clusters HPC
  • apptainer est le projet ayant succédé à singularity

Documentation sur apptainer

Apptainer est installé en version 1.2.5 (version distribuée avec le système). Vous pouvez consulter la documentation utilisateur d'apptainer.

Comment utiliser une image "docker" ?

Apptainer supporte les images Docker : https://apptainer.org/docs/user/latest/docker_and_oci.html.

La documentation recommande de ne pas exécuter des images directement depuis le docker hub, mais plutôt de construire une image au format .SIF (opération à faire une seule fois) et ensuite exécuter celle-ci. Pour ce faire, voici un exemple où l'on veut utiliser l'image docker anupkumar/docker-ml-jupyterlab:galaxy-integration-0.2 (projet sur GitHub) :

apptainer pull docker://anupkumar/docker-ml-jupyterlab:galaxy-integration-0.2

Apptainer se plaint que l'espace disque est plein !

Apptainer utiliser un dossier ~/.apptainer, situé donc dans votre espace home, lequel est limité en taille.

Pour le déplacer sous scratch, stoppez tous vos conteneurs puis exécutez la commande :

[[ -d ~/.apptainer/ ]] && mv -iv ~/.apptainer/ ~/scratch/ && ln -s -v scratch/.apptainer ~/.apptainer

Comment exécuter un conteneur sur le cluster ?

Un conteneur singularity va se matérialiser par un fichier .sif, qui est l'image : c'est un peu comme une archive (ZIP) avec tous les fichiers (programmes, librairies, ...) de l'environnement logiciel proposé par le conteneur.

Point important : pour l'accès au GPU, vous devez lancer apptainer avec l'option --nv.

Pour l'exécuter sur le cluster, vous avez deux possibilités :

  1. Lancer un batch qui exécute le conteneur
  2. Ouvrir une session interactive sur un nœud de calcul

Exécution en mode "batch"

C'est le mode préférentiel pour utiliser au mieux les ressources de calcul.

Ici, on veut instancier le conteneur nvidia-devicequery_10.2.sif, lequel permet de rechercher et d'afficher les GPU disponibles. Ce conteneur contient un "point d'entrée", un runscript, qui sera exécuté quand on instancie le conteneur via la commande run.

Vous pouvez préparer un fichier batch habituel, par exemple nv-query.sh :

#!/bin/bash
#
#SBATCH --partition=gpu
#SBATCH --mem=1000
#SBATCH --gres=gpu:l40:1

apptainer run --nv nvidia-devicequery_10.2.sif

Et ensuite simplement soumettre le travail

sbatch nv-query.sh

Exécution en mode "inter-actif"

Dans ce mode, vous demandez d'abord un shell interactif sur un noeud de calcul. Cette façon de faire, autorisée sur le cluster, ne doit pas être utilisée trop fréquemment, car en général les ressources de calcul allouées pour votre shell interactif ne sont pas utilisées à 100%.

On commence par demander un shell interactif avec une GPU L40 :

srun --gres gpu:l40:1 -p gpu --pty bash -i

Une fois que l'ordonnanceur Slurm a pu vous donner une ressource, vous obtenez un shell sur un noeud de calcul, contraint par les ressources demandées. Vous pouvez maintenant instancier le conteneur, soit en mode "run", soit lui-même en mode interactif.

#
# En mode "run" : le "runscript" déclaré dans le conteneur sera exécuté et l'instance s'arrête
#
apptainer run --nv nvidia-devicequery_10.2.sif

#
# Ou alors, vous demandez un shell dans le conteneur - Si ça marche, "prompt" devient "Singularity> "
#
apptainer shell --nv nvidia-devicequery_10.2.sif
# Et vous pouvez maintenant lancer une commande au sein de l'instance
nvidia-smi