[Из песочницы] Настраиваем VM Instance Google Cloud для задач машинного обучения
Решение тяжёлых задач машинного обучения на стационарных компьютерах дело неблагодарное и малоприятное. Представьте, что вы на домашнем ноутбуке делаете ансамбль из N нейронных сетей для изучения лесов Амазонки на ноутбуке. Сомнительное удовольствие, тем более, что сейчас есть прекрасный выбор облачных сервисов для этих целей — Amazon Web Services, Google Cloud Platform, Microsoft Azure и прочие. Некоторые даже относительно бесплатны и предоставляют видеокарты.
Мы будем настраивать VM на Google Cloud Platform с нуля. Бонусом — стартовые 300$ на год на один gmail аккаунт. Поехали.
- Создание и настройка Virtual Machine Instances
- Настройка сетевых параметров
- Установка Anaconda и дополнительных пакетов
- Настройка Jupyter Notebook
- Настройка File Transfer
1. Создание и настройка Virtual Machine Instances
Создаем аккаунт
С первых шагов может ввести в заблуждение тот факт, что Гугл безапелляционно квалифицирует вас как юридическое лицо без права смены статуса. Это норма с недавних пор и с этим придется смириться. Далее бесстрашно указываем платежные данные, деньги без предупреждения не снимутся, даже когда будет исчерпан бесплатный лимит.
Создаем Virtual Machine и подбираем параметры
Здесь есть несколько интересных моментов. Графические процессоры есть не во всех зонах. В европейских и западно-азиатских я не нашел, в южно-американских искать не стал, поэтому выбрал восточно-американскую зону. Там их можно хоть восемь настроить с абонентской платой 5000 долларов в час. Усредняем данные и настраиваем восемь процессоров, двадцать гигабайт оперативной памяти и один графический процессор. Всё это удовольствие будет стоить 1 доллар в час.
Операционную систему можно выбрать на любой вкус. Берем понравившийся Linux дистрибутив и выставляем галочки «разрешить траффик». Настройку сети и SSH пропускаем. Их мы настроим дальше. И, наконец, один важный момент, снимите галочку с delete boot disk when instance is deleted. Это сохранит вам нервы, когда начнете создавать имейджи под разные задачи.
2. Настройка сетевых параметров
Настройка статического IP
По умолчанию внешний IP динамический. Сделаем его статическим и жить сразу станет гораздо проще. При привязке к проекту или виртуальной машине (как раз наш случай) — это бесплатно.
Настройка брандмауэра.
Jupyter Notebook — наш главный инструмент и ему будет нужен доступ к виртуальной машине. Создаем правило со следующими параметрами:
- Разрешить входящий трафик
- Указываем любой порт в разумных пределах. К примеру, 22-й не подойдет, на нем висит SSH.
- Диапазон адресов делаем по умолчанию 0.0.0.0/0 (можно поменять)
Мы создали чистую VM и в итоге у вас должно получиться примерно так:
И самое главное — не забывайте выключать 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 токена]
Добро пожаловать на борт!
Теперь нам осталось только настроить File Transfer между нашей локальной системой и удаленной. Без этого леса Амазонки не изучить.
5. Настройка File Transfer
У нас загрузочный диск Linux и поэтому доступны четыре способа:
- Использование командной строки gcloud (private SSH keys обязательно)
- Через протокол SFTP в браузере. Это самый простой способ, не требующий SSH key и использующий нативный браузер. Обязательное условие — локальная система у вас Linux или Mac.
- Использование командной строки SDC (private SSH keys обязательно)
- Программа WinSCP для счастливых обладателей Windows (private SSH keys обязательно)
Подробно можно почитать здесь и выбрать наиболее понравившийся способ. У меня на ноутбуке Windows 10, поэтому выбор не богатый. Пойдём не самым простым путём и подробно рассмотрим четвёртый способ.
Для начала необходимо сгенерировать SSH ключи. Скачиваем дистрибутив PuTTY и устанавливаем. С его помощью будем генерить ключи.
- Открываем puttygen.exe. Появится окно, где вы можете сгенерировать ключи.
- Оставляем все параметры по умолчанию кроме поля key comment. В него вводим имя пользователя удаленной системы. Скорее всего это ваш gmail аккаунт. Важно — не вся почта, а только та часть, которая до знака @. Я сначала прочитал инструкцию по диагонали и в итоге убил полчаса на то, чтобы понять, почему WinSCP возвращал ошибку.
- Сохраняем private key — его используем в WinSCP локально.
- Копируем текстовое поле private key (убедитесь, что скопировали полностью весь текст! На скриншоте лишь его часть)
- Идем в гугловские облака и там в «Метаданные --> SSH-ключи» добавляем скопированный ключ.
Подробно на офсайте Гугла
Осталось совсем немного, самая приятная часть — настроить файл-менеджер WinSCP.
- Скачиваем его здесь
- Настраиваем конфигурацию. Помним, что IP — это наш статический IP удаленной системы. Имя пользователя — аналогично PuTTY.
В дополнительных настройках указываем private key и выставляем галочки как на скриншоте.
Всё! Наша боевая система готова к перевариванию тяжелых сверточных нейросетей и объемных данных.
Дополнительно хочу заметить, что использовать один Instance не очень разумно экономически. Разные задачи требуют разных ресурсов. Можно создать двенадцать виртуалок с разными настройками процессоров, памяти и графики или работать с имейджами. Экспериментируйте и любите данные.
Полезные ссылки:
- Compute Engine Features
- Transferring Files to Instances
- Managing Instance Access with SSH Keys