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 16.04 et CUDA 9, Ubuntu 18.04 et CUDA10, CUDA11. Les images (.SIF) sont disponibles sous /logiciels/containerCollections/
Nom du conteneur | OS | CUDA | CuDNN | Tensorflow | Keras | Theano | Pytorch | Contents |
---|---|---|---|---|---|---|---|---|
CUDA 9 | ||||||||
keras-tf.sif | Ubuntu 16.04 | 9.0 | 7.1.2 | 1.12.0 | 2.2.4 | |||
keras-th.sif | Ubuntu 16.04 | 9.0 | 7.1.2 | 2.2.4 | 1.0.3 | |||
pytorch.sif | Ubuntu 16.04 | 7.5 | 5.1 | 0.2.0 | ||||
pytorch_1.0.1.sif | Ubuntu 16.04 | 9.0 | 7.4.2 | 1.0.1 | ||||
tf.sif | Ubuntu 16.04 | 9.0 | 7.1.2 | 1.12.0 | ||||
th.sif | Ubuntu 16.04 | 9.2 | 7.1.2 | 1.0.3 | ||||
vanilla_9.0.sif | Ubuntu 16.04 | 9.0 | 7.1.2 | |||||
vanilla_9.2.sif | Ubuntu 16.04 | 9.2 | 7.1.2 | |||||
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 | Release Notes | |||
pytorch-NGC-21-03-py3.sif | Ubuntu 20.04 | 11.2 | 8.1.1 | 1.9.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/CUDA10/
singularity exec ./tf2-NGC-20-03-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 Tensorflow
Contenu de slurm_job_tf.sh
pour l'exécution de Tensorflow:
#!/bin/sh
#SBATCH --job-name=GPU-Tensorflow-Singularity-Test
#SBATCH --output=ML-%j-Tensorflow.out
#SBATCH --error=ML-%j-Tensorflow.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/CUDA10/tf2-NGC-20-03-py3.sif python "$HOME/tf-script.py"
Exécution :
[bob@co2-slurm-client ~]$ sbatch slurm_job_tf.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, vous pouvez pour cela utiliser virtualenv, pip ou conda.
-
Pour Python 2 utilisez les logiciels suivants : conda2, pip2 et virtualenv2
-
Pour Python 3 utilisez les logiciels suivants : conda3, pip3 et virtualenv3
Voici ci-dessous la procédure à suivre :
Tout d'abord, vous devez créer un environnement virtuel à partir de votre $HOME directory, en ouvrant un shell dans le conteneur :
$ singularity shell /logiciels/containerCollections/CUDA10/tf.sif
Pour créer un environnement virtuel, dans le répertoire appelé 'ENVNAME' :
(tf.sif) → $ mkdir $HOME/ENVNAME
puis,
(tf.sif) → $ virtualenv2 --system-site-packages $HOME/ENVNAME
## ou avec virtualenv pour python 3,
(tf.sif) → $ virtualenv3 --system-site-packages $HOME/ENVNAME
## ou avec conda pour python 2,
(tf.sif) → $ conda2 create -n ENVNAME
## ou avec conda pour python 3,
(tf.sif) → $ conda3 create -n ENVNAME
NOTE : pour Conda 2 ou 3, vous n'avez pas besoin de créer un répertoire spécifique. Tous les environnements virtuels seront placés automatiquement dans $HOME/.conda/
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 avec le python utilisé pour installer l'environnement virtuel (tensorflow, pytorch ou keras par exemple).
Ensuite, une fois l'environnement virtuel créé, vous pouvez installer localement les packages voulus (exemple avec le package Shogun de Reinforcement Learning Package) en utilisant pip ou conda.
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.
(tf.sif) → $ mkdir localTMP
(tf.sif) → $ TMPDIR=$HOME/localTMP
(tf.sif) → $ TMP=$TMPDIR
(tf.sif) → $ TEMP=$TMPDIR
(tf.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 en utilisant pip ou conda :
Avec Conda :
$ singularity shell /logiciels/containerCollections/CUDA10/tf.sif
# Before any activation you should source conda script
# Pour conda2
(tf.sif) → $ source /usr/local/miniconda2/etc/profile.d/conda.sh
(tf.sif) → $ conda2 activate ENVNAME
(tf.sif) → $ conda2 install -c conda-forge shogun
Ou
# Pour conda3
(tf.sif) → $ source /usr/local/miniconda3/etc/profile.d/conda.sh
(tf.sif) → $ source activate ENVNAME
(tf.sif) → $ conda3 install -c conda-forge shogun
Ou avec pip:
$ singularity shell /logiciels/containerCollections/CUDA10/tf.sif
# Pour pip2
(tf.sif) → $ source ENVNAME/bin/activate
(tf.sif) → $ pip2 install shogun-ml --user
Ou
# Pour pip3
(tf.sif) → $ source ENVNAME/bin/activate
(tf.sif) → $ pip3 install shogun-ml --user
Note : le flag --user permet d'installer les packages dans le répertoire local de votre environnement ENVNAME, 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_shogun.sh
Contenu de slurm_job_shogun.sh :
#!/bin/sh
#SBATCH --job-name=GPU-shogun-Singularity-Test
#SBATCH --output=ML-%j-shogun.out
#SBATCH --error=ML-%j-shogun.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/CUDA10/tf.sif $HOME/ENVNAME/bin/python "$HOME/shogun-script.py"
OU, sous conda2
srun singularity exec /logiciels/containerCollections/CUDA9/tf.sif $HOME/conda/envs/ENVNAME/bin/python "$HOME/shogun-script.py"
IMPORTANT :
Si vous créez un environnement virtuel Python avec une version spécifique de python (e.g. conda2 create -n ENVNAME 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.
CAS SPECIAL : Installation de packages Python à partir de GitHub
Après avoir activé votre environnement virtuel avec conda ou virtualenv, vous pouvez télécharger le package dans un répertoire spécifique :
(tf.sif) → $ source activate ENVNAME
(tf.sif) → $ mkdir mesPackagesGithub
(tf.sif) → $ cd mesPackagesGithub
(tf.sif) → $ wget https://github.com/tensorflow/compression/archive/v1.1.zip
(tf.sif ~/mesPackagesGithub) → $ unzip v1.1.zip
(tf.sif ~/mesPackagesGithub) → $ ls
drwxr-xr-x 2 fdamoun celdev 820 compression-1.1
Après avoir fini l'installation manuelle du package et pour pouvoir ensuite l'utiliser, vous devez modifier la variable d'environnement PYTHONPATH pour qu'elle prenne en compte le chemin du répertoire où vous avez installé le package. Vous pouvez le faire de deux façons :
Soit par un export dans le script Slurm :
#!/bin/sh
#SBATCH --job-name=Multi-CPU-Test
#SBATCH --output=ML-%j-Tensorflow.out
#SBATCH --error=ML-%j-Tensorflow.err
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --partition=GPUNodes
#SBATCH --gres=gpu:1
#SBATCH --nodelist=gpu-nc04
#SBATCH --gres-flags=enforce-binding
export PYTHONPATH="~/mesPackagesGithub:$PYTHONPATH"
srun [...]
Soit dans l'en tête du script python que vous souhaitez exécuter :
import sys
import os
sys.path.append('/users/celdev/fdamoun/mesPackagesGithub/compression-1.1')
import tensorflow_compression as tfc
[...]