Как создать ML Armada и запустить десятки миллиардов прогнозов ML с ограниченным бюджетом

1656664097 kak sozdat ml armada i zapustit desyatki milliardov prognozov ml

Марсело Лотиф

1*Q0NBrOiL1bfHO5NekJzQLA
Английские корабли и непреодолимая армада. Неизвестный автор, август 1588 г. Источник: Википедия.

В этом руководстве мы шаг за шагом расскажем, как настроить AWS SpotFleet с контейнерами Docker, настроенными для запуска приложений Tensorflow и Keras.

Docker позволяет очень легко установить Tensorflow и Keras и надежно воспроизвести эту инсталляцию много раз на разных машинах. В то же время SpotFleet является отличным инструментом для запуска нескольких машин, а также экономит, что вы получаете от спотовых экземпляров AWS. Совместите их вместе, и вы получите выигрышную комбинацию мощной и дешевой мощности обработки.

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

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

  1. Создание образа Docker с поддержкой Tensorflow+Keras
  2. Отправка образа докера в AWS и создание определений задач
  3. Запрос на SpotFleet
  4. Настройка кластера ECS для запуска контейнеров Docker на машинах SpotFleet
  5. Реальное применение и результаты

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

1. Создание образа Docker с поддержкой Tensorflow+Keras

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

Во-первых, клонируйте проект Keras/Docker hello world, который я создал, чтобы начать:

$ git clone https://github.com/lotif/keras-docker-hello-world.git

Примечание: Я попытался сделать минимум, который вам понадобится, чтобы создать образ Docker, обучающий образцовую модель. Чтобы сделать hello_world.py я использовал этот учебник с несколькими незначительными изменениями, чтобы он работал с Keras 2.

Я не буду вдаваться в подробности того, как все это настроить, но если у вас возникнут вопросы, не стесняйтесь спрашивать здесь или в репозитории Github.

Во-вторых, установите Docker на вашей локальной машине, если вы этого еще не сделали и создайте образ локально:

$ docker build -t hello-world .

После завершения вы увидите следующие журналы в конце:

[...]Successfully built 3841f29fa5b9Successfully tagged hello-world:latest

Теперь пришло время его тестового запуска:

$ docker run hello-world:latest

Теперь начнется все самое интересное – модель будет построена, и она должна начать тренироваться. Он будет работать несколько минут, а когда завершит работу, в журнале появятся следующие сообщения:

[...]Epoch 9/1060000/60000 [===============] - 12s - loss: 0.1022 - acc: 0.9679     Epoch 10/1060000/60000 [===============] - 12s - loss: 0.0991 - acc: 0.9695#############################Score: [0.06286391887611244, 0.9799]Training Finished! Exiting...

Прекрасно! Теперь у нас есть рабочий образ Docker, обучающий модель. Пора разместить это в облаке 🙂

2. Отправьте образ докера в AWS и создайте определение задач

Вы должны установить командную строку AWS на вашей локальной машине и в основном придерживаться этого руководства AWS с одним важным изменением:

  • В части следующих шагов я упростил JSON, чтобы он был похож на код ниже. Обязательно замените <aws-account-id> с идентификатором вашего аккаунта AWS перед его запуском.

Кроме того, не беспокойтесь о «Чтобы выполнить задание с помощью hello-world определение задачи» шаг прямо сейчас. Мы настроим ECS позже.

Есть две главные модификации. Во-первых, это удаление определенных конфигураций, которые нам сейчас не понадобятся. Во-вторых, мы будем использовать memoryReservation атрибут вместо memory . Таким образом, ваш контейнер не выйдет из строя, если он превысит лимит памяти. В-третьих, есть command атрибут, который был заимствован из Dockerfile. Вы можете изменить это в соответствии со своим проектом.

Вы можете проверить, как выглядит ваше определение задачи, перейдя в раздел определения задач ECS на AWS.

Теперь мы готовы настроить наш флот!

3. Запрос SpotFleet

Я создал упрощенный JSON, чтобы вы могли начать, но интерфейс для Spot Requests неплохой, если вы предпочитаете его использовать. Краткие инструкции приведены в конце этого раздела.

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

Конфигурации автопарка можно изменять по своему усмотрению. Однако для надлежащей работы с кластерами ECS необходимо выполнить несколько вещей:

  1. AMI: Это должен быть один из оптимизированных ECS идентификаторов AMI в этом списке. Выберите тот в зоне, где вы создаете флот.
  2. Ключевая пара: название вашей пары ключей AWS, чтобы вы могли ssh в экземпляре, если вам нужно проверить журналы Docker или что-нибудь наладить. Если у вас его нет, вы можете перейти к парам ключей на EC2 и нажать Создать пару ключей.
  3. Роль флота IAM: Назначьте роль IAM для EC2 AmazonEC2SpotFleetRole политики. Возможно, для этого вам предстоит создать новый.
  4. Профиль экземпляра IAM: Назначьте роль IAM для EC2 AmazonEC2ContainerServiceforEC2Role политики. Возможно, для этого вам предстоит создать новый.

