Utilisation des frameworks de Machine Learning et Deep Learning sur GPUs
Conteneurs Singularity
Des frameworks de « machine learning » et « deep learning » sont disponibles sur Osirim sous forme de conteneurs.
Afin de permettre l'utilisation de plusieurs versions de Cuda/CuDNN/Python et éviter les problèmes de dépendances et les conflits entre librairies de machine learning, chaque framework s'exécute dans un conteneur dédié. Bien que Docker soit la solution de conteneurisation la plus répandue, nous utilisons sur Osirim Singularity, solution de conteneurisation adaptée aux clusters de calcul.
Les images Singularity (.SIF) des frameworks sont bâties sur des images Ubuntu et CUDA10, CUDA11, CUDA12. Les images (.SIF) sont disponibles sous /logiciels/containerCollections/
Nom du conteneur | OS | CUDA | CuDNN | Tensorflow | Keras | Theano | Pytorch | Contents |
---|---|---|---|---|---|---|---|---|
CUDA 10 | ||||||||
keras-tf.sif | Ubuntu 18.04 | 10.0 | 7.1.4 | 1.13.1 | 2.2.4 | |||
keras-tf-NGC-19-07.sif | Ubuntu 18.04 | 10.1 | 7.6.1 | 1.14.0 | 2.2.5 | Release Notes | ||
tf2-NGC-19-11-py3.sif | Ubuntu 18.04 | 10.2 | 7.6.5 | 2.0.0 | 2.3.1 | Release Notes | ||
tf1-NGC-20-03-py3.sif | Ubuntu 18.04 | 10.2 | 7.6.5 | 1.15.2 | 2.4.3 | Release Notes | ||
tf2-NGC-20-03-py3.sif | Ubuntu 18.04 | 10.2 | 7.6.5 | 2.1.0 | 2.4.3 | Release Notes | ||
pytorch.sif | Ubuntu 18.04 | 9.0 | 7.1.2 | 0.4.0 | ||||
pytorch-NGC-19-07.sif | Ubuntu 18.04 | 10.1 | 7.6.1 | 1.2.0 | Release Notes | |||
pytorch-NGC-19-11-py3.sif | Ubuntu 18.04 | 10.2 | 7.6.5 | 1.4.0 | Release Notes | |||
pytorch-NGC-20-03-py3.sif | Ubuntu 18.04 | 10.2 | 7.6.5 | 1.5.0 | Release Notes | |||
tf.sif | Ubuntu 18.04 | 10.0 | 7.1.4 | 1.13.1 | ||||
vanilla_10.0.sif | Ubuntu 18.04 | 10.0 | 7.1.4 | |||||
CUDA 11 | ||||||||
tf1-NGC-20-06-py3.sif | Ubuntu 18.04 | 11.0 | 8.0.1 | 1.15.2 | 2.4.3 | Release Notes | ||
tf2-NGC-20-06-py3.sif | Ubuntu 18.04 | 11.0 | 8.0.1 | 2.2.0 | 2.4.3 | Release Notes | ||
pytorch-NGC-20-06-py3.sif | Ubuntu 18.04 | 11.0 | 8.0.1 | 1.6.0 | Release Notes | |||
tf2-NGC-21-03-py3.sif | Ubuntu 20.04 | 11.2 | 8.1.1 | 2.4.0 | 2.7.0 | Release Notes | ||
pytorch-NGC-21-03-py3.sif | Ubuntu 20.04 | 11.2 | 8.1.1 | 1.9.0 | Release Notes | |||
pytorch-NGC-22-03-py3.sif | Ubuntu 20.04 | 11.6 | 8.3.3 | 1.12.0 | Release Notes | |||
CUDA 12 | ||||||||
tf2-NGC-23-02-py3.sif | Ubuntu 20.04 | 12.0 | 8.7.0 | 2.11.0 | 2.11.0 | Release Notes | ||
pytorch2-NGC-23-05-py3.sif | Ubuntu 20.04 | 12.0 | 8.9.1 | 2.0.0 | Release Notes |
Les images portant la mention NGC sont des images construites à partir des conteneurs dockers Nvidia disponibles sur https://ngc.nvidia.com
Exécution d'un conteneur singularity
L'exécution d'un conteneur singularity s'effectue via la commande 'singularity exec' suivie de l'image du conteneur et du traitement à exécuter dans le conteneur.
Exemple :
module load singularity/3.0.3
cd /logiciels/containerCollections/CUDA11/
singularity exec ./pytorch-NGC-20-06-py3.sif $HOME/moncode.sh
A noter que les variables d'environnement de l'utilisateur sont disponibles dans les conteneurs ainsi que les répertoires /users /projets et /logiciels
Utiliser les Frameworks dans un batch Slurm
Les frameworks disponibles ont la capacité de s'exécuter sur CPUs ou GPUs. Vous pouvez donc exécuter les conteneurs avec Slurm sur n'importe quelle partition d'OSIRIM: '24CPUNodes', '48CPUNodes', '64CPUNodes', 'GPUNodes' ou 'RTX6000Node'.
Dans les exemples ci-dessous, nous souhaitons tirer parti des GPUs, et exécutons les traitements sur la partition 'GPUNodes'. Pour indiquer à Slurm que nous souhaitons utiliser des GPUs, 2 paramètres sont à mentionner impérativement :
#SBATCH --gres=gpu:1 (le nombre de cartes que l'on souhaite utiliser, 4 max par serveur) #SBATCH --gres-flags=enforce-binding
Exemples d'utilisation du framewok Pytorch
Contenu de slurm_job_pytorch.sh
pour l'exécution de Pytorch:
#!/bin/sh
#SBATCH --job-name=GPU-Pytorch-Singularity-Test
#SBATCH --output=ML-%j-Pytorch.out
#SBATCH --error=ML-%j-Pytorch.err
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --partition=GPUNodes
#SBATCH --gres=gpu:1
#SBATCH --gres-flags=enforce-binding
module purge
module load singularity/3.0.3
srun singularity exec /logiciels/containerCollections/CUDA11/pytorch-NGC-20-06-py3.sif python "$HOME/pytorch-script.py"
Exécution :
[bob@co2-slurm-client ~]$ sbatch slurm_job_pytorch.sh
Installation de packages supplémentaires
Il se peut que vous souhaitiez utiliser des bibliothèques non disponibles par défaut dans les conteneurs mis à votre disposition.
Pour installer des packages complémentaires, nous vous préconisons d'utiliser un environnement virtuel python que vous créerez à l'aide de virtualenv et pip.
Créez tout d'abord le répertoire qui hébergera votre environnement virtuel dans votre Home directory (mon_env pour l'exemple) :
[bob@co2-slurm-client ~]$ mkdir $HOME/mon_env
Ouvrez ensuite un shell dans le conteneur :
[bob@co2-slurm-client ~]$ singularity shell /logiciels/containerCollections/CUDA11/pytorch-NGC-20-06-py3.sif
Vérifiez au préalable que la ou les librairies souhaitées ne sont pas présentes dans le conteneur :
Singularity pytorch-NGC-20-06-py3.sif:~> $ pip list (ou conda list)
Créez l'environnement virtuel dans le répertoire 'mon_env' :
Singularity pytorch-NGC-20-06-py3.sif:~> $ virtualenv --system-site-packages $HOME/mon_env
Le paramètre --system-site-packages utilisé avec la commande virtualenv vous permettra d'utiliser dans l'environnement virtuel tous les packages déjà installés (pytorch, ...) avec le python du contenuer, utilisé pour installer l'environnement virtuel.
Ensuite, une fois l'environnement virtuel créé, vous pouvez installer localement les packages voulus (exemple avec le package 'transformers') en utilisant pip.
Pour éviter une erreur du type "EnvironmentError: [Errno 28] No space left on device",vous devez positionner la variable d'environnement Linux TMPDIR dans votre Home directory à la place de celui par défaut, qui ne contiendra peut être pas suffisamment d'espace.
Singularity pytorch-NGC-20-06-py3.sif:~> $ mkdir localTMP
Singularity pytorch-NGC-20-06-py3.sif:~> $ TMPDIR=$HOME/localTMP
Singularity pytorch-NGC-20-06-py3.sif:~> $ TMP=$TMPDIR
Singularity pytorch-NGC-20-06-py3.sif:~> $ TEMP=$TMPDIR
Singularity pytorch-NGC-20-06-py3.sif:~> $ export TMPDIR TMP TEMP
Après avoir exporté les variables TMPDIR, TMP et TEMP, votre environnement est prêt pour l'installation des packages complémentaires.
Activez votre environnement virtuel :
Singularity pytorch-NGC-20-06-py3.sif:~> $ source $HOME/mon_env/bin/activate
Installez le package avec pip :
Singularity pytorch-NGC-20-06-py3.sif:~> $ pip install transformers --user
Note : le flag --user permet d'installer les packages dans le répertoire local de votre environnement 'mon_env', non dans le conteneur.
Enfin, vous pouvez utiliser les nouveaux packages dans vos traitements à partir d'un job SLURM :
Exécution :
[bob@co2-slurm-client ~]$ sbatch slurm_job_transformers.sh
Contenu de slurm_job_transformers.sh :
#!/bin/sh
#SBATCH --job-name=GPU-transformers-Singularity-Test
#SBATCH --output=ML-%j-transformers.out
#SBATCH --error=ML-%j-transformers.err
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --partition=GPUNodes
#SBATCH --gres=gpu:4
#SBATCH --gres-flags=enforce-binding
module purge
module load singularity/3.0.3
srun singularity exec /logiciels/containerCollections/CUDA11/pytorch-NGC-20-06-py3.sif $HOME/mon_env/bin/python "$HOME/transformers-script.py"
NOTE : Certains conteneurs disposent également de CONDA pour créer vos propres environnements personnalisés, mais il sera dans ce cas nécessaire de cloner l'environnement conda du conteneur pour utiliser les librairies python nativement installées dans le conteneur (ou réinstaller l'ensemble des librairies que vous souhaitez utiliser dans votre enviroennemnt CONDA). C'est pour cette raison que nous vous préconisons l'utilisation de 'virtualenv' et 'pip'.
IMPORTANT : Si vous créez un environnement virtuel Python avec une version spécifique de python (e.g. conda create -n mon_env python=2.7), vous devrez réinstaller dans cet environnement tous les packages dont vous aurez besoin, y compris ceux déjà inclus dans le conteneur.