Настраиваем VM Instance Google Cloud для задач машинного обучения

Решение тяжёлых задач машинного обучения на стационарных компьютерах дело неблагодарное и малоприятное. Представьте, что вы на домашнем ноутбуке делаете ансамбль из N нейронных сетей для изучения лесов Амазонки на ноутбуке. Сомнительное удовольствие, тем более, что сейчас есть прекрасный выбор облачных сервисов для этих целей — Amazon Web Services, Google Cloud Platform, Microsoft Azure и прочие. Некоторые даже относительно бесплатны и предоставляют видеокарты.


image


Мы будем настраивать VM на Google Cloud Platform с нуля. Бонусом — стартовые 300$ на год на один gmail аккаунт. Поехали.


  1. Создание и настройка Virtual Machine Instances
  2. Настройка сетевых параметров
  3. Установка Anaconda и дополнительных пакетов
  4. Настройка Jupyter Notebook
  5. Настройка File Transfer

1. Создание и настройка Virtual Machine Instances


Создаем аккаунт


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


Создаем Virtual Machine и подбираем параметры


Здесь есть несколько интересных моментов. Графические процессоры есть не во всех зонах. В европейских и западно-азиатских я не нашел, в южно-американских искать не стал, поэтому выбрал восточно-американскую зону. Там их можно хоть восемь настроить с абонентской платой 5000 долларов в час. Усредняем данные и настраиваем восемь процессоров, двадцать гигабайт оперативной памяти и один графический процессор. Всё это удовольствие будет стоить 1 доллар в час.


image


Операционную систему можно выбрать на любой вкус. Берем понравившийся Linux дистрибутив и выставляем галочки "разрешить траффик". Настройку сети и SSH пропускаем. Их мы настроим дальше. И, наконец, один важный момент, снимите галочку с delete boot disk when instance is deleted. Это сохранит вам нервы, когда начнете создавать имейджи под разные задачи.


image


2. Настройка сетевых параметров


Настройка статического IP


По умолчанию внешний IP динамический. Сделаем его статическим и жить сразу станет гораздо проще. При привязке к проекту или виртуальной машине (как раз наш случай) — это бесплатно.


image


Настройка брандмауэра.


Jupyter Notebook — наш главный инструмент и ему будет нужен доступ к виртуальной машине. Создаем правило со следующими параметрами:


  • Разрешить входящий трафик
  • Указываем любой порт в разумных пределах. К примеру, 22-й не подойдет, на нем висит SSH.
  • Диапазон адресов делаем по умолчанию 0.0.0.0/0 (можно поменять)

image


Мы создали чистую VM и в итоге у вас должно получиться примерно так:


image


И самое главное — не забывайте выключать VM, когда закончили работу!


3. Установка Anaconda и дополнительных пакетов


Запускаем созданный Instance, подключаемся через SSH и для установки дистрибутива Анаконды вводим в командной строке:


wget http://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh
bash Anaconda3-5.0.1-Linux-x86_64.sh

В конце установки не забудьте ввести "yes", чтобы прописать переменную PATH
Ставим любимые пакеты:


conda install seaborn
conda install keras
conda install tensorflow

И переходим к настройке Jupyter Notebook.


4. Настройка Jupyter Notebook


Вводим в командную строку (порт — который вы указали в настройках брандмауэра):


echo c.NotebookApp.ip = '*' > ~/.jupyter/jupyter_notebook_config.py
echo c.NotebookApp.open_browser = False> ~/.jupyter/jupyter_notebook_config.py
echo c.NotebookApp.port = 8888 > ~/.jupyter/jupyter_notebook_config.py

Проверяем:


tail -n 10 ~/.jupyter/jupyter_notebook_config.py

Запускаем:


jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser &

И теперь один интересный момент. Если у вас всё прошло успешно, то после старта Jupiter Server в баше вы увидите примерно это:


Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=[здесь будет id токена]

Если перейти по ссылке, то в браузере вывалится ошибка авторизации, что совершенно очевидно. Для этого в строке браузера надо явно указать, созданный выше внешний статический IP:


http://<ваш IP>:8888/?token=[здесь будет id токена]

Добро пожаловать на борт!


image


Теперь нам осталось только настроить File Transfer между нашей локальной системой и удаленной. Без этого леса Амазонки не изучить.


5. Настройка File Transfer


