La GTX 745 e l’installazione di tensorflow – gpu su Windows

Autrice: Eleonora Bernasconi

 

Specifiche della scheda grafica NVIDIA GeForce GTX 745

Specifiche: https://www.geforce.com/hardware/desktop-gpus/geforce-gtx-745-oem/specifications

CUDA Cores: 384

Base Clock (MHz): 1033

Memory Clock: 1.8 Gbps

Standard Memory Config: 4 GB

Memory Interface: DDR3

Memory Bandwidth (GB/sec): 28.8

 

Figura 01 – nvidia-smi per il monitoraggio della GPU

Apri il Command Prompt ed inserisci:

cd C:\Program Files\NVIDIA Corporation\NVSMI

nvidia-smi

N.B.La percentuale di utilizzo della GPU oscilla tra il 92% e il 94%, nel Task Manager di Windows si mantiene sul 70%.

Installazione tensorflow con GPU per Windows 10

Requisiti

Python 3.5

Nvidia CUDA GPU. Vedi se la GPU è compatibile con CUDA.

Settaggio della scheda Nvidia GPU

Installa Cuda Toolkit 8.0 e cuDNN v5.1.

Download ed installazione di CUDA Toolkit

Toolkit 8.0 https://developer.nvidia.com/cuda-downloads

Esempio directory di installazione: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

Download ed installazione di cuDNN

Installa cuDNN versione 5.1 per Windows 10: https://developer.nvidia.com/cudnn

Estrai i file cuDNN ed inseriscili nella directory Toolkit.

Variabili d’ambiente

Assicurati dopo aver installato CUDA toolkit, che CUDA_HOME sia impostata nelle variabili d’ambiente, altrimenti aggiungile manualmente.

Figura 02 – Variabili d’ambiente CUDA_HOME parte 01

 

Figura 03 – Variabili d’ambiente CUDA_HOME parte 02

Installa Anaconda

Download : https://www.anaconda.com/download/

Crea un nuovo ambiente con il nome tensorflow-gpu e la versione di python 3.5.2

conda create -n tensorflow-gpu python=3.5.2

N.B. Nel caso in cui ci si ritrovasse con versioni incompatibili tra di loro, basta attivare questi comandi per risolvere il problema:

conda install -c conda-forge tensorflow-gpu

Anaconda installerà automaticamente le versioni richieste di cuda, cudNN e gli altri packages.

Figura 04 – conda install -c conda-forge tensorflow-gpu

 

activate tensorflow-gpu

Figura 05 – activate tensorflow-gpu

 

Installa tensorFlow

pip install tensorflow-gpu

Figura 06 – pip install tensorflow-gpu

Adesso hai finito ed hai installato con successo tensorflow con la GPU!

Ricordati di attivare il comando: activate tensorflow-gpu per metterti in modalità GPU!

 

Test GPU

python

import tensorflow as tf

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

 

Figura 07 – test GPU

 

Test su CIFAR-10 con 10 epoche

Tempo medio per epoca: 150 sec

Tempo totale: 25 min

Figura 08 – Test su CIFAR-10 con 10 epoche

Installazione di Keras/Tensorflow-Theano su Windows

Autore: Francesco Pugliese & Matteo Testi

 

In questo post vediamo come affrontare l’annoso problema dell’installazione su Windows del noto framework per Deep Learning “Keras” e di tutto lo stack di backend “Tensorflow / Theano“.

L’installazione parte con la necessità di scaricare il pacchetto relativo a Python 3. Scegliamo Miniconda al seguente link: https://conda.io/miniconda.html che farà apparire la seguente schermata:

 

 

Selezionare Python 3.6 e la versione di Windows a 64-bit o 32-bit. Cliccare sul pacchetto scaricato ed effetturare l’installazione lasciando tutto predefinito. Alla fine dell’installazione accettare il riavvio della macchina.

Una volta riavviato il PC, dalla box di ricerca di Windows, digitare cmd.exe e lanciare il prompt. Poi eseguire lo script c:\Users\-utente-\Miniconda3\Scripts\activate.bat che lancerà il prompt di Anaconda (sostituire -utente- con il nome dell’account specifico).

