theanoErste Schritte mit Theano


Bemerkungen

Theano ist eine Python-Bibliothek, die die Definition und Auswertung von symbolischen Ausdrücken über Tensor-Variablen handhabt. Hat verschiedene Anwendungen, aber am populärsten ist tiefes Lernen.

Installation oder Setup

Detaillierte Anweisungen zum Einrichten oder Installieren des Geräts.

Theano installieren und GPU unter Ubuntu 14.04 konfigurieren

Sie können die folgenden Anweisungen verwenden, um Theano zu installieren und die GPU zu konfigurieren (vorausgesetzt, es wird ein neu installiertes Ubuntu 14.04 verwendet):

# 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
 

Zu diesem Zeitpunkt sollte nvidia-smi funktionieren, nvcc jedoch nicht.

# 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
 

Zu diesem Zeitpunkt sollten sowohl nvidia-smi als auch nvcc funktionieren.

So testen Sie, ob Theano die GPU verwenden kann:

Kopieren Sie folgendes 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
 

und führe es aus:

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

was sollte zurückkehren:

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
 

So kennen Sie Ihre CUDA-Version:

​nvcc -V
 

Beispiel:

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 hinzufügen

CuDNN hinzufügen (Anweisungen von http://deeplearning.net/software/theano/library/sandbox/cuda/dnn.html) :

  1. Laden Sie cuDNN von https://developer.nvidia.com/rdp/cudnn-download herunter (Registrierung ist kostenlos)
  2. tar -xvf cudnn-7.0-linux-x64-v3.0-prod.tgz
  3. Führen Sie einen der folgenden Schritte aus

Option 1: Kopieren Sie die *.h Dateien nach CUDA_ROOT/include und die *.so* -Dateien nach CUDA_ROOT/lib64 (standardmäßig ist CUDA_ROOT /usr/local/cuda unter Linux).

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

Option 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
 

Standardmäßig erkennt Theano, ob cuDNN verwendet werden kann. Wenn ja, wird es verwendet. Andernfalls führen Theano-Optimierungen keine cuDNN-Operationen ein. Theano funktioniert also weiterhin, wenn der Benutzer sie nicht manuell eingeführt hat.

Wenn Theano cuDNN nicht verwenden kann, verwenden Sie das folgende Theano-Flag: optimizer_including=cudnn .

Beispiel:

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

So kennen Sie Ihre cuDNN-Version:

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

CNMeM hinzufügen

Die CNMeM-Bibliothek ist eine "einfache Bibliothek, die den Deep Learning-Frameworks beim Verwalten des CUDA-Speichers hilft."

# 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 ../..
 

Zur Verwendung mit Theano müssen Sie das Flag lib.cnmem hinzufügen. Beispiel:

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

Die erste Ausgabe des Skripts sollte sein:

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

lib.cnmem=0.8 bedeutet, dass bis zu 80% der GPU verwendet werden können.

Es wurde berichtet, dass CNMeM einige interessante Geschwindigkeitsverbesserungen bietet und wird von Theano, Torch und Caffee unterstützt.

Theano - Quelle 1 :

Die Geschwindigkeit hängt von vielen Faktoren ab, wie den Formen und dem Modell selbst. Die Beschleunigung geht von 0 bis 2x schneller.

Theano - Quelle 2 :

Wenn Sie das Theano-Flag allow_gc nicht ändern, können Sie mit einer Beschleunigung der GPU von 20% rechnen. In einigen Fällen (kleine Modelle) haben wir eine Beschleunigung von 50% festgestellt.


Häufige Probleme:

Theano auf mehreren CPU-Kernen ausführen

Sie können Theano auf mehreren CPU-Kernen mit dem OMP_NUM_THREADS=[number_of_cpu_cores] .

Beispiel:

OMP_NUM_THREADS=4 python gpu_test.py 
 

Das Skript theano/misc/check_blas.py gibt Informationen darüber aus, welches BLAS verwendet wird:

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

Dein erstes Theano-Programm

In diesem Beispiel werden Funktionen kompiliert, die Summe und Differenz bei zwei reellen Zahlen berechnen.

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.