Table des matières

Utiliser les GPU d'Atlas avec Pytorch

En construction

Une façon d'utiliser les GPU d'Atlas est d'entraîner un réseau de neurones en utilisant pytorch. On utilise ici un exemple pour illustrer comment faire. La procédure est la même si on utilise Pandora.

Téléchargement de l'exemple

On utilise l'ensemble d'images de CIFAR10 qui comprend 60000 images de 32×32 dans 10 classes ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'). 50000 images sont utilisées pour l'entraînement du réseau et 10000 pour le test.

Le réseau que l'on va optimiser est ResNet18.

Les scripts python pour gérer l'optimisation et récupérer les images sont disponibles sur github. Se placer dans un répertoire de test et faire :

git clone https://github.com/ctribes/cifar10-resnet18-pytorch-quantization.git

Exécution de l'exemple

Pytorch (et autres outils) sont requis par le script d'optimisation. Au GERAD nous avons accès à plusieurs versions de Pytorch avec anaconda.

Pour charger une version :

module load anaconda

conda activate pytorch-1.8.1

module load python

python3 -m venv .env

pip3 install –upgrage pip

pip3 install torch torchvision torchaudio

Avant de lancer le script, il faut sélectionner quel(s) GPU utiliser parmi les 4 A100 (en mai 2021) disponibles sur Atlas (8 GPU P100 sur Pandora). Avant de choisir un ou plusieurs GPUs il faut vérifier si ils sont utilisés avec la commande

nvidia-smi

Le dernier block affiché par la commande donne les processus lancés sur quels GPUs.

On peut choisir un GPU pour pytorch avec la commande

export CUDA_VISIBLE_DEVICES=xx

Avec xx pour un numéro de GPU disponible.

Dans le répertoire cifar10-resnet18-pytorch-quantization, on trouve plusieurs scripts utiles pour “quantizer” un réseau. Le script que nous allons utiliser, fait l'optimisation du réseau (sans faire de “quantization”). De l'information sur les scripts est fournie dans les fichiers README.

python trainFullPrecisionAndSaveState.py --epochs=1

On peut aussi lancer la commande avec une valeur de CUDA_VISIBLE_DEVICES associée :

CUDA_VISIBLE_DEVICES=2 python trainFullPrecisionAndSaveState.py --epochs=1

Si les images du dataset CIFAR10 ne sont pas présentes, la fonction de torchvision qui charge les images va d'abord les télécharger.

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz

100%|███████████████████████████████████████████████████████████████████████████████████████████████████▉| 170360832/170498071 [00:05<00:00, 37255459.57it/s]

L'optimisation sur 200 epochs prend plusieurs minutes. Avec l'option --epochs=1, une seule epoch est effectuée et cela prend quelques secondes. On peut vérifier ce qui se passe sur le GPU avec la commande nvidia-smi.

Pour utiliser plusieurs GPU, il faut faire :

export CUDA_VISIBLE_DEVICES=xx,yy

On peut alors passer de plus grosses batch d'images (512 au lieu de 256) lors de l'entrainement du réseau

python trainFullPrecisionAndSaveState.py --epochs=1 --batch_size=512

À noter que ce choix influence la précision finale obtenue par le réseau.