A questo punto digitare: conda install numpy scipy mkl-service m2w64-toolchain per installare:

  1. la libreria “numpy” di Python molto utile per la gestione delle matrici e degli array in generale.
  2. la libreria per il calcolo scientifico in python “scipy“.
  3. la libreria “mkl-service” di ottimizzazione, con routine matematiche vettoriali per accelerare funzioni e applicazioni mathematiche.
  4. la libreria “libpython” per Python 3 con codice per Machine Learning e per sviluppare codice efficiente. 
  5. la libreria “m2w64-toolchain” che fornisce una versione compatibile di GCC e quindi è fortemente consigliata.

Opzionali librerie sono:

  1. la libreria “nose” per il testing dei programmi Python.
  2. la libreria “nose-parameterized” per il testing parametrico.
  3. la libreria “sphinx” per creare della documentazione elegante del programma in vari formati (HTML, PDF, ePyub, ecc.).
  4. la libreria “pydot-ng” interfaccia al linguaggio di rendering grafico Graphviz’s Dot.

Una volta settato l’ambiente Python, a questo punto scaricare i driver Cuda dal seguente link:

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

Si aprirà la seguente schermata con le varie opzioni del sistema operativo e delle versioni richieste:

 

 

Scaricare la versione locale (consigliato) del file installante e procedere con l’installazione dei driver Cuda che sono le librerie di programmazione parallela della GPU Nvidia (Graphic Processing Unit) presente nella scheda grafica. Eventualmente, se necessario, accettare anche l’installazione del driver della scheda video qualora non fosse aggiornato o correttamente funzionante.

Terminata l’installazione dei driver Cuda (e degli eventuali driver della scheda video) procedere all’installazione di Theano e della libreria di supporto “libgpuarray” che è libreria per manipolare i tensori su GPU con il comando:

conda install theano pygpu

NOTA 1 Theano: Per l’installazione di Theano si raccomanda sempre l’installazione di almeno 1 punto di versione precedente di Cuda. Questo è dovuto al fatto che Theano non viene aggiornata rapidamente e questo comporta che si ottengono spesso errori di compilazione una volta terminata l’installazione di Theano con la versione più recente di Cuda. Per esempio, al tempo corrente la versione più stabile di Theano è la 0.9.0, per cui si raccomanda l’installazione di Cuda 8.0 anzichè Cuda 9.0. Esistono online degli espedienti per far funzionare perfettamente Cuda 9 con Theano 0.9 ma sono un pò tricky e portano via tempo, e il gioco alla fine non vale la candela. Si consiglia di avere una configurazione Cuda-Theano stabile come quella fornita dalle versioni raccomandate.

A questo punto è necessario installare Visual Studio che fornisce il compilatore C++ per Windows a Theano (infatti il GCC precedentemente installato si riferisce al solo compilatore C). Per fare questo scaricare Visual Studio Community dal seguente link: https://www.visualstudio.com/it/downloads/ e seguire tutti  i passaggi richiesti, cercando di installare solo i componenti essenziali per il C++.

NOTA 2 Theano: Apparentemente dopo la prossima release, Theano andrà in pensione, è spiegato dallo stesso Bengio in questo post: link Le ragioni sono tante, crediamo essenzialmente dovute alla concorrenza massiccia degli altri framework per Deep Learning (mxnet, tensorflow, deeplearning4j, gluon, solo per citarne alcuni) che sono più manutenuti. Come abbiamo mostrato Theano soffre di problemi di aggiornamento costante da parte del Team. Tuttavia riteniamo sia ancora una pietra miliare per il Deep Learning, il primo che ha introdotto la differenziazione automatica e la parallelizzazione efficiente e trasparente delle operazioni matriciali su GPU che hanno dato il là alla diffusione delle deep neural networks su GPU. Quindi riteniamo bisogni darne il giusto onore a questo eccezionale framework, e del resto fornisce ancora i suoi vantaggi in termini di versatilità e velocità se usato come backend di Keras.

NOTA Visual Studio: Anche Visual Studio risente dei problemi di compatibilità di Theano. In particolare Visual Studio 2017 genererà un’eccezione in fase di importazioine di Theano sia che si usa Cuda 9 che Cuda 8. Pertanto si consiglia di installare una verione precedente stabile come Visual Studio 2013.

