Оглавление В предыдущей статье мы установили Visual Studio, CUDA, MinGW и Python. Теперь давайте установим Theano. Theano 0.8.2 Версия 0.8.2
В предыдущей статье мы установили Visual Studio, CUDA, MinGW и Python. Теперь давайте установим Theano.
Версия 0.8.2? Почему бы просто не установить последнюю версию Theano, поскольку она, очевидно, должна работать лучше, не так ли? Но мы ставим эту версию потому, что так будет проще воспроизводить чужие исследования и наработки. Если ваши коллеги по работе или товарищи по Kaggle команде установят последнюю версию отличающуюся от вашей это увеличит вероятность того, что даже если вы будете использовать те же входные данные, вы получите разные результаты. Только по этой причине, мы настоятельно рекомендуем применять только релизы.
Клонируйте стабильный релиз Theano (0.8.2) на локальный компьютер из GitHub, используя следующие команды:
$ cd /c/toolkits
$ git clone https://github.com/Theano/Theano.git theano-0.8.2 --branch rel-0.8.2
Эти команды должны склонировать Theano 0.8.2 в c:\toolkits\theano-0.8.2:
Установите его следующим образом:
$ cd /c/toolkits/theano-0.8.2
$ python setup.py install --record installed_files.txt
Список установленных файлов можно посмотреть тут.
Проверить установку Theano в списке установленных пакетов Anaconda можно так:
$ conda list | grep -i theano
Если мы собираемся использовать GPU, то зачем нам устанавливать CPU оптимизированную библиотеку линейной алгебры? В нашей сборке, большая часть вычислений для глубокого обучения будет осуществляется с помощью GPU, и это правильно, но процессор также не будет простаивать. Большая часть конкурсов Kaggle на основе изображений требует их предварительной обработки, например нормализации. Также, довольно часто требуется применение фильтров (удаление шума, выравнивания гистограммы и т.д.). Вы, конечно, можете использовать GPU для этой цели и сохранить результаты в файл. Но на практике, однако, эти операции часто выполняются параллельно на процессоре, в то время как GPU занят обучением весов глубокой нейронной сети. По этой причине мы настоятельно рекомендуем установить библиотеку OpenBLAS.
Согласно документации Theano, многопоточная библиотеки OpenBLAS работает гораздо лучше, чем не оптимизированная стандартная BLAS (Basic Linear Algebra Subprograms) библиотека, поэтому мы используем именно ее.
Загрузите OpenBLAS отсюда и распакуйте файлы в c:\toolkits\openblas-0.2.14-int32Создайте две переменные окружения:
floatX=float32,device=cpu,lib.cnmem=0.8,blas.ldflags=-LC:/toolkits/openblas-0.2.14-int32/bin -lopenblas
floatX=float32,device=gpu,dnn.enabled=False,lib.cnmem=0.8,blas.ldflags=-LC:/toolkits/openblas-0.2.14-int32/bin -lopenblas
Theano отслеживает только переменную THEANO_FLAGS. Теперь все что нам нужно сделать, чтобы сказать Theano использовать CPU или GPU, это установить THEANO_FLAGS в THEANO_FLAGS_CPU или THEANO_FLAGS_GPU. Вы можете проверить, что эти переменные среды были успешно добавлены с помощью следующей команды:
$ env | grep -i theano
Замечание: Флаг THEANO_FLAGS_GPU_DNN мы рассмотрим в разделе по cuDNN.
Для этого используем программу из документации по Theano.
import numpy as np
import time
import theano
print('blas.ldflags=', theano.config.blas.ldflags)
A = np.random.rand(1000, 10000).astype(theano.config.floatX)
B = np.random.rand(10000, 1000).astype(theano.config.floatX)
np_start = time.time()
AB = A.dot(B)
np_end = time.time()
X, Y = theano.tensor.matrices('XY')
mf = theano.function([X, Y], X.dot(Y))
t_start = time.time()
tAB = mf(A, B)
t_end = time.time()
print("numpy time: %f[s], theano time: %f[s] (times should be close when run on CPU!)" % (
np_end - np_start, t_end - t_start))
print("Result difference: %f" % (np.abs(AB - tAB).max(), ))
Сохраните приведенный выше код в файл с именем openblas_test.py в текущем каталоге и выполните следующие команды:
$ THEANO_FLAGS=$THEANO_FLAGS_CPU
$ python openblas_test.py
Примечание: Если вы получаете ошибку global name 'CVM' is not defined, то это может быть потому, что неправильно установлен THEANO_FLAGS_CPU. Попробуйте поменять floatX = float32 и floatX = float64.
Для этого выполним следующую программу из документации Theano и сравним производительность GPU установки по сравнению с использованием Theano в CPU-режиме. Сохраните код в файл с именем cpu_gpu_test.py в текущем каталоге и выполните команды:
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 range(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')
Во-первых, давайте посмотрим, какие результаты мы получим от Theano в режиме CPU:
$ THEANO_FLAGS=$THEANO_FLAGS_CPU
$ python cpu_gpu_test.py
Далее, давайте выполним ту же программу на GPU:
$ THEANO_FLAGS=$THEANO_FLAGS_GPU
$ python cpu_gpu_test.py
Отлично, вот мы закончили с настройкой Theano 0.8.2.