TensorFlow con accelerazione tramite GPU

Inizia subito con questa guida per applicazioni basate su GPU.

TensorFlow

TensorFlow è una libreria di software per la progettazione e l'implementazione di calcoli numerici, con un'attenzione particolare alle applicazioni di apprendimento automatico. La libreria permette la descrizione degli algoritmi come grafici di operazioni connesse che possono essere eseguite su varie piattaforme GPU-compatibili, che comprendono dispositivi portatili, desktop e server di fascia alta.

L'esecuzione odi TensorFlow è il 50% più veloce su GPU Pascal recenti e si distribuisce perfettamente in più GPU. In tal modo, il training dei modelli richiede ore e non giorni.

Installazione

Requisiti di sistema

La versione GPU-compatibile di TensorFlow ha i seguenti requisiti:

  • Linux a 64 bit
  • Python 2.7
  • CUDA 7.5 (le GPU Pascal richiedono CUDA 8.0)
  • cuDNN v5.1 (cuDNN v6 su TF v1.3)

 

Occorre anche una GPU NVIDIA che supporti la capacità di calcolo versione 3.0 o successiva.

Istruzioni di download e di installazione

TensorFlow è distribuito su licenza open-source Apache v2 in  GitHub. Questa guida analizza la build e l'installazione di TensorFlow in una macchina Ubuntu 16.04 con una o più GPU NVIDIA.

Per le modalità di installazione con virtualenv, Docker e l'installazione da sorgenti sulle ultime revisioni rilasciate, consultare il sito TensorFlow .

SEGUE UN BREVE SOMMARIO DELLA PROCEDURA DI COMPILAZIONE

1. Aggiornare o installare i driver NVIDIA

Installare driver NVIDIA aggiornati per il sistema.