Una volta installato Visual Studio è necessario compilare il file .theanorc, di configurazione di Theano, che si trova con Miniconda3 al percorso: c:\Users\-utente-\.theanorc

Compilare il .theanorc nel seguente modo, supponendo di avere installato Cuda 8 e Visual Studio 2013 :

[global]
device = gpu
floatX = float32

[cuda]
root = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

[dnn]
enabled=False

[nvcc]
compiler_bindir = C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

[lib]
cnmem = 0

Soffermiamoci un attimo su questi parametri: la sezione “device” di [global] serve ad inpostare se si desidera utilizzare la CPU o la GPU, la sezione “root” di [cuda] è necessario per definire il percorso delle librerie Cuda, mentre “compiler_bindir” di [nvcc] serve a definire il percorso del compilatore C++ di Visual Studio necessario alla compilazione dei programmi Theano. Il parametro CNMeM invece si riferisce ad una libreria (built-in di Theano) che permette di definire (attraverso un valore compreso tra 0 e 1) il modo in cui il framework di Deep Learning può gestire la memoria della GPU, ed è un modo per velocizzare la computazione delle reti neurali deep su Theano. Ad esempio, per schede video condivise con lo schermo si consiglia un paramentro intorno a 0.8, mentre per schede video stand-alone, ossia dedicate solo al Deep Learning, si consiglia un cnmem pari ad 1.

Un altro parametro molto importante per velocizzare la computazione, soprattutto per quanto riguarda la convoluzione, è il parametro “enabled” di [dnn] che permette di abilitare o disabilitare le librerie Nvidia CuDNN. E’ in pratica una libreria che fornisce primitive ottimizzate per le deep neural networks, permettendo di velocizzare il training, il testing ed anche ridurre il consumo di memoria. Per installare le CuDNN è necessario andare a questo link: https://developer.nvidia.com/cudnn e cliccare sul tasto download e procedere allo scarico (potrebbe essere necessaria la registrazione alla membership di Nvidia), dovrebbe aprirsi la seguente schermata:

 

 

NOTA cuDNN: anche qui come nei casi precedenti si consiglia di non scaricare l’ultima versione di cuDNN ma una o due precedenti in quanto rischia di non essere “vista” ne da Cuda 8 e ne da Theano 0.9, in tal caso si consiglia la versione cuDNN 6.0. E con Theano 0.9 si potrebbe comunque avere un warning indicante il fatto che la versione di cuDNN è molto recente e potrebbe creare eventuali problemi. Abbiamo verificato anche problemi di incompatibilità tra l’ultima versione di cuDNN e TensorFlow.

Scompattando il file scaricato, si otterranno 3 cartelle: bin, lib e include. Tutto quello che bisogna fare è copiare il contenuto delle cartelle nelle omonime cartelle dentro la directory di Cuda, ossia dentro: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

Dunque copiare cudnn64_6.dll dentro la bin del path Cuda, copiare cudnn.h dentro include e infine copiare cudnn.lib dentro lib.

Una volta installato cuDNN, procedere con l’installazione di Keras attraverso pip:

pip install keras

L’istruzione installerà tutte le dipendenze ed anche l’ultima versione (attualmente Keras 2.0.9). Per settare Theano come backend di Keras, andare dentro la cartella: c:\users\-utente-\.keras ed editare il file keras.json nel seguente modo, ovvero impostando “theano” alla voce “backend”.

{
“floatx”: “float32”,
“epsilon”: 1e-07,
“backend”: “theano”,
“image_data_format”: “channels_last”
}

Per testare che tutto vada bene, avviare il prompt di anaconda, e lanciare python. Dentro il prompt di python digitare: import keras. Se tutto è andato per il verso giusto dovrebbe comparire la seguente schermata:

 

 

Notare il warning prima menzionato a proposito delle cuDNN e comunicato da Theano stesso: se si dovessero incontrare i problemi citati  effettuare il downgrade delle cuDNN alla versione 5.1 come raccomandato dallo stesso team. L’uscita della versione stabile di Theano 0.10 dovrebbe risolvere tutti questi problemi di compatibilità.

