Всем привет! Вот простое руководство, которое поможет вам начать разработку проектов глубокого обучения. Работа над глубоким обучением может быть довольно пугающей, особенно с чего начать. Я потратил много времени на создание и настройку машин для глубокого обучения. Но каждый раз я чувствовал, что мне нужен простой справочник, которому я мог бы следовать. Я попытался создать эту простую ссылку и поделиться ею с вами.

То, что может сделать один дурак, может сделать другой. - Древняя обезьянья пословица

Пачкать руки - лучший способ учиться, как и в случае с глубоким обучением. Так что мне всегда не нравилось то, что мешает. Например, создание конфигураций и настройка. Существует большой барьер для начала работы над проектами глубокого обучения. Кроме того, мы должны сосредотачиваться на идеях, а не на окружающей среде. Это очень важно, особенно для исследований.

Идея - это кое-что, но ее нужно доказывать, а для этого нужны твердые результаты. Мы должны иметь возможность как можно проще перейти от идеи к результатам. Мы можем потерпеть неудачу, но мы сможем переоценить нашу идею и, наконец, увидеть, работает она или нет.

А теперь приступим. Мы настроим машину с нуля для глубокого обучения и, в конце концов, запустим на ней простую нейронную сеть.

Машина

У меня был компьютер SuperMicro с 3 графическими процессорами Nvidia GTX 1080 с архитектурой Pascal. Эта рабочая станция поставлялась со всем установленным оборудованием, таким как графические процессоры и жесткие диски. Таким образом, дополнительной установки не потребовалось. Тем не менее, был один свободный слот, поэтому я установил на него еще один графический процессор GTX 1080, но не имеет значения, сколько у вас графических процессоров. Если у вас есть хотя бы один графический процессор, это руководство доведет вас до конца. Мы будем использовать Ubuntu 16.04. Но я не буду вдаваться в подробности, как его установить, поскольку мы сосредоточимся на создании нашей первой глубокой нейронной сети с нуля.

Основы

Умножение матриц важно. Если вы работаете с глубоким обучением, почти все зависит от умножения матриц.

Итак, давайте начнем с основ и начнем с них. BLAS существенно улучшает умножение матриц. Здесь мы воспользуемся OpenBLAS и проведем несколько тестов с NumPy. Теперь откройте терминал (вы можете сделать это, одновременно нажав Ctrl + Alt + T) и вставьте следующие строки по одной (без копирования $), нажав Ctrl + Shift + V в терминал.

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential cmake cmake g++ gfortran unzip wget pkg-config openjdk-8-jdk git python-dev python3-dev python-pip python3-pip swig python-wheel libcurl3-dev
$ sudo apt-get install libopenblas-dev liblapack-dev
$ sudo apt-get install python-numpy python3-numpy

Мы установили несколько пакетов и NumPy с поддержкой OpenBLAS, что немного ускорит работу при запуске нашей сети. А теперь посмотрим, все ли мы сделали правильно.

Вот простой скрипт для запуска некоторых тестов. Вы также можете скопировать его снизу.

Вам необходимо сохранить его на свой компьютер в своем рабочем каталоге. Выполните следующую команду, чтобы узнать, где находится ваш рабочий каталог.

$ pwd

Это должно напечатать путь, над которым вы в настоящее время работаете. Как только вы сохраните тестовый скрипт в этом каталоге, мы сможем запускать простые тесты.

$ OMP_NUM_THREADS=1 python test_numpy_so_bad.py

Приведенная выше команда должна напечатать несколько результатов, подобных следующему. Но мы не ищем точных цифр.

NumPy Version: 1.11.0
Max int: 9223372036854775807
BLAS info:
 * libraries [‘openblas’, ‘openblas’]
 * library_dirs [‘/usr/lib’]
 * define_macros [(‘HAVE_CBLAS’, None)]
 * language c
Dot product of two (1000,1000) matrices took 82.5 ms
Dot product of two (2000) dimensional vectors took 2.62 us
SVD of (1000,2000) matrix took 1.194 s
Eigen decomposion of (1000,1000) matrix took 1.370 s

Давайте проведем тот же эксперимент, на этот раз с большим количеством потоков.

