Те из вас, кто только начинает заниматься глубоким обучением или глубоким обучением с подкреплением, знают, что это помогает работать с графическими процессорами. Графические процессоры могут ускорить время обучения для глубоких нейронных сетей, а попытка запустить модели глубокого обучения на вашем локальном компьютере может быть медленной. Здесь могут помочь Amazon Web Services (AWS). В AWS вы можете подготовить экземпляр g2 или p2 - это типы инстансов с мощными графическими процессорами. P2 - это последний тип инстанса с поддержкой графического процессора, и недавно я попытался настроить инстанс AWS p2 для глубокого обучения с подкреплением.

Что такое глубокое обучение с подкреплением?

См. Основополагающую статью https://www.nature.com/nature/journal/v518/n7540/full/nature14236.html

С каких популярных библиотек можно начать?

Популярным Python API для глубокого обучения является Keras (с Theano в качестве бэкэнда). OpenAI Gym - это обычная среда для обучения с подкреплением, позволяющая приступить к решению проблем.

Зачем я написал это руководство по установке?

Правильная настройка обоих этих инструментов на инстансе Amazon AWS может быть сложной задачей. Например, я столкнулся со следующей ошибкой, когда пытался сначала настроить GPU + Theano + Keras на AWS, а затем пытался записать видео с моим агентом обучения с подкреплением с помощью тренажерного зала OpenAI:



«Невозможно записать видео через ssh [pyglet требует X-сервера с GLX] · Проблема № 366 · openai / gym
Привет! Я новичок в спортзале. Я настраиваю тренажерный зал на сервере и пытаюсь запускать программы через ssh. Возьмем "примеры… github.com"



Пользователь pemami4911 рассказывает о том, как проблема с драйвером NVDIA не позволяет фреймворку записывать видео. Я так понимаю:

Помимо совместной работы OpenAI Gym и фреймворков глубокого обучения, мы также хотим упростить тестирование и запуск наших решений для проблем глубокого обучения с подкреплением. Мы сделаем это, настроив Jupyter, веб-приложение с открытым исходным кодом для запуска кода Python. Преимущество Jupyter в том, что у нас есть красивый пользовательский интерфейс для запуска нашего кода, даже если он выполняется удаленно в AWS.

Приведенные ниже шаги проведут вас через сквозную настройку AWS и получат все необходимые драйверы и библиотеки, а также вы сможете быстро итеративно решать проблемы с глубоким усилением. Это руководство объединяет инструкции из следующих и специально предназначено для экземпляров Amazon p2 (хотя вы можете использовать другие экземпляры с небольшими настройками):









  1. Взгляните на http://course.fast.ai/lessons/aws.html, чтобы запросить у AWS увеличение лимита экземпляров p2. Вам нужно будет создать учетную запись AWS и запросить ограничение экземпляра p2 равным 1 - это займет некоторое время от Amazon, чтобы убедиться, что ваша учетная запись не является мошеннической, прежде чем предоставить вам доступ к экземпляру p2. Примечание: не во всех регионах AWS есть экземпляры p2 - выберите ближайший к вам регион в консоли AWS и попробуйте найти p2.xlarge в https://console.aws.amazon.com/console/home ›EC2 ›Пределы. Я рекомендую подготовить экземпляр p2.xlarge, потому что он самый дешевый - 0,90 доллара США в час, но p2.8xlarge также работает, если вам нужно несколько графических процессоров (на момент написания это 7,20 доллара США в час).
  2. Тем временем настройте пару ключей AWS, чтобы упростить доступ к будущим экземплярам. ПРИМЕЧАНИЕ. Строки, начинающиеся с символа # и текста после # в любых приведенных ниже командах, следует рассматривать как комментарии и их можно игнорировать. При копировании текста в файлы мы будем использовать курсив.
# assumes you have pip installed. It should come with Python as of 2.7.9. If not, please look at https://packaging.python.org/tutorials/installing-packages/#requirements-for-installing-packages
pip install aws
# you'll need your Access Key ID, Secret Access Key, region, and "text" for output format
aws configure
# copy the following (taken from https://github.com/fastai/courses/blob/master/setup/setup_instance.sh) into a file called create_key_pair.sh:
export name="fast-ai"
if [ ! -d ~/.ssh ]
then
  mkdir ~/.ssh