У нас загрузочный диск Linux и поэтому доступны четыре способа:


  1. Использование командной строки gcloud (private SSH keys обязательно)
  2. Через протокол SFTP в браузере. Это самый простой способ, не требующий SSH key и использующий нативный браузер. Обязательное условие — локальная система у вас Linux или Mac.
  3. Использование командной строки SDC (private SSH keys обязательно)
  4. Программа WinSCP для счастливых обладателей Windows (private SSH keys обязательно)

Подробно можно почитать здесь и выбрать наиболее понравившийся способ. У меня на ноутбуке Windows 10, поэтому выбор не богатый. Пойдём не самым простым путём и подробно рассмотрим четвёртый способ.


Для начала необходимо сгенерировать SSH ключи. Скачиваем дистрибутив PuTTY и устанавливаем. С его помощью будем генерить ключи.


  1. Открываем puttygen.exe. Появится окно, где вы можете сгенерировать ключи.
  2. Оставляем все параметры по умолчанию кроме поля key comment. В него вводим имя пользователя удаленной системы. Скорее всего это ваш gmail аккаунт. Важно — не вся почта, а только та часть, которая до знака @. Я сначала прочитал инструкцию по диагонали и в итоге убил полчаса на то, чтобы понять, почему WinSCP возвращал ошибку.
  3. Сохраняем private key — его используем в WinSCP локально.
  4. Копируем текстовое поле private key (убедитесь, что скопировали полностью весь текст! На скриншоте лишь его часть)

image


  1. Идем в гугловские облака и там в "Метаданные --> SSH-ключи" добавляем скопированный ключ.

Подробно на офсайте Гугла


Осталось совсем немного, самая приятная часть — настроить файл-менеджер WinSCP.


  1. Скачиваем его здесь
  2. Настраиваем конфигурацию. Помним, что IP — это наш статический IP удаленной системы. Имя пользователя — аналогично PuTTY.

image


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


image


Всё! Наша боевая система готова к перевариванию тяжелых сверточных нейросетей и объемных данных.


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


Полезные ссылки:


  1. Compute Engine Features
  2. Transferring Files to Instances
  3. Managing Instance Access with SSH Keys
  • +14
  • 5,3k
  • 8
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 8
  • 0
    Решение тяжёлых задач машинного обучения на стационарных компьютерах дело неблагодарное и малоприятное. Представьте, что вы на домашнем ноутбуке делаете ансамбль...

    Так на стационарных или на ноутбуке? :)
    • +1
      Хороший туториал, спасибо!
      Только один вопрос: а почему не воспользоваться Google Cloud Datalab? Из-под Google SDK отлично подымается, пользую какое-то время, удобно.
      • +1
        Datalab по сути надстройка над Compute Engine и по-своему хорош, но:
        1. Compute Engine более гибок в настройке.
        2. Ценовая политика Compute Engine — платишь только за использованное время и это мне импонирует больше. Всё прозрачно.
        • 0
          Спасибо!

          Мне казалось, что в Datalab виртуальную машину (GCE) тоже можно остановить, когда она не используется.

          Ценовая политика вроде здесь описана: cloud.google.com/datalab/docs/resources/pricing

          И ещё, мне казалось, что там можно всё скриптом (bash) поднять…  и потом ликвидировать таким же образом.

          Я не очень уверен, что http и https должны быть открыты.

          Наверное я бы грохнул default network тоже и создал другую. И firewall rules порезал бы (например RDP не нужен)…
      • +1
        Несколько советов, в дополнение к статье.

        jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser &

        У вас уже в конфиге указан и адрес и порт, можно запускать без этих параметров уже.
        И наверное лучше запускать это через screen.

        Если надо много раз запускать разные экземпляры, то токен можно указать тоже непосредственно в конфиге:
        c.NotebookApp.token = u'haogeeShafee2ie3xebueR5Aek7Fo3'


        Также jupyter умеет в SSL, так что еще можно и так сделать:
        c.NotebookApp.certfile = u'/srv/keys/jupyter.crt'
        c.NotebookApp.keyfile = u'/srv/keys/jupyter.key'

        И повесить например на порт 443 (если запускаем jupyter под рутом).

        Иногда бывает, что нужны логи:
        jupyter notebook --config=~/.jupyter/jupyter_notebook_config.py | tee -a /var/log/jupyter.log
        • 0
          Благодарю.
          Насчет запуска jupiter без параметров ip и порта — это проблема, которую я так и не победил (точнее, не стал этим заморачиваться). Браузер вываливает timed-out error. Указываю параметры явно в строке — всё ок.
      • 0
        Возможно комуто пригодится докер контейнеры от Nvidia для машинного обучения.

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