====== 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 32x32 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.