fi
if [ ! -f ~/.ssh/aws-key-$name.pem ]
then
  aws ec2 create-key-pair --key-name aws-key-$name --query 'KeyMaterial' --output text > ~/.ssh/aws-key-$name.pem
  chmod 400 ~/.ssh/aws-key-$name.pem
fi
run sh create_key_pair.sh
# to make sure you correctly created a key-pair file:
ls ~/.ssh/aws-key-deep-rl.pem

3. Как только у вас будет ограничение на количество экземпляров p2, равное хотя бы 1, пора подготовить экземпляр. Перейдите на https://console.aws.amazon.com/console/home ›EC2› Экземпляры ›Запустить экземпляр

4. Выберите «Ubuntu Server 16.04 LTS (HVM), тип тома SSD» (или аналогичный тип экземпляра Ubuntu 16.04) ›p2.xlarge› Далее: Настройка сведений об экземпляре ›(ничего менять не нужно, если вы не знаете, что делаете на этот экран) ›Далее: Добавить хранилище› Увеличить как минимум до 32 ГБ ›Обзор и запуск› Запуск (просмотрите подробности еще раз, чтобы убедиться, что ваше хранилище обновлено правильно) ›Выберите пару ключей« aws-key-fast-ai »и отметьте поле «Я подтверждаю» ›Запуск экземпляров

5. Поздравляем! Вы успешно подготовили экземпляр AWS. Вы можете найти свой IP-адрес и идентификатор экземпляра на странице https://console.aws.amazon.com/console/home ›EC2› Экземпляры ›Нажмите на свой экземпляр

6. Скопируйте https://github.com/fastai/courses/blob/master/setup/aws-alias.sh локально в свой ~ / .bashrc и запустите

# to have these handy aliases ready:
source ~/.bashrc

7. ssh в

# check if your instance is marked "running" on the console. If not, right click it > Instance State > Start
aws-ssh # hit yes to accept

8. Установите базовые инструменты, Python2, Python3:

sudo apt-get update
# Install the package maintainer's version if being prompted:
sudo apt-get -y dist-upgrade
sudo apt-get install openjdk-8-jdk git python-dev python3-dev python-numpy python3-numpy build-essential python-pip python3-pip python3-venv swig python3-wheel libcurl3-dev
sudo apt-get install -y gcc g++ gfortran  git linux-image-generic linux-headers-generic linux-source linux-image-extra-virtual libopenblas-dev

9. Найдите подходящий драйвер для графического процессора вашего экземпляра на странице http://www.nvidia.com/Download/index.aspx?lang=en-us. Для экземпляра p2 я искал следующее:

10. Предполагая, что вам нужен драйвер 375.66, запустите

# this url path is the standard for drivers. Replace 375.66 with your driver as needed
wget -P ~/Downloads/ http://us.download.nvidia.com/XFree86/Linux-x86_64/375.66/NVIDIA-Linux-x86_64-375.66.run

11. Сделайте небольшую очистку существующего материала:

# It's ok if this doesn't exist
sudo rm /etc/X11/xorg.conf
# NVIDIA will clash with the nouveau driver so deactivate it:
sudo vim /etc/modprobe.d/blacklist-nouveau.conf
# Type i to insert the following lines and save by doing Esc then :wq
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

После сохранения файла запустите

sudo update-initramfs -u
# reboot will take a few minutes. After that, you can ssh back in
sudo reboot

11. Установите драйверы NVIDIA. Примечание. Параметр no-opengl-files важен.

chmod +x ~/Downloads/NVIDIA-Linux-x86_64-375.66.run
sudo sh ~/Downloads/NVIDIA-Linux-x86_64-375.66.run --no-opengl-files 
sudo reboot 
sudo modprobe nvidia  

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

WARNING: nvidia-installer was forced to guess the X library path '/usr/lib' and X module path '/usr/lib/xorg/modules'; these paths were not queryable from the system.  If X fails to find the NVIDIA X driver module, please install the `pkg-config` utility and the X.Org SDK/development package for your distribution and reinstall the driver.
WARNING: Unable to find a suitable destination to install 32-bit compatibility libraries. Your system may not be
set up for 32-bit compatibility. 32-bit compatibility files will not be installed; if you wish to
install them, re-run the installation and set a valid directory with the --compat32-libdir option.

