Назад
25

Основные компоненты AWS

25

Введение

Давайте представим, что вам внезапно понадобилось обучиться на датасете размером в несколько ТБ. Что делать? На вашей рабочей машинке, всего RTX — 3070, а кластера у вас нет(

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

Один из облачных провайдеров — Amazon Web Services. Ребята из Амазона предлагают облачные решения на любой случай жизни. У них есть и хранилище данных, и виртуальные машины, и Kubernetes кластера, и даже AutoML. Управлять происходящим в облаке можно либо через AWS CLI, либо через веб-интерфйес AWS (первый вариант дает больше возможностей, поэтому рекомендую его).

Давайте вернемся к нашей проблеме огромного датасета. Мы решили заплатить деньги Джеффу Безосу и обучить сетку в AWS. У нас уже есть рабочий код для обучения, есть данные на нашем компьютере. Теперь мы хотим запустить скрипт, который используя данные, обучает модельку на мощной виртуальной машине в облаке.

Хранение и передача данных

Для начала стоит упомянуть один нюанс: у AWS есть несколько датацентров и, в зависимости от его выбора, стоимость операций будет различаться. Если мы хотим просто обучать сетки в облаке, то выгоднее всего выбрать самый дешевый датацентр и делать все в нем. Я пользуюсь us-east-1 — кажется, он самый выгодный.

Данные стоит хранить в AWS s3. В этом хранилище мы платим деньги за хранение и передачу данных. В s3 есть несколько типов хранилищ с разными ценами. Например, там есть архивное хранилище — оно стоит очень дешево, но время ожидания извлечения данных — до 12 часов. Чтобы получить данные из s3, нужно создать запрос, который будет обрабатываться какое-то время и только после этого, мы получим доступ к файлу. Стандартный вариант — S3 Standard. В нем мы получаем данные моментально, но платим достаточно много. Пролить данные в s3 очень просто через AWS CLI. Перед тем как проливать данные, не забудьте создать бакет! Можно считать, что бакет это просто жесткий диск — на нем могут храниться директории и файлы.

При проливке данных, можно столкнуться с низкой скоростью загрузки, так как мы находимся далеко от датацентра и наша скорость сильно зависит от маршрутизации трафика. У aws есть решение! И это не физический переезд в датацентр 🙂

Это решение — S3 Transfer Acceleration — метод оптимального построения маршрута для данных. Подключить его можно либо через консоль, либо в веб интерфейсе, а после этого нужно всего лишь добавить к команде загрузки --endpoint-url bucket-name.s3-accelerate.amazonaws.com. Вуаля, наши данные загружаются быстрее, правда, стоит это дороже, чем обычная загрузка. Удобная тулза подскажет как ускорился процесс загрузки при включении S3 Transfer Acceleration.

Выбор инстанса

Итак, теперь наши данные лежат в s3 и мы хотим запустить виртуальную машину. В AWS виртуальные машины называются EC2 инстансами. Их видов достаточно много: у них разные характеристики и разные стоимости. Посмотреть какие типы инстансов существуют можно тут. Названия инстансов выглядят примерно так: c5d.9xlarge. До точки указано семейство инстансов, поколение и дополнительная информация (например, архитектура процессора). После точки указан размер инстанса. Чуть больше информации можно найти тут.

Несколько советов при выборе инстансов:

1)Не стоит брать инстансы предыдущих семейств. Последнее семейство, почти всегда, самое выгодное. После того, как я переехал с g3 на g5 стоимость эксперимента уменьшилась в 2 раза!

2)Хотите гонять сетки на GPU? Выбирайте только инстансы с поддержкой Deep Learning AMI.

3)Если вы планируете много однотипных экспериментов, то попробуйте позамерять скорость обучения на разных инстансах. Иногда, выгоднее взять инстанс, который быстрее и дороже, так как вы платите за время работы инстанса. Например, после переезда с g5.xlarge на g5.4xlarge, стоимость эксперимента у меня уменьшилась еще в 2 раза.

Начало работы

Выше, было упомянуто о Deep Learning AMI( или DLAMI). AMI(Amazon Machine Image) — это образ, содержащий ОС и некоторые программы, которые будут установлены на инстанс. DLAMI — это AMI, оптимизированный для deep learning. Список AMI можно посмотреть тут.

Перед созданием инстанса, нужно создать keypair — ключи для доступа к инстансу.

Создавать инстансы можно также, как и бакеты, через AWS CLI и через веб-интерфейс. При создании инстансов, также можно добавить в них дополнительный жесткий диск (естественно, за дополнительные деньги). Также, при создании инстанса, не забудьте выбрать keypair, по которому вы будете подключаться к нему. Подключаться к инстансу можно просто по ssh, на винде для этого удобно использовать putty.

Итак, мы подключились к инстансу и теперь можно скачать на него данные из s3 и запускать скрипт. Скорость выгрузки данных будет очень высокой, так как они расположены географически близко.

Еще немного советов

  1. s3 можно примонтировать к инстансу, вместо скачивания. Это не очень выгодно, если нам нужно использовать данные много раз — например, если мы обучем сетку в несколько эпох. Но если вы собираетесь прочитать файл лишь единожды (например, посчитать среднее в колонке датасета), то этот способ для вас!
  2. Один раз запустить обучение можно и вручную — через AWS CLI, но если собираетесь запускать его часто, то нужно как-то автоматизировать процесс. Хороший вариант это написание скрипта на python, используя boto3.
  3. Многие пользуются AWS Sagemaker — сервисом для машинного обучения в AWS. Он ускоряет процесс разработки и деплоя, но стоит гораздо дороже, чем написать все ручками)

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!