In ogni caso ci risulta che l’ambiente configurato con Keras e Theano in questo modo funziona perfettamente su una varietà di modelli che abbiamo addestrato e testato. Utilizziamo Theano perchè si presenta spesso più veloce di TensorFlow su alcuni addestramenti di Computer Vision.

In ogni caso se si volesse utilizzare TensorFlow come backend è necessario installarlo. Per installare tensorflow per GPU è necessario il seguente comando:

pip install –upgrade tensorflow-gpu

Questo installerà l’ultima versione (1.4.0) di Tensorflow-gpu. Per provarlo con Keras sostituire “theano” con la stringa “tensorflow” nel file keras.json, riavviare il prompt di anaconda e rifare import keras.

NOTA TensorFlow: non è supportato su piattaforme a 32 bit, la procedura di installazione vi scaricherà solo il wheel relativo al framework a 64 bit. Inoltre per scaricare la versione per cpu, dovrete solo specificare: pip install –upgrade tensorflow.

Se tutto è andato per il verso giusto, questa volta dovrebbe comparire TensorFlow come backend di keras:

 

Altri pacchetti utili, che consigliamo per lavorare con Keras sono:

  1. scikit-image: Una libreria molto utile di image processing in python, che permette tra le altre cose di salvare matrici e tensori in un immagine jpeg o tanti altri formati supportati. Installabile con: conda install scikit-image.
  2. gensim: La libreria per i word embeddings che implementa tra le altre cose l’algoritmo word2vec. Installabile con: conda install gensim.
  3. h5py: La libreria interfaccia al formato di salvataggio HDF5 di Pythonic, necessaria per salvare i modelli addestrati su disco in Keras. Installabile con pip install h5py.

A questo punto l’ambiente Keras/Tf-Th su Windows è pronto all’uso, per testare il vostro codice e i vostri modelli sfruttando nativamente la GPU.

Buon lavoro!

Al prossimo tutorial.

Un saluto da Deep Learning Italia.

 

Per info e chiarimenti ecco le nostre email:

Francesco Pugliese – f.pugliese@deeplearningitalia.com

Matteo Testi – m.testi@deeplearningitalia.com

 

 

 

 

 

 

 

La creazione di tensori in Pytorch

Autore: Andrea Mercuri

Come negli altri framework per il deep learning, anche in PyTorch il tipo fondamentale è il tensore. Formulando i calcoli che devono essere effettuati da una rete neurale come operazioni tensoriali otteniamo due vantaggi: usiamo un formalismo estremamente compatto e rendiamo possibile alla GPU parallelizzare i calcoli.
I tensori possono risiedere nella RAM principale del computer ed essere processati dalla CPU o nella RAM di una scheda video ed essere processati da una GPU. Questi ultimi sono identificati da un tipo differente dai primi. Segue l’elenco di tutti i tipi di tensori presenti in PyTorch.

Tipo Tensore CPU Tensore GPU
32-bit virgola mobile torch.FloatTensor torch.cuda.FloatTensor
64-bit virgola mobile torch.DoubleTensor torch.cuda.DoubleTensor
16-bit virgola mobile torch.HalfTensor torch.cuda.HalfTensor
8-bit intero (senza segno) torch.ByteTensor torch.cuda.ByteTensor
8-bit intero (con segno) torch.CharTensor torch.cuda.CharTensor
16-bit intero (con segno) torch.ShortTensor torch.cuda.ShortTensor
32-bit intero (con segno) torch.IntTensor torch.cuda.IntTensor
64-bit intero (con segno) torch.LongTensor torch.cuda.LongTensor

Come prima cosa importiamo PyTorch.

 

import torch

 

Possiamo creare un tensore non inizializzato invocando il costruttore di uno dei tipi elencati sopra.

 

x = torch.FloatTensor(3, 2)
print(x)
1.00000e-25 *
&nbsp&nbsp9.9872  0.0000
&nbsp&nbsp9.9872  0.0000
&nbsp&nbsp0.0000  0.0000
&nbsp&nbsp[torch.FloatTensor of size 3x2]

 

In questo caso il tensore è creato nella RAM principale. Se invece vogliamo creare un tensore nella GPU corrente dobbiamo utilizzare uno dei tipi cuda.