12. Установите CUDA, вычислительную платформу для графических процессоров NVIDIA. На момент написания CUDA 8.0.61 является последней версией, но вы можете смело переходить на другую версию, если она совместима с графическим процессором, указанным выше. Примечание. Параметр no-opengl-libs важен.

wget -P ~/Downloads/ https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run
chmod +X ~/Downloads/cuda_8.0.61_375.26_linux-run
sudo sh ~/Downloads/cuda_8.0.61_375.26_linux-run --override --no-opengl-libs

Вот что следует выбрать при установке:

Hit q to go the bottom of the agreement.
Type accept to accept the EULA
Type n to NOT Install NVIDIA Accelerated Graphics Driver for Linux-x86_64
Type y to Install the CUDA 8.0 Toolkit 
Enter toolkit location to be  (default): /usr/local/cuda-8.0
Yes to install a symbolic link at /usr/local/cuda
Yes to install the CUDA 8.0 Samples
Default location for CUDA Samples location: ~/Downloads

В соответствии с рекомендациями установщика CUDA обновите PATH и LD_LIBRARY_PATH в вашем ~ / .bashrc

vim ~/.bashrc
# Add the following environment variables and save:
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda
# Now save the file and run:
source ~/.bashrc

13. (Необязательно) Протестируйте драйверы NVIDIA.

nvidia-smi
cat /proc/driver/nvidia/version to verify installation
nvcc -V to check cuda driver version

14. (Необязательно) Протестируйте CUDA, запустив образцы

Navigate to the CUDA samples (eg ~/Downloads/NVIDIA_CUDA-8.0_Samples) we installed earlier and run $ make
Navigate to NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release/ and run:
./deviceQuery  # see your graphics card specs
./bandwidthTest # check if its operating correctly
# (Both should state they PASS)

15. Настройте CUDNN, библиотеку нейронной сети для CUDA.