$ OMP_NUM_THREADS=8 python test_numpy_so_bad.py

Все идет нормально. Результаты должны занять меньше времени по сравнению с нашим предыдущим тестом.

NumPy Version: 1.11.0
Max int: 9223372036854775807
BLAS info:
 * libraries [‘openblas’, ‘openblas’]
 * library_dirs [‘/usr/lib’]
 * define_macros [(‘HAVE_CBLAS’, None)]
 * language c
Dot product of two (1000,1000) matrices took 28.4 ms
Dot product of two (2000) dimensional vectors took 2.59 us
SVD of (1000,2000) matrix took 0.698 s
Eigen decomposion of (1000,1000) matrix took 1.219 s

Теперь, когда у нас есть базовая настройка, мы можем перейти к использованию нашего графического процессора (ов). Раньше мы особо не говорили об этом, но графические процессоры намного мощнее процессоров, поскольку у них много ядер. Таким образом, очень важно настроить ваши графические процессоры для получения полной производительности.

Драйверы Nvidia

У нас должны быть установлены последние версии драйверов Nvidia. Но перед этим давайте сначала найдем наши модели видеокарт.

$ lspci | grep -i nvidia

В нем должны быть указаны модели вашей видеокарты. Перейдите на сайт драйверов Nvidia и найдите последние стабильные драйверы для вашей модели (ей) видеокарты в зависимости от вашей ОС. Следующим шагом будет добавление репозитория PPA Проприетарные драйверы графического процессора. На момент написания последней стабильной версии драйвера для моего графического процессора (ей) была 378. Но для вас она может отличаться от этой версии. В этом случае вам следует заменить 378 в следующих командах более новой версией.

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-378

Теперь мы должны перезагрузить наш компьютер. Если мы все сделали правильно, компьютер должен загрузиться нормально.

$ sudo shutdown -r now

Мы почти закончили, но давайте проверим, правильно ли мы настроили драйверы Nvidia. Теперь давайте запустим в терминале следующую команду.

$ cat /proc/driver/nvidia/version

Здесь мы должны увидеть правильную версию драйвера, который намеревались установить.

CUDA

CUDA позволяет запускать наши модели на графических процессорах, поэтому нам необходимо установить его. В противном случае мы ограничили бы работу наших моделей только на процессорах. Теперь перейдите на веб-сайт CUDA и загрузите правильную версию CUDA для вашей системы. Но не забудьте вернуться сюда, мы еще не закончили.

Теперь имя файла должно выглядеть следующим образом. Но вы можете изменить его в соответствии со своими настройками, которые я пометил как полужирный.

$ sudo dpkg -i cuda-repo-ubuntu1604*amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

Если бы мы могли установить CUDA правильно, по следующему пути должен быть каталог:

/usr/local/cuda

Теперь мы должны добавить CUDA к переменным среды.

$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"' >> ~/.bashrc
$ echo 'export CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
$ source ~/.bashrc

Прежде чем двигаться дальше, убедитесь, что все правильно.

$ nvcc -V

Это должно распечатать информацию о драйвере компилятора CUDA и его версию. Давайте еще раз перезапустим нашу машину.

$ sudo shutdown -r now

cuDNN

Пока мы закончили установку CUDA. Теперь мы собираемся установить cuDNN. Это библиотека для ускорения работы фреймворков глубокого обучения, таких как Theano и Tensorflow. Таким образом, если вы пропустите этот шаг, это еще не конец света. Но это нам очень поможет, когда мы научимся тренировать очень глубокие сети, так что давайте остановимся на некоторое время и выполним следующие шаги. Кроме того, нам особо нечего делать.

Во-первых, мы должны зарегистрироваться для участия в Программе разработчиков ускоренных вычислений Nvidia. После регистрации вы должны войти в систему и загрузить последнюю версию cuDNN. Текущая версия v5.1, но вы можете изменить ее на более новую версию, которую я выделил полужирным шрифтом в следующей строке. Следующим шагом является извлечение содержимого cuDNN в / usr / local / cuda, и для этого мы выполняем следующие команды.

$ sudo tar -xzvf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

Теперь мы закончили. Посмотрим, как у нас получилось.

$ nvidia-smi

Теперь вы должны увидеть здесь все свои графические процессоры. Если нет, то что-то пошло не так. Кстати, эта команда очень удобна, если вы хотите проверить показатели производительности вашего графического процессора (ов).

Здесь я вижу все свои графические процессоры, а это значит, что теперь мы можем двигаться дальше.

virtualenv

Virtualenv - это инструмент, который мы будем использовать для создания изолированных сред Python. Это позволяет множеству проектов Python сосуществовать на одной машине.

$ sudo pip install virtualenv

virtualenvwrapper

Virtualenvwrapper - это набор расширений к инструменту virtualenv. Это упрощает работу с виртуальными средами.

$ sudo pip install virtualenvwrapper

Теперь давайте создадим каталог для наших виртуальных сред.

$ cd ~/
$ mkdir Envs

Теперь мы собираемся снова обновить наш файл bash.

$ echo 'export WORKON_HOME=$HOME/.virtualenvs' >> ~/.bashrc
$ echo 'export PROJECT_HOME=$HOME/Envs' >> ~/.bashrc
$ source /usr/local/bin/virtualenvwrapper.sh

Давайте создадим виртуальную среду и назовем ее детская площадка. Поскольку это будет наша игровая площадка: D Вы можете создавать больше окружений и называть их по своему желанию.

$ mkvirtualenv playground

В любое время, когда вы хотите поработать в среде, введите в терминале следующую команду. Конечно, если имя окружения другое, вы должны его использовать.

$ workon playground

Tensorflow

Установить Tensorflow несложно. Сначала попробуем установить его через pip.

$ pip install --upgrade tensorflow-gpu

Если это не удается, вы можете перейти на сайт Tensorflow и выбрать правильный двоичный файл для вашей системы. В этом случае мы выбираем версию Ubuntu с поддержкой GPU. Для моей конфигурации это 64-разрядная версия Ubuntu / Linux с включенным графическим процессором и Python 2.7, но ваша конфигурация может быть другой. Убедитесь, что вы выбрали последнюю версию на веб-сайте Tensorflow.

$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.1.0-cp27-none-linux_x86_64.whl

После установки убедимся, что все в порядке.

$ python
>>> import tensorflow
>>> tf.__version__
>>> exit()

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

Керас

Keras - это библиотека нейронных сетей высокого уровня, написанная на Python. Вы можете запустить свой код в Keras поверх TensorFlow или Theano. Это делает Keras хорошим выбором для моделей глубокого обучения. Итак, давайте сначала установим несколько зависимостей.

$ pip install numpy scipy
$ pip install scikit-learn
$ pip install pillow
$ pip install h5py

Теперь давайте установим Keras через pip.

$ pip install keras

Вот и все. Но давайте убедимся, что все в порядке. На этот раз для Кераса.

$ python
>>> import keras
>>> keras.__version__
>>> exit()

Это должно напечатать версию Keras и бэкэнд, который использует Keras. Мы можем изменить бэкэнд из файла конфигурации Keras, если по умолчанию он не установлен на Tensorflow.

$ gedit ~/.keras/keras.json

Содержимое этого файла должно выглядеть примерно так для Tensorflow. Если это не так, вы можете изменить его в соответствии с приведенной ниже конфигурацией и сохранить файл.

{
    "image_dim_ordering": "tf", 
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "backend": "tensorflow"
}

Сеть

Теперь, когда мы настроили нашу машину для глубокого обучения, давайте создадим простую нейронную сеть для решения известной проблемы XOR. Вы можете скачать сценарий отсюда или скопировать снизу.

$ python keras_xor.py

Это создаст нейронную сеть для решения проблемы XOR и начнет ее обучение в течение 1000 эпох. Вы можете отслеживать производительность графических процессоров с помощью следующей команды. Но не забудьте сделать это в другом окне терминала, которое будет обновлять экран каждую секунду.

$ watch -n1 nvidia-smi

Заключение

Это конец нашего урока. Теперь вы можете создавать более сложные сети и начинать экспериментировать с ними, используя эту настройку. Заботиться!