theanoНачало работы с theano


замечания

Theano - это библиотека python, которая обрабатывает определение и оценку символических выражений над тензорными переменными. Имеет различное применение, но наиболее популярным является глубокое обучение.

Установка или настройка

Подробные инструкции по установке или установке anano.

Установка Theano и настройка графического процессора на Ubuntu 14.04

Вы можете использовать следующие инструкции для установки Theano и настройки графического процессора (предположим, что недавно установлен 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
 

В этот момент работа nvidia-smi должна работать, но запуск nvcc не будет работать.

# 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
 

В этот момент должны работать как nvidia-smi nvcc и nvcc .

Чтобы проверить, может ли Theano использовать графический процессор:

Скопируйте-вставьте в 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
 

и запустите его:

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

который должен вернуться:

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
 

Чтобы узнать свою версию CUDA:

​nvcc -V
 

Пример:

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

Чтобы добавить cuDNN (инструкции из http://deeplearning.net/software/theano/library/sandbox/cuda/dnn.html) :

  1. Загрузите cuDNN с https://developer.nvidia.com/rdp/cudnn-download (нужна регистрация, которая бесплатна)
  2. tar -xvf cudnn-7.0-linux-x64-v3.0-prod.tgz
  3. Выполните одно из следующих действий

Вариант 1. Скопируйте *.h файлы в CUDA_ROOT/include и *.so* файлы в CUDA_ROOT/lib64 (по умолчанию CUDA_ROOT является /usr/local/cuda в Linux).

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

Вариант 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 обнаружит, может ли он использовать cuDNN. Если это так, он будет использовать его. Если нет, оптимизация Anano не будет вводить операции cuDNN. Поэтому Theano все равно будет работать, если пользователь не представит их вручную.

Чтобы получить сообщение об ошибке, если Theano не может использовать cuDNN, используйте этот флаг Theano: optimizer_including=cudnn .

Пример:

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

Чтобы узнать свою версию cuDNN:

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

Добавление CNMeM

Библиотека CNMeM представляет собой «Простую библиотеку, которая помогает платформам Deep Learning управлять памятью CUDA».

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

Для использования с Theano вам нужно добавить флаг lib.cnmem . Пример:

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

Первый вывод скрипта должен быть следующим:

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

lib.cnmem=0.8 означает, что он может использовать до 80% GPU.

Сообщается, что CNMeM дает некоторые интересные улучшения скорости и поддерживается Theano, Torch и Caffee.

Theano - источник 1 :

Скорость зависит от многих факторов, таких как формы и сама модель. Скорость увеличивается с 0 до 2x быстрее.

Теано - источник 2 :

Если вы не измените флаг Theano allow_gc, вы можете ожидать, что на GPU на 20% ускорится. В некоторых случаях (малые модели) мы увидели 50-процентную скорость.


Общие вопросы:

Запуск Theano на нескольких ядрах процессора

Вы можете запустить Theano на нескольких ядрах процессора с помощью OMP_NUM_THREADS=[number_of_cpu_cores] .

Пример:

OMP_NUM_THREADS=4 python gpu_test.py 
 

Сценарий theano/misc/check_blas.py выводит информацию о том, какой BLAS используется:

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

Ваша первая программа anano

В этом примере мы скомпилируем функции, вычисляющие сумму и разность, заданные двумя действительными числами.

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.