$ sudo add-apt-repository ppa:graphics-drivers/ppa 
$ sudo apt update (ripetere l'esecuzione in caso di messaggi di avvertenza o errore) 
$ sudo apt-get install nvidia- (premere il tasto Tab per controllare l'ultimo aggiornamento). 375 (non utilizzare 378 in quanto può causare loop del login)

Riavviare per applicare il driver grafico.

2. Installare e provare CUDA

Per utilizzare TensorFlow con GPU NVIDIA, installare innanzitutto il  Toolkit CUDA attenendosi alla documentazione ufficiale. Operazioni per CUDA 8.0:

Accedere a https://developer.nvidia.com/cuda-downloads

Selezionare Linux, x86_64, Ubuntu, 16.04, deb (local).
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb (è il file deb scaricato) 
$ sudo apt-get update
$ sudo apt-get install cuda

Se viene emesso un messaggio che suggerisce di eseguire nuovamente sudo apt-get update, eseguirlo ed eseguire nuovamente sudo apt-get install cuda.

$ export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}} 
$ export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64\${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

Provare l'installazione di CUDA:

$ cd /usr/local/cuda-8.0/samples/5_Simulations/nbody
$ sudo make
$ ./nbody

In assenza di problemi, si aprirà una nuova finestra per l'esecuzione della simulazione n-body.

3. Installare cuDNN

Dopo l'installazione del Toolkit CUDA, scaricare la  Libreria cuDNN v5.1 (cuDNN v6 su TF v1.3) per Linux e procedere all'installazione attenendosi alla documentazione ufficiale (tenere presente che è necessario eseguire la registrazione all' Accelerated Computing Developer Program). Operazioni per cuDNN v5.1:

Dopo il download, accedere alla directory contenente cuDNN:

$ tar -xzvf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

Nota: la procedura precedente è simile a quella per cuDNN v6.

Una volta installati i prerequisiti, è possibile eseguire la build e l'installazione di TensorFlow.

4. Preparare le dipendenze di TensorFlow e i pacchetti necessari

$ sudo apt-get install libcupti-dev

5. Installare TensorFlow (versione con accelerazione tramite GPU)

$ pip install tensorflow-gpu

6. Accertarsi che l'installazione sia avvenuta correttamente

L'installazione verrà verificata rapidamente chiudendo tutti i terminali aperti e aprendo un nuovo terminale.

Accedere (cd) a una directory nel sistema diversa dalla sottodirectory tensorflow da cui è stato richiamato il comando configure.

Richiamare python: digitare python nella riga di comando.

Immettere il seguente breve programma:

$ import tensorflow as tf
$ hello = tf.constant('Benvenuti in TensorFlow')
$ sess = tf.Session()
$ print(sess.run(hello))

L'output dovrebbe essere "Benvenuti in TensorFlow". Congratulazioni! Per verificare la versione di TensorFlow installata è possibile anche immettere "print(tf.__version__)".

Modelli di training

TensorFlow può essere usato via API Python o C++, mentre la sua funzionalità chiave è fornita da un backend C++. L'API offre un'interfaccia per la manipolazione dei tensori (array n-dimensionali) analoga a Numpy, e include capacità di differenziazione automatica per il calcolo di gradienti per l'uso nelle routine di ottimizzazione.

La libreria comprende un grande numero di operazioni incorporate, fra cui le funzioni di moltiplicazione, convoluzione, pooling e attivazione della matrice, le funzioni loss, gli ottimizzatori e molte altre ancora. Una volta definito il grafo dei calcoli, TensorFlow permette di essere eseguito in modo efficiente e portatile su desktop, server e piattaforme mobili.

Per eseguire gli esempi di codice riportati di seguito, accedere prima alla directory di TensorFlow 1:

$ cd (tensorflow directory) 
$ git clone -b update-models-1.0 https://github.com/tensorflow/models

Il riconoscimento delle immagini è un'attività in cui il deep Learning eccelle particolarmente. Anche se l'attività di riconoscimento delle immagini può sembrare semplice per il cervello umano, per un computer è un'attività particolarmente complessa. Ciononostante, negli ultimi anni sono stati compiuti notevoli progressi, al punto da superare le capacità umane. Grazie alle reti neurali convoluzionali (CNN); le continue ricerche hanno dimostrato regolari progressi nella visione artificiale, convalidati da  ImageNet, un benchmark accademico per la visione artificiale.

DIMOSTRAZIONE RAPIDA CON INCEPTION-V3

Utilizzare i seguenti comandi per scoprire le potenzialità della visione artificiale:

$ cd (tensorflow directory)/models/tutorials/image/imagenet
$ python classify_image.py

classify_image.py scarica da tensorflow.org il modello Inception-v3 addestrato alla prima esecuzione. Occorreranno circa 200 MB di spazio libero disponibile sul disco rigido. Il comando precedente classifica l'immagine di un panda (collocata in /tmp/imagenet/cropped_panda.jpg) e un'esecuzione riuscita del modello restituisce i seguenti risultati:

giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296)
custard apple (score = 0.00147)
earthstar (score = 0.00117)

È possibile provare anche altre immagini JPEG utilizzando l'argomento --image_file:

$ python classify_image.py --image_file <path to the JPEG file> 
(e.g. python classify_image.py --image_file /tmp/imagenet/cropped_pand.jpg)

CIFAR-10

La classificazione CIFAR-10 è un'attività di benchmark comune nel machine learning. L'attività consiste nella classificazione di immagini RGB da 32×32 pixel in 10 categorie (aeroplani, aeromobili, uccelli, gatti, cervi, cani, rane, cavalli, navi e autocarri).

Il modello utilizzato fa riferimento all'architettura descritta da Alex Krizhevsky, con alcune differenze nei primi layer. Si tratta di un'architettura multi-layer costituita da convoluzioni e non linearità alternanti seguite da layer totalmente collegati che conducono a un classificatore softmax.

Addestrare innanzitutto il modello:

$ cd (tensorflow directory)/models/tutorials/image/cifar10
$ python cifar10_train.py

In assenza di problemi, l'output è simile al seguente:

Riempimento della coda con 20000 immagini CIFAR prima di avviare il training. L'operazione richiederà alcuni minuti.
…… 
2017-03-06 14:59:09.089282: step 10230, loss = 2.12 (1809.1 examples/sec; 0.071 sec/batch)
2017-03-06 14:59:09.760439: step 10240, loss = 2.12 (1902.4 examples/sec; 0.067 sec/batch)
2017-03-06 14:59:10.417867: step 10250, loss = 2.02 (1931.8 examples/sec; 0.066 sec/batch)
2017-03-06 14:59:11.097919: step 10260, loss = 2.04 (1900.3 examples/sec; 0.067 sec/batch)
2017-03-06 14:59:11.754801: step 10270, loss = 2.05 (1919.6 examples/sec; 0.067 sec/batch)
2017-03-06 14:59:12.416152: step 10280, loss = 2.08 (1942.0 examples/sec; 0.066 sec/batch)
……

Congratulazioni. Hai appena addestrato il tuo primo modello.

Dopo il training, è possibile valutare il funzionamento del modello addestrato utilizzando lo script cifar10_eval.py. Lo script calcola la precisione a 1: la frequenza con cui la prima previsione corrisponde all'etichetta reale dell'immagine.

$ python cifar10_eval.py

In assenza di problemi, l'output è simile al seguente:

2017-03-06 15:34:27.604924: precision @ 1 = 0.499

UTILIZZO DI INCEPTION V3 PRE-ADDESTRATO SI UN NUOVO DATASET

Successivamente, tornare a Google Inception v3 e approfondire un caso d'uso più complesso. Inception v3 è una rete convoluzionale all'avanguardia progettata per la classificazione delle immagini. Il training di questo modello da zero è molto intensivo e può richiedere un lasso tempo che varia da diversi giorni sino ad alcune settimane. Come approccio alternativo, scaricare il modello pre-addestrato e riaddestrarlo su un altro dataset. L'operazione verrà descritta utilizzando il dataset flowers.

Scaricare il dataset flowers:

$ cd ~
$ curl -O http://download.tensorflow.org/example_images/flower_photos.tgz
$ tar xzf flower_photos.tgz
$ cd (tensorflow directory where you git clone from master)
$ python configure.py

Nota: la maggior parte delle impostazioni predefinite non richiedono modifiche. Inserire il numero di versione corretto di cuDNN e/o CUDA, se sono installate versioni differenti da quelle predefinite suggerite dal configuratore.

$ python tensorflow/examples/image_retraining/retrain.py --image_dir ~/flower_photos

Nota:

  • Se viene emesso il messaggio "...libstdc++.so.6: version `CXXABI_1.3.8' not found…", provare cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /home/ /anaconda3/lib/
  • Se viene emesso il messaggio "...import error: no module named autograd…", provare pip install autograd.

Utilizzando il modello riaddestrato:

$ bazel build tensorflow/examples/image_retraining:label_image && \
bazel-bin/tensorflow/examples/image_retraining/label_image \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--output_layer=final_result:0 \
--image=$HOME/flower_photos/daisy/21652746_cc379e0eea_m.jpg

Lo script di valutazione restituirà risultati simili ai seguenti, indicanti la precisione della classificazione:

daisy (score = 0.99735)
sunflowers (score = 0.00193)
dandelion (score = 0.00059)
tulips (score = 0.00009)
roses (score = 0.00004)

Per ulteriori dettagli sull'utilizzo del modello Inception v3 riaddestrato, seguire il link del tutorial.

Benchmark

Ciascuno dei modelli descritti nella sezione precedente produce un tempo di esecuzione/minibatch o una velocità media in esempi/secondo, che possono essere convertiti nel tempo/minibatch dividendolo per la dimensione del batch. Il grafico illustra le prestazioni previste nei sistemi con GPU NVIDIA.

data-center-gpu-ready-app-tensorflow-chart-cifar10-843-u

IMMAGINI DI TRAINING AL SECONDO PER
INCEPTION V3 SU PIÙ GPU

Il modello di Inception v3 supporta anche il training su più GPU. Il grafico seguente illustra le prestazioni previste su 1, 2 e 4 GPU Tesla per ogni nodo.

Benchmark di TensorFlow Inception

Configurazioni del sistema consigliate

Configurazione hardware

PC

Parameter
Specs

CPU Architecture

x86_64

System Memory

8-32GB

CPUs

1

GPU Model

NVIDIA®TITAN X (Pascal)

GPUs

1-2

Servers

Parameter
Specs

CPU Architecture

x86_64

System Memory

32 GB

CPUs/Node

1-2

GPU Model

Tesla® P40 and P100

GPUs/Node

1-4

Configurazione software

Software stack

Parameter
Version

OS

Unbuntu 14.04

GPU Driver

352.68 or newer

CUDA Toolkit

8.0 or newer

cuDNN Library

v5.0 or newer

Python

2.7

Crea la tua soluzione GPU ideale oggi stesso.