TensorFlow 2.0
with GPU support on
Ubuntu 18.04 LTS

Installare TensorFlow 2.0 senza il supporto per la GPU è veramente un gioco da ragazzi e nella maggior parte dei casi risulta semplice come fare “pip install tensorflow”. Invece, settare il proprio sistema per dare tutti gli strumenti alla libreria di Google per istanziare i grafi sulla nostra bellissima GPU, può trasformarsi facilmente in una Caporetto 🙂 Proprio per questo ho deciso di mettere nero su bianco una semplice guida, ottenuta con molti tentativi con forum e rituali magici, su come installare TensorFlow 2.0 con supporto GPU su Ubuntu. La GPU in tutto questo gioca un ruolo fondamentale. Io ho potuto testare questa guida su due GPU: 2080 e 2080 Ti. Per tutte le altre la guida dovrebbe andare bene ma comunque good luck :))

Install Ubuntu Dependencies

Apriamo il nostro pseudo-terminal preferito e incominciamo con l’aggiornare del nostro sistema (naturalmente suppongo che non abbiate cambiato la shell di default Bash e che siate amministratori o parte del gruppo sudo) :

sudo apt-get update
sudo apt-get upgrade

A questo punto installiamo un bel po’ di dipendenze utili:

sudo apt-get install build-essential cmake unzip pkg-config
sudo apt-get install gcc-6 g++-6

sudo apt-get install libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev

sudo apt-get install libopenblas-dev libatlas-base-dev liblapack-dev gfortran

sudo apt-get install libhdf5-serial-dev

sudo apt-get install python3-dev python3-tk python-imaging-tk
sudo apt-get install libgtk-3-dev

Install GPU Drivers

Aggiorniamo il sistema con gli ultimi NVIDIA driver disponibili. Questo può essere facilmente fatto attraverso “Aggiornamenti & Update” di Ubuntu.

Alternativamente, possiamo procedere con la seguente procedura da console:

  • Controlliamo la versione degli ultimi driver video disponibili con questa pagina 
  • A questo punto aggiungiamo la repository apt-get dei driver della scheda video
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
  • Infine possiamo installare i driver più recenti sostituendo a XXX la versione scelta:
sudo apt-get install nvidia-driver-XXX
  • Finalmente possiamo riavviare con:
sudo reboot now

A questo punto dopo il riavvio, lanciando il mitico comando “nvidia-smi” dovremmo vedere una schermata simile:

nvidia_smi

In alto c’è la versione dei driver che stiamo utilizzando, al centro le GPU disponibili e in basso e processi che stanno girando.

Install CUDA 10.0

cuda_10

Possiamo procedere installando CUDA 10 sulla nostra macchina.

  • Andiamo nella cartella “Downloads” (o qualsiasi posto vogliate), scarichiamo l’eseguibile di CUDA, gli diamo i permessi necessari e procediamo con l’installazione. Durante l’installazione ‘q’ per saltare la licenza in formato divina commedia e poi selezioniamo solo l’installazione di CUDA e non dei driver e altre cose.
cd Downloads
wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux
chmod +x cuda_10.0.130_410.48_linux
sudo ./cuda_10.0.130_410.48_linux --override
  • Aggiungiamo al nostro ‘.bashrc’ (nella home ‘cd ~ && nano .bashrc’) il path di CUDA 10.
# NVIDIA CUDA Toolkit
export PATH=/usr/local/cuda-10.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64

A questo punto dopo il source ‘source ~/.bashrc’ dovremmo poter vedere la versione di CUDA installata con ‘nvcc -V’

Download and Place cuDNN

Questo è un punto molto dedicato. Da qui possono scaturire molti problemi successivi con TensorFlow. Dobbiamo scaricare e piazzare nel nostro file system la libreria per il deep learning cuDNN.

  • Iniziamo scaricando la versione più recente di cuDNN da questo link. (per farlo vi servirà essere registrati).
  • Supponendo che il file scaricato si trovi nella cartella “Downloads”, procediamo come segue:
tar -zxf cudnn-10.0-linux-x64-v7.4.2.24.tgz
cd cuda
sudo cp -P lib64/* /usr/local/cuda/lib64/
sudo cp -P include/* /usr/local/cuda/include/

Come potete ben notare stiamo semplicemente copiando i file che abbiamo scaricato nelle cartelle di sistema di cuda. Nel caso volessimo cambiare versione di cuDNN ci basterà sostituire questi file nelle cartelle ‘/usr/local/cuda’ (cuda in verità è un link simbolico a cuda-10.0).

Install TensorFlow GPU

Finalmente siamo arrivati al punto in cui possiamo veramente fare ‘pip install’ e risolverla li. Il mio consiglio è di lavorare con i “virtual environments”, ma nel caso non foste interessati a tenere separate le vostre librerie procedete con questo comando:

pip3 install tensorflow-gpu

Install TensorFlow GPU in a Virtual Environment

Invece, se vogliamo installare TensorFlow all’interno di un “virtual environment” possiamo procedere con quanto segue:

pip3 install virtualenvwrapper --user
  • Aggiungiamo al nostro .bashrc le seguenti righe (‘cd ~ && nano .bashrc’):
# virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
export PATH=$HOME/.local/bin:$PATH
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source $HOME/.local/bin/virtualenvwrapper.sh
  • Creiamo un “virtual environment” con il seguente comando:
mkvirtualenv TensorFlow2.0

Il secondo può essere qualsiasi parola che vogliamo. Sarà il nome del nostro virtualenv. Gli altri due comandi fondamentali per lavorare con “virtualenvwrapper” sono ‘workon nome_virtualenv’ per entrare in un virtualenv e ‘rmvirtualenv nome_virtualenv’ per eliminare un virtualenv. ‘deactivate’ invece per uscire da un virtualenv.

Per cui entriamo nel nostro virtualenv appena creato

workon TensorFlow2.0

e installiamo TensorFlow GPU:

pip3 install tensorflow-gpu

Bonus: Ipython Kernel in Virtualenv and Extensions

jupyter_notebook

Infine, se vogliamo creare un kernel per “jupyter notebook” con le librerie presenti nel nostro “virtual environment”, eseguiamo i seguenti comandi all’interno del nostro virtualenv (‘workon TensorFlow2.0’)

pip3 install ipykernel

ipython kernel install --user --name=TensorFlow2.0

Finally, let’s install jupyter extensions

#install jupyter extensions

pip install jupyter_contrib_nbextensions

jupyter contrib nbextension install --user