# Download CUDNN from https://developer.nvidia.com/, the NVIDIA developers site, to your local machine (needs log in/password) -> Find the latest version. As of the time of writing, CUDNN 5.1 is the latest version that works with Tensorflow, another popular Deep Learning library, and thus, it is the version installed below.
# On your local machine, run:
# to export the instanceIp variable
aws-ip  
# assumes you downloaded it to ~/Downloads locally:
scp ~/Downloads/cudnn-8.0-linux-x64-v5.1.tgz ubuntu@$instanceIp:~/Downloads
# On the AWS instance, run:
cd Downloads
tar -xzvf cudnn-8.0-linux-x64-v5.1.tgz
sudo cp cuda/lib64/* /usr/local/cuda/lib64/
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/

16. Установите и настройте Theano и Keras для Python 2. Полный список параметров theanorc и keras см. На http://deeplearning.net/software/theano/library/config.html#envvar-THEANORC и https: //keras.io/backend/#kerasjson-details соответственно.

# just to be safe and upgrade pip so that you don't get a warning
pip install --upgrade pip
# just to make sure we don't run into the error Permission denied: '/usr/local/lib/python2.7/dist-packages/yaml'  (Be careful on what you CHOWN - eg don't chown /usr) 
sudo chown -R $USER /usr/local 
pip install theano # Note for python3, you can do pip3 install theano
pip install keras  # Note for python3, you can do pip3 install kears
echo "[global]
device = gpu
floatX = float32
[cuda]
root = /usr/local/cuda" > ~/.theanorc
mkdir ~/.keras
echo '{
    "image_dim_ordering": "th",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "theano"
}' > ~/.keras/keras.json

17. Установите OpenAI gym для обучения с подкреплением.

# First, we set up Box2D-py, which is needed for environments such as LunarLander-v2.
cd ~/Downloads
git clone https://github.com/pybox2d/pybox2d.git
cd pybox2d
python setup.py build
python setup.py install
# Next, we follow the instructions at https://github.com/openai/gym/ to install the package in full.
cd ~/Downloads
git clone https://github.com/openai/gym.git
sudo apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig
cd gym
pip install -e '.[all]'
pip install matplotlib  # useful for rendering plots

18. Установите и настройте Jupyter.

pip install jupyter
jupyter notebook --generate-config
jupass=`python -c "from notebook.auth import passwd; print(passwd())"`
# Enter some password here. Doesn't have to be long. You'll use it to login into your jupyter notebooks.
echo "c.NotebookApp.password = u'"$jupass"'" >> $HOME/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False" >> $HOME/.jupyter/jupyter_notebook_config.py

19. Добавьте группу безопасности, чтобы иметь возможность подключаться к порту 8888 (где будет запускаться Jupyter) на вашем удаленном компьютере (спасибо пользователю Min на kenophob.io за некоторые из этих инструкций).

# create security group 
aws ec2 create-security-group --group-name JupyterSecurityGroup --description "My Jupyter security group"

# add security group rules 
aws ec2 authorize-security-group-ingress --group-name JupyterSecurityGroup --protocol tcp --port 8888 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name JupyterSecurityGroup --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name JupyterSecurityGroup --protocol tcp --port 443 --cidr 0.0.0.0/0

В консоли управления AWS щелкните правой кнопкой мыши свой экземпляр и выполните следующие действия: Сеть ›Изменить группы безопасности› Выберите JupyterSecurityGroup ›Назначить группы безопасности.

20. Протестируйте простую программу OpenAI, которая выполняет Q-Learning, и убедитесь, что рендеринг видео работает!

Create an account at https://gym.openai.com/. You'll get an API key after signing in and going to your profile. You'll need this API key below.

Начальный экран, чтобы убедиться, что случайная потеря ssh-соединения не приведет к гибели вашей программы. Внутри экрана запустите поддельный X-сервер и настройте Jupyter.

screen -S "openai"
xvfb-run -a -s "-screen 0 1400x900x24 +extension RANDR" bash
jupyter notebook
# On your local machine, run:
aws-nb  # to open your $instanceIp:8888
# Create a notebook by going to New > Python 2
# Copy the following into your Jupyter notebook:
import gym
import math
import numpy as np
import tempfile
from gym import wrappers
tdir = tempfile.mkdtemp()
env = gym.make('FrozenLake-v0')
env = wrappers.Monitor(env, tdir, force=True)
def qLearning(env, alpha=1.0, gamma=0.9, epsilon=0.99, epsilonDecay=1-1e-4, maxIters=1000):
  nS = env.env.env.nS
  nA = env.env.env.nA
  Q = np.zeros((nS, nA), dtype=np.float64)
  for i in range(1, maxIters + 1):
    state = env.reset()
    done = False
    while not done:
      if np.random.random() < epsilon:
        action = env.env.action_space.sample()
      else:
        action = np.argmax(Q[state])
      statePrime, reward, done, _ = env.step(action)
      if done:
        tdError = reward - Q[state][action]
      else:
        tdError = reward + (gamma * Q[statePrime].max()) - Q[state][action]
      Q[state][action] += alpha * tdError
      state = statePrime
    # decay epsilon after eac
    epsilon *= epsilonDecay
    
  pi = np.argmax(Q, axis=1)
  return pi, Q
qLearning(env)
env.close()
gym.upload(tdir, api_key='YOUR_API_KEY_HERE')

Перед запуском указанного выше файла обязательно замените YOUR_API_KEY_HERE на свой фактический ключ API. Это позволит вам загружать свои видео на сайт OpenAI для оценки. Обратите внимание, что вам нужно будет исправить Q-обучение, чтобы решить проблему со средой. Наслаждайтесь вызовом :)

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

Обратите внимание, что вам не нужно настраивать все с нуля, если вы используете AMI в AWS с предустановленными библиотеками (вы можете увидеть все бесплатные и платные AMI, когда перейдете к инициализации экземпляра). Однако при использовании AMI вы рискуете, что OpenAI не будет работать должным образом из-за проблемы с OpenGL.

Чтобы погрузиться в глубокое обучение с подкреплением, в Интернете есть множество отличных ресурсов и примеров кода. Что касается начальных книг, ознакомьтесь с классическим учебником по обучению с подкреплением от Саттона http://incompleteideas.net/sutton/index.html и учебником по глубокому обучению на сайте http://www.deeplearningbook.org/. Приведенные выше шаги должны позволить вам все настроить, чтобы начать работу!

Необязательно: установите Tensorflow

# first install libcupti-dev, which is needed for tensorflow
sudo apt-get install libcupti-dev
# Follow instructions at https://www.tensorflow.org/install/install_linux#InstallingNativePip