x = torch.cuda.FloatTensor(3, 2)
print(x)
nan nan
nan nan
nan nan
[torch.cuda.FloatTensor of size 3x2 (GPU 0)]

In questo caso veniamo informati che il tensore si trova sulla prima GPU. Le GPU presenti
sulla macchina sono numerate con numeri interi a partire da 0.
Possiamo creare tensori da liste Python

>torch.FloatTensor([[1,2,3],[4,5,6]])
1  2  3
4  5  6
[torch.FloatTensor of size 2x3]

o da array numpy.

x_np = np.array([1,2,3,4], dtype=np.float32) x = torch.FloatTensor(x_np)

Otteniamo lo stesso risultato col metodo from_numpy.

x = torch.from_numpy(x_np)

Notiamo che l’array numpy e il tensore PyTorch condividono i dati. Se modifichiamo uno dei due, l’altro subisce le medesime modifiche.

x[0] = 0
print(x_np)
[ 0.,  2.,  3.,  4.]
print(x)

Possiamo creare tensori da altri tensori.

y = torch.FloatTensor(x)
print(y)
0
2
3
4
[torch.FloatTensor of size 4]

Anche in questo caso il tensore creato condivide i dati con il tensore originale.
Possiamo creare tensori di zeri.

torch.zeros(3,2)
0  0
0  0
0  0
[torch.FloatTensor of size 3x2]

Possiamo creare tensori di numeri casuali estratti da una certa distribuzione, ad esempio uniforme sull’intervallo [0,1].

torch.rand(2, 3) 0.1256 0.0406 0.2072 0.2479 0.0515 0.093 
[torch.FloatTensor of size 2x3]

Ogni tensore vive nella memoria principale o in quella di una scheda video. Due tensori possono essere gli operandi di una medesima operazione solo se risiedono nella stessa memoria (e in questo caso il risultato risiede ancora nella stessa memoria). Se proviamo, invece, a combinare (ad esempio sommandoli) un tensore che risiede nella RAM principale e uno che sta su una scheda video (o due tensori in due schede video differenti) otteniamo un’eccezione.

xcpu = torch.FloatTensor(3,2) 
xgpu = torch.cuda.FloatTensor(3,2) 
xcpu + xgpu
TypeError Traceback (most recent call last) in () ----> 1 xcpu + xgpu …

Se vogliamo ottenere una copia di un tensore x sulla prima GPU possiamo utilizzare il metodo cuda.

y = x.cpu()

Se il tensore è già sulla prima GPU viene ritornato il tensore originale.
Invece per ottenere una copia di un tensore x sulla RAM principale utilizziamo il metodo cpu.

y = x.type(torch.ByteTensor)

Possiamo convertire un tensore ad un tipo differente passando al metodo type il tipo di destinazione.

y = x.byte()

Otteniamo lo stesso risultato chiamando uno specifico metodo di conversione.

y = x.type(torch.cuda.ByteTensor)

Se oltre a cambiare il tipo vogliamo copiare il tensore sulla GPU corrente dobbiamo passare al metodo type un tipo cuda

y = x.type(torch.cuda.ByteTensor)

oppure scrivere

y = x.byte().cuda()

Per rendere corrente la seconda GPU utilizziamo set_device.

torch.cuda.set_device(1)

Se ora scriviamo

torch.cuda.current_device()

otteniamo 1 come valore di ritorno. Questo significa che ora la GPU corrente è la seconda e non più la prima e che, ad esempio, quando utilizziamo il metodo cuda su un tensore ne creiamo una copia sulla seconda GPU invece che sulla prima.
È anche possibile utilizzare un context manager per cambiare temporaneamente la GPU corrente.
Ad esempio scrivendo

with torch.cuda.device(1):
 &nbsp&nbsp
x1 = torch.cuda.FloatTensor(2,3) 
x2 = torch.cuda.FloatTensor(2,3)

quando la GPU corrente è quella di indice 0, x1 viene creato sulla seconda GPU (indice 1), x2 sulla prima (indice 0).
Tutte le funzionalità relative alla creazione di tensori sono contenute nei package torch, torch.cuda e nella classe torch.Tensor. Nei prossimi tutorial continueremo l’esplorazione dei tensori.
Riferimenti