theanoAan de slag met theano


Opmerkingen

Theano is een pythonbibliotheek, die symbolische uitdrukkingen definieert en evalueert over tensor-variabelen. Heeft verschillende toepassingen, maar de meest populaire is diep leren.

Installatie of instellingen

Gedetailleerde instructies voor het installeren of installeren van theano.

Theano installeren en de GPU configureren op Ubuntu 14.04

U kunt de volgende instructies gebruiken om Theano te installeren en de GPU te configureren (uitgaande van een nieuw geïnstalleerde Ubuntu 14.04):

# Install Theano
sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git
sudo pip install Theano

# Install Nvidia drivers, CUDA and CUDA toolkit, following some instructions from http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb # Got the link at https://developer.nvidia.com/cuda-downloads
sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
sudo apt-get update
sudo apt-get install cuda

sudo reboot
 

Op dat moment zou het uitvoeren van nvidia-smi moeten werken, maar het uitvoeren van nvcc werkt niet.

# Execute in console, or (add in ~/.bash_profile then run "source ~/.bash_profile"):
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
 

Op dat moment zouden zowel nvidia-smi als nvcc moeten werken.

Om te testen of Theano de GPU kan gebruiken:

Kopieer en plak het volgende in gpu_test.py :

# Start gpu_test.py
# From http://deeplearning.net/software/theano/tutorial/using_gpu.html#using-gpu
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in xrange(iters):
    r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')
# End gpu_test.py
 

en voer het uit:

THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32' python gpu_test.py
 

die zou moeten terugkeren:

f@f-Aurora-R4:~$ THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32' python gpu_test.py
Using gpu device 0: GeForce GTX 690
[GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.658292 seconds
Result is [ 1.23178029  1.61879349  1.52278066 ...,  2.20771813  2.29967761
  1.62323296]
Used the gpu
 

Om uw CUDA-versie te kennen:

​nvcc -V
 

Voorbeeld:

username@server:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
 

CuDNN toevoegen

CuDNN toevoegen (instructies van http://deeplearning.net/software/theano/library/sandbox/cuda/dnn.html) :

  1. Download cuDNN van https://developer.nvidia.com/rdp/cudnn-download (registratie vereist, die gratis is)
  2. tar -xvf cudnn-7.0-linux-x64-v3.0-prod.tgz
  3. Doe een van de volgende dingen

Optie 1: kopieer de *.h bestanden naar CUDA_ROOT/include en de *.so* -bestanden naar CUDA_ROOT/lib64 (standaard is CUDA_ROOT /usr/local/cuda op Linux).

sudo cp cuda/lib64/* /usr/local/cuda/lib64/
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
 

Optie 2:

export LD_LIBRARY_PATH=/home/user/path_to_CUDNN_folder/lib64:$LD_LIBRARY_PATH
export CPATH=/home/user/path_to_CUDNN_folder/include:$CPATH
export LIBRARY_PATH=/home/user/path_to_CUDNN_folder/lib64:$LD_LIBRARY_PATH
 

Theano detecteert standaard of het cuDNN kan gebruiken. Als zo, zal het het gebruiken. Zo niet, dan zullen Theano-optimalisaties geen cuDNN-ops introduceren. Theano werkt dus nog steeds als de gebruiker ze niet handmatig heeft ingevoerd.

Om een foutmelding te krijgen als Theano cuDNN niet kan gebruiken, gebruikt u deze Theano-vlag: optimizer_including=cudnn .

Voorbeeld:

THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,optimizer_including=cudnn' python gpu_test.py
 

Om uw cuDNN-versie te kennen:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
 

CNMeM toevoegen

De CNMeM-bibliotheek is een "Eenvoudige bibliotheek om de Deep Learning-frameworks te helpen het CUDA-geheugen te beheren.".

# Build CNMeM without the unit tests
git clone https://github.com/NVIDIA/cnmem.git cnmem
cd cnmem
mkdir build
cd build
sudo apt-get install -y cmake
cmake ..
make

# Copy files to proper location
sudo cp ../include/cnmem.h /usr/local/cuda/include
sudo cp *.so /usr/local/cuda/lib64/
cd ../..
 

Om met Theano te gebruiken, moet u de vlag lib.cnmem toevoegen. Voorbeeld:

THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,lib.cnmem=0.8,optimizer_including=cudnn' python gpu_test.py
 

De eerste uitvoer van het script moet zijn:

Using gpu device 0: GeForce GTX TITAN X (CNMeM is enabled with initial size: 80.0% of memory, cuDNN 5005)
 

lib.cnmem=0.8 betekent dat het tot 80% van de GPU kan gebruiken.

CNMeM heeft naar verluidt een aantal interessante snelheidsverbeteringen opgeleverd en wordt ondersteund door Theano, Torch en Caffee.

Theano - bron 1 :

De snelheid is afhankelijk van vele factoren, zoals de vormen en het model zelf. De snelheid gaat van 0 naar 2x sneller.

Theano - bron 2 :

Als je de vlag Theano allow_gc niet wijzigt, kun je een 20% hogere snelheid verwachten op de GPU. In sommige gevallen (kleine modellen) zagen we een snelheid van 50% stijgen.


Gebruikelijke problemen:

Theano op meerdere CPU-cores draaien

U kunt Theano op meerdere CPU-cores uitvoeren met de OMP_NUM_THREADS=[number_of_cpu_cores] .

Voorbeeld:

OMP_NUM_THREADS=4 python gpu_test.py 
 

Het script theano/misc/check_blas.py geeft informatie over welke BLAS wordt gebruikt:

cd [theano_git_directory]
OMP_NUM_THREADS=4 python theano/misc/check_blas.py
 

Je eerste theano-programma

In dit voorbeeld zullen we functies compileren die som en verschil berekenen gegeven twee reële getallen.

from __future__ import print_function
import theano
import theano.tensor as T

#define two symbolic scalar
s_x = T.fscalar()
s_y = T.fscalar()

#compute something
s_sum = s_x + s_y
s_diff = s_x - s_y

#compile a function that adds two number
#theano will call system compiler at here
fn_add = theano.function(inputs=[s_x, s_y], outputs=s_sum)
fn_diff = theano.function(inputs=[s_x, s_y], outputs=s_diff)

#call the compiled functions
print(fn_add(2., 2.)) #4.
print(fn_diff(2., 2.)) #0.