Dans deux articles précédents, nous avions vu comment installer Tensorflow 1 et 2 avec GPU support sur Ubuntu 18.04 avec une carte graphique Gefore GTX 1080 ou une plus ancienne carte plus supportée, la Geforce GTX 660 Ti.


J’ai récemment fait un système upgrade et suis passé sur Kubuntu 20.04. Il est excellant et très stable, je le recommande grandement. Je suis toujours partisan des stations de Deep Learning personnelles (non dans le Cloud). D’un point de vue économique, c’est beaucoup plus rentable d’avoir sa propre station. Il vous faut juste un boitier EGPU 300€ (pour un haut de gamme type Razer), un PC (gratuit, quel dev ou data engineer n’en a pas? Idéalement il vous faudrait un PC secondaire) et un GPU (entre 150€ et 700€ pour une bête voire 1500€ pour un monstre). La location d’une machine avec GPU sur AWS vous revient à minimum $300 par mois (min $0.5/heure * 24h * 7 jours * 4 semaines). Il n’y a pas photo… Après AWS vous permet d’avoir des instances avec plusieurs GPUs, cela peut être utile dans certains cas. Peut-être qu’un build avec plusieurs eGPU pourrait faire l’affaire pour ce use case… Je ne ferai pas l’essai, je n’ai pas ce besoin…


Dans cet article nous allons voir comment installer Tensorflow 2 sur sa propre machine reliée a un EGPU Nvidia Geforce GTX 1080, Kubuntu 20.04 et Docker. Il n’y a plus l’installation complexe de Cuda à gérer :) .


Installation

sudo apt-get update
sudo apt-get dist-upgrade

Autoriser la communication via Thunderbolt, et donc le EGPU

sudo sh -c 'echo 1 > /sys/bus/thunderbolt/devices/0-0/authorized'
sudo sh -c 'echo 1 > /sys/bus/thunderbolt/devices/0-1/authorized'

Vérifier que le EGPU est détecté:

lspci | grep -i nvidia

Installation de Cuda toolkit (ce n’est pas Cuda)

sudo apt-get install nvidia-cuda-toolkit

Si vous utilisez Ubuntu 20.04 et pas Kubuntu 20.04 vous devrez désactiver l’utilisation de Wayland en commmentant la ligne suivante #WaylandEnable=false dans le fichier /etc/gdm3/custom.conf.


Installation le driver Nvidia

# Désinstaller les drivers déjà installés
sudo dpkg -P $(dpkg -l | grep nvidia-driver | awk '{print $2}')
sudo apt autoremove
# Installer les nouveaux drivers Nvidia propriétaire (pas les "nouveau" opensource)
sudo apt-get install --no-install-recommends nvidia-driver-418

Configurer Grub pour booter en mode runlevel 3

Le fichier grub original /etc/default/grub ressemble à ceci:

#If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'
 
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

Remplacer la variable GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" par GRUB_CMDLINE_LINUX_DEFAULT="3".


Mettre à jour Grub et redémarrer

sudo update-grub
sudo reboot

Autoriser le Driver Nvidia a accélérer le server X.

Pour ce faire, éditer le fichier /usr/share/X11/xorg.conf.d/10-nvidia.conf et ajouter les lignes suivantes:

Section "OutputClass"
   Identifier "nvidia"
   MatchDriver "nvidia-drm"
   Driver "nvidia"
   Option "AllowExternalGpus" "True"
   Option "AllowEmptyInitialConfiguration"
   ModulePath "/usr/lib/x86_64-linux-gnu/nvidia/xorg"
EndSection

Redémarrer votre machine pour vérifier que tout est bon. Après identification et exécution de la commande startx, le X server doit démarrer et vous devriez voir le desktop KDE.


(Optionel) Reconfigurer GRUB

Vous pouvez éventuellement reconfigurer GRUB et “setter” la variable GRUB_CMDLINE_LINUX_DEFAULT à "quiet splash".


Vérifier le bon fonctionnement des Drivers Nvidia

Après le redémarrage du PC, le X server ne va plus démarrer, c’est normal. Identifiez-vous puis vérifier que les drivers Nvidia fonctionnent.

nvidia-smi

Si vous avez un output qui ressemble à ceci, vous êtes bon:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.38       Driver Version: 455.38       CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 00000000:06:00.0 Off |                  N/A |
| 27%   27C    P8     5W / 180W |    441MiB /  8119MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1487      G   /usr/lib/xorg/Xorg                215MiB |
+-----------------------------------------------------------------------------+

Installer Docker

Si ce n’est pas déjà fait, installer Docker:

curl https://get.docker.com | sh \
  && sudo systemctl start docker \
  && sudo systemctl enable docker

Installer Nvidia-docker

sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

Démarrer un base container CUDA et vérifier que tout est ok

sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

Si vous avez le même output que moi, c’est que tout est bon

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.38       Driver Version: 455.38       CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 00000000:06:00.0 Off |                  N/A |
| 27%   27C    P8     6W / 180W |    443MiB /  8119MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Installer Tensorflow 2

sudo docker run --rm -it --gpus all nvidia/cuda:11.0-base /bin/bash
apt-get update
apt-get install python3-dev python3-pip
pip3 install tensorflow-gpu
python3 
>>> import tensorflow
>>> from tensorflow.python.client import device_lib
>>> print(device_lib.list_local_devices())