ml-server

Après avoir passé quelques heures sur l’installation d’un serveur IA en local, finalement couronnée de succès, je vous propose un petit article récapitulatif des étapes de la création d’un serveur dédié à l’apprentissage machine
C’est ma première configuration matérielle, donc relativement légère. Il faut compter 1400€ à l’heure de l’écriture de ces lignes pour la réalisation d’un projet similaire.
Le tuto commence une fois que la machine a été physiquement assemblée et que via le bios on voit les différents composants. Je ne donne pas le détail des raisons des différentes installations, je pense que ça parlera à toutes celles et ceux qui s’intéressent au domaine. Par contre je mets à chaque fois les liens vers les docs utilisées et l’ensemble des commandes systèmes à exécuter.

Les chapitres de ce tuto:

  • Configuration matérielle
  • Installation du serveur Ubuntu
  • Carte graphique: pilote NVIDIA, Cuda, cuDNN
  • Installation de la pile de logiciels
  • Connexion à distance
  • Tests

Happy Hacking

Configuration matérielle

Processeur AMD Ryzen 7 2700X Wraith Prism Edition - 3,7/4,3 GHz
Carte mère Gaming TUF B450 Plus Asus
RAM T-FORCE Dark Za - 2 x 16 Go - DDR4 3200 MHz - Noir
Alimentation CORSAIR HX750 750W - 80 Plus Platinum
Disque dur Samsung 860 EVO 500 Go 2.5’’ SATA III (6 Gb/s)
Boîtier FRACTAL DESIGN Meshify C Blanc
Carte graphique ASUS Geforce RTX 2070 - DUAL OC EVO V2 - 8 Go

Installation du serveur Ubuntu

20.04 LTS (Focal Fossa)

Création d’un unbuntu server depuis MacOS
Récupération de Ubuntu 20.04 LTS via BitTorrent

Création de la clé d’installation via Etcher

Installation du serveur
màj à la version 20.06.1 pendant l’installation

(X) Use an entire disk
[X] Set up this disk as an LVM group

partition 1: primary ESP, format fat32, mounted at /boot/efi 512M
partition 2: format ext4, /boot 1G
partition 3: PV of LVM volume group ubuntu-vg 464G

nom: USER
nom machine: ML-SERVER
nom utilisateur: USER
mdp: PASSWORD

Installation d’un serveur SSH pour l’accès distant
[X] Install OpenSSH server

Featured Server Snaps: aucune installation particulière
[]

Installation de l’interface graphique
Install Full Gnome Desktop on Ubuntu 20.04 LTS Focal Fossa
sudo apt install tasksel
sudo tasksel install ubuntu-desktop
sudo reboot

màj de l’heure
màj du système via Software Updater

Carte graphique: pilote NVIDIA, Cuda, cuDNN

Installation du pilote NVIDIA pour la carte graphique

How to install the NVIDIA drivers on Ubuntu
ubuntu-drivers devices
sudo ubuntu-drivers autoinstall
sudo reboot

L’option de l’installation via l’application Softwate & Updates ne fonctionne pas directement chez moi.
Simplement cocher l’option dans Additional Drivers
[X] Using NVIDIA driver metapackage from nvidia-driver-440 (proprietary, tested)
Problème: pk-client-error-quark cannot download packages while offline (257)

Cuda et cuDNN:
Installation CUDA 10.1
sudo apt install nvidia-cuda-toolkit

Vérification version de cuda:
nvcc -V

Installation cuDNN (7.6.5)
Necessite un compte developpeur (gratuit) chez NVidia
Download cuDNN v7.6.5 (November 5th, 2019), for CUDA 10.1
cuDNN Library for Linux: cudnn-10.1-linux-x64-v7.6.5.32

Se placer dans le répertoire où l’extraction a été faite:
sudo cp cuda/lib64/libcudnn* /usr/lib/cuda/lib64/
sudo chmod a+r /usr/lib/cuda/include/cudnn.h /usr/lib/cuda/lib64/libcudnn*
echo 'export LD_LIBRARY_PATH=/usr/lib/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/lib/cuda/include:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

Installation de la pile de logiciels

Installation miniconda
Récupération de l’installateur
Miniconda3 Linux 64-bit

bash Miniconda3-latest-Linux-x86_64.sh

conda update conda

Création d’un environnement conda minimal dédié à tensorflow avec JupyterLab
créer le fichier tensorflow.yml
nano tensorflow.yml
avec pour contenu

name: tensorflow

dependencies:
    - python=3.7
    - pip>=19.0
    - tensorflow
    - tensorflow-gpu
    - scikit-learn
    - scipy
    - pandas
    - matplotlib
    - pillow
    - jupyterlab

conda env create -f tensorflow.yml

Test que tensorflow voit le GPU
conda activate tensorflow
python
>>> import tensorflow as tf
>>> tf.config.list_physical_devices('GPU')
doit afficher le GPU
>>> exit()

Ajout d’un kernel dans jupyter pour pouvoir utiliser le nouvel environnement sous JupyterLab

Using Virtual Environments in Jupyter Notebook and Python: Add Virtual Environment to Jupyter Notebook

pip install --user ipykernel
python -m ipykernel install --user --name=tensorflow

Test:
jupyter lab
Dans les notebooks proposés on doit voir Python 3 et tensorflow

Connexion à distance

Connexion à distance au serveur sur le réseau local depuis un mac

Vérification du bon fonctionnement du serveur ssh
sudo service ssh status

Récupération de l’adresse ip du serveur
ip addr show

Depuis le termimal du client (mac)
Remplacer USER@REMOTE.HOST avec utilisateur serveur et IP
ssh USER@REMOTE.HOST

Activation de l’environnement tensorflow
conda activate tensorflow
jupyter lab

Connection à Jupyter lab via un tunnel ssh
permet de rerouter le localhost du client sur le serveur distant
ssh -L localhost:8888:localhost:8888 -N -f USER@REMOTE.HOST

Dans firefox du client:
http://localhost:8888/lab

Utilisation du gpu dans un notebook
tensorflow & GPU
Ajout du code suivant pour éviter le message d’erreur UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  try:
    # Currently, memory growth needs to be the same across GPUs
    for gpu in gpus:
      tf.config.experimental.set_memory_growth(gpu, True)
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Memory growth must be set before GPUs have been initialized
    print(e)

Tests

Notebook pour tester la configuration

Version avec les résultats d’exécution

61 s pour la phase d’apprentissage au lieu de 1148 s sur le mac

Enjoy :)

References