Поместите эти значения в заполнителе файла ниже, чтобы получить окончательный запрос спот-парка в JSON:

Имея в руках окончательный файл, теперь вы можете запустить request-spot-fleet команду ниже (полные характеристики здесь), и она спросит флот для вас:

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

$ aws ec2 request-spot-fleet --spot-fleet-request-config file:///path/to/spot-fleet-config.json

Вы готовы! Теперь вы сможете перейти на страницу спот-запросов EC2 и увидеть свой автопарк. Оттуда можно проверить статус и выключить автопарк.

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

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

4. Настройка кластера ECS для запуска контейнеров Docker на машинах SpotFleet

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

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

Теперь пора заставить машины выполнять работу! Для этого нужно создать службу ECS, чтобы она могла автоматически назначать задачу Docker этим машинам и начинать их выполнение.

Для этого используйте create-service команда (полные характеристики здесь):

aws ecs create-service --service-name hello-world-service --cluster default --task-definition hello-world-task-def --desired-count 4

Теперь вы сможете перейти к Услуги вкладку своего кластера и просмотрите там свою только что созданную службу.

Возможно, вы заметили, что я установил желаемое количество для команды выше на 4. Вы также могли заметить, что я установил целевую емкость флота на 2. Если вы дадите несколько минут, эта служба автоматически распределит эти задачи между экземплярами, запустив 2 контейнера Docker в каждому из них. Прекрасно, не правда ли?

Вы можете настроить это поведение, изменив --placement-strategy параметр на create-service команда.

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

Чтобы просмотреть журналы и проверить, правильно ли работают контейнеры Docker, вы должны ssh в машины, сделайте a docker container ls возьмите хэш-номер контейнера и выполните a docker logs <container-hash>. Но это нельзя масштабировать для большого количества машин. Консолидация всех журналов, которые нам нужны, может занять еще одну публикацию:)

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

5. Реальное применение и результаты

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

Почему SpotFleet?

Точечные экземпляры AWS — отличный инструмент. Это коробки, которые просто простаивают, и AWS предлагает их всего за долю от полной цены.

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

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

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

Улучшение реальной жизни

После проведения некоторых контрольных тестов для нашей засыпки мы решили выбрать машину, способную делать чуть более 1000 прогнозов в минуту из соображений экономии и выгоды. Выполнение миллиона прогнозов на этой машине обошлось бы нам в 1,42 доллара, если мы используем обычные цены AWS.

Кажется, это нормально, но при спотовом ценообразовании такое же количество прогнозов стоило бы нам 0,50 долларов США! Весьма потрясающая экономия.

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

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

В одном из наших тестов мы смогли запустить парк из 650 машин и достигли пика в 35 миллионов прогнозов в час по цене 19 долларов США в час. С такой скоростью мы могли бы заполнить все наши данные всего за несколько месяцев. Теперь это кажется выполнимым 🙂

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

Сравнение цены с другими решениями для обработки изображений по требованию

Давайте сравним эти цифры с несколькими самыми готовыми решениями ML для обработки изображений на рынке. Наша базовая стоимость со спотовыми экземплярами составляет 0,50 долларов США за миллион изображений.

Google Vision – 600 долларов за миллион изображений: Существуют разные уровни в зависимости от спроса. Цена снизится почти на треть, если вы преодолеете барьер в 5 миллионов изображений в месяц, и мы точно это сделаем. Чтобы упростить расчеты, я рассмотрю самый дешевый вариант, и это все равно будет стоить нам колоссальных 600 долларов для анализа миллиона изображений.

Amazon Rekognition – 400 долларов за миллион изображений: их самый дешевый уровень начинает работать только после 100 миллионов изображений в месяц. Если мы снова учтем самую низкую цену, чтобы упростить вычисление, анализ миллиона изображений обойдется нам в 400 долларов.

Amazon SageMaker – $3,97 за миллион изображений: Это более общее решение для машинного обучения, как в настоящем руководстве, и здесь легче провести сравнение, поскольку они предлагают те же машины, на которых мы сравнивали нашу засыпку. Тот, кто способен делать 1000 предсказаний в минуту, обойдется нам в 3,97 долларов за миллион изображений. Это более чем вдвое больше обычной цены на эту машину и почти в 8 раз дороже спотовой цены.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *