Utilisation des GPU

Cluster GPU OSIRIM / Machine Learning

Des frameworks de Machine Learning sont disponibles sur les serveurs de la partition GPUNodes. Chaque serveur est équipé de quatre cartes graphiques NVidia 1080 TI.

Afin d'utiliser plusieurs versions de Cuda / CuDNN / python et d'éviter les conflits entre librairies et dépendances ML, chaque framework s'exécute dans un conteneur dédié (docker).

L'image docker de chaque framework est construite sur une image de base Ubuntu 16.04 dans laquelle les logiciels suivants sont disponibles :
  * CUDA 9,
  * cuDNN 7,
  * Miniconda avec numpy scipy scikit-cuda mkl mkl-service nccl (avec leurs dépendances),
  * Julia

 

Utiliser les frameworks dans un Batch Slurm

Comme la commande shell pour exécuter un script d’exécution de framework dans une instance Docker est volumineuse, des commandes shell par framework ont été créées pour faciliter le processus.

Ces commandes sont des liens symboliques vers un script qui réalise les taches suivantes :
  * Créée l’instance Docker,
  * Positionne le user/group qui exécutera le job,
  * Passe les répertoires /users /projets et /logiciels à l’instance de façon à ce que ces répertoires soient accessibles pour les traitements lancés dans l’instance Docker,
  * Positionne le répertoire de travail Slurm comme répertoire de travail,
  * Positionne les variables d’environnement :

 HOME                  Home directory de l'utilisateur
 SLURM_JOB_ID          Slurm Job ID
 SLURM_ARRAY_TASK_ID   TaskID du Slurm Job Array courant
 SLURM_SUBMIT_DIR      Repertoire de travail Slurm (où la commande sbatch est exécutée)

 

Frameworks disponibles

Framework OS  CUDA  cuDNN  Python  Command 
tensorflow ubuntu16.04 9.0 7 3 tf-py3
keras (TF) ubuntu16.04 9.0 7 3 keras-py3-tf
pytorch ubuntu16.04 9.0 7 3 pytorch-py3
theano ubuntu16.04 9.0 7 3 theano-py3
keras (Theano) ubuntu16.04 9.0 7 3 keras-py3-th

 

Problèmes connus

Comme le script est exécuté dans un conteneur, arrêter le job avec la commande « scancel » termine le job Slurm MAIS N’ARRETE PAS le process exécuté sur le GPU. Slurm considèrera que le GPU est disponible pour un nouveau Job, et lancera un nouveau traitement sur ce GPU, alors que l’ancien traitement « zombie » s’exécute toujours
Pour contourner ce problème, nous avons mis en place une fonction spécifique : si vous avez besoin d’arrêter un job en cours, connectez-vous sur le site web d’Osirim, authentifiez-vous dans la partie intranet, allez sur la page « Etat du cluster Slurm », sélectionnez la partition « GPUNodes », et dans la colonne « actions » du tableau des jobs en cours, actionnez la croix rouge correspondant au job que vous voulez arrêter. Cette action arrêtera proprement le job Slurm ainsi que le process exécuté sur le GPU..

 

Exemples d'utilisation

Tensorflow

#SBATCH --job-name=GPU-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

srun tf-py3 python "$HOME/tf-script.py"

 

pyTorch

#SBATCH --job-name=GPU-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

srun pytorch-py3 python "$HOME/pytorch-script.py"

Installation de packages supplémentaires :

Les conteneurs dockers qui hébergent les frameworks de Machine Learning contiennent la version 3.6 de Python. Certains packages Python complémentaires ont été installés (voir la liste des packages disponibles sur le serveur Web d’Osirim : http://osirim.irit.fr/site/fr/articles/logiciels-disponibles ).

Si vous souhaitez utiliser, à partir des conteneurs dockers, des packages supplémentaires non installés dans le docker, vous ne pourrez pas les installer directement dans le docker, car vous n’avez pas les droits « root ».

Pour installer des packages complémentaires, vous pouvez pour cela utiliser un « virtual env » python, que vous installerez depuis le docker. Voici ci-dessous la procédure à suivre :

Tout d’abord, vous devez créer un virtual env à partir d’un job, depuis le conteneur docker que vous souhaitez utiliser (exemple avec un docker Tensorflow) :

#!/bin/sh

#SBATCH --job-name=install_virtual_env
#SBATCH --output=ML-%j-tf.out
#SBATCH --error=ML-%j-tf.err
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --partition=GPUNodes
#SBATCH --gres=gpu:1
#SBATCH --gres-flags=enforce-binding

srun tf-py3 virtualenv --system-site-packages /users/sig/toto/venv

Le paramètre --system-site-packages vous permettra d’utiliser dans le virtual env tous les packages déjà installés avec le python utilisé pour installer le vrtual env (Python 3.6 à l’intérieur du docker Tensorflow dans l’exemple).

Ensuite, une fois le virtual env créé, vous pouvez installer les packages voulus :

#!/bin/sh

#SBATCH --job-name=install_virtual_env
#SBATCH --output=ML-%j-tf.out
#SBATCH --error=ML-%j-tf.err
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --partition=GPUNodes
#SBATCH --gres=gpu:1
#SBATCH --gres-flags=enforce-binding

srun  tf-py3 /users/sig/toto/venv/bin/pip3 install ...

Enfin, vous pouvez utiliser les nouveaux packages dans vos traitements, en exécutant le python installé dans votre virtual env :

#!/bin/sh

#SBATCH --job-name=install_virtual_env
#SBATCH --output=ML-%j-tf.out
#SBATCH --error=ML-%j-tf.err
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --partition=GPUNodes
#SBATCH --gres=gpu:1
#SBATCH --gres-flags=enforce-binding

srun tf-py3 /users/sig/toto/venv/bin/python "$HOME/your-script.py"