СТАТЬЯ

Развертывание моделей машинного обучения, часть 5: развертывание

Из Книжного лагеря по машинному обучению Алексея Григорьева

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

Получите скидку 40% на Книжный лагерь по машинному обучению, введя fccgrigorev в поле кода скидки при оформлении заказа на manning.com.

См. Часть 1, часть 2, часть 3 и часть 4, если вы их пропустили.

Мы не запускаем производственные сервисы на наших ноутбуках: для этого нам нужны специальные серверы.

В этой статье мы рассмотрим один из возможных вариантов для этого: Amazon Web Services или AWS. Мы решили выбрать AWS из-за его популярности, и мы не связаны ни с Amazon, ни с AWS.

Существуют и другие популярные общедоступные облака, включая Google Cloud, Microsoft Azure и Digital Ocean. Мы не рассматриваем их в этой статье, но вы сможете найти аналогичные инструкции в Интернете и развернуть модель у вашего любимого облачного провайдера.

Чтобы следовать инструкциям в этом разделе, вам потребуется учетная запись AWS.

AWS Elastic Beanstalk

AWS предоставляет множество сервисов, и существует множество возможных способов развертывания веб-сервиса там. Например, вы можете арендовать машину EC2 (сервер в AWS) и вручную настроить на ней сервис, использовать «бессерверный» подход с AWS Lambda или использовать ряд других сервисов.

В этой статье мы будем использовать AWS Elastic Beanstalk, который является одним из простейших способов развертывания модели в AWS. Кроме того, наш сервис достаточно прост, что позволяет не выходить за пределы уровня бесплатного пользования. Мы можем использовать его бесплатно в течение первого года.

Elastic Beanstalk автоматически берет на себя многие вещи, которые нам обычно нужны в производственной среде, в том числе:

  • Развертывание нашего сервиса на инстансах EC2
  • Масштабирование: добавление дополнительных экземпляров для обработки нагрузки в часы пик
  • Масштабирование: удаление этих экземпляров, когда нагрузка уходит
  • Перезапуск службы при сбое по какой-либо причине
  • Балансировка нагрузки между экземплярами

Нам также понадобится специальная утилита - интерфейс командной строки (CLI) Elastic Beanstalk - для использования Elastic Beanstalk. Интерфейс командной строки написан на Python, и мы можем установить его с помощью pip, как и любой другой инструмент Python.

Поскольку мы используем Pipenv, мы можем добавить его как зависимость для разработки: таким образом мы установим его только для нашего проекта, а не для всей системы.

pipenv install awsebcli --dev

ПРИМЕЧАНИЕ. Зависимости разработки - это инструменты и библиотеки, которые мы используем для разработки нашего приложения. Обычно они нужны нам только локально и не нужны в пакете, развернутом в производственной среде.

После его установки мы можем войти в виртуальную среду нашего проекта:

pipenv shell

Теперь интерфейс командной строки должен быть доступен. Давай проверим:

eb --version

Он должен напечатать версию:

EB CLI 3.18.0 (Python 3.7.7)

Далее запускаем команду инициализации:

eb init -p docker churn-serving

Обратите внимание, что мы используем «-p docker»: таким образом мы указываем, что это проект на основе Docker.

Если все в порядке, он создает пару файлов, в том числе config.yml файл в папке .elasticbeanstalk.

Теперь мы можем протестировать наше приложение локально, используя команду local run:

eb local run --port 9696

Это должно работать так же, как и в предыдущем разделе с Docker: сначала создается образ, а затем запускается контейнер.

Чтобы проверить это, мы можем использовать тот же код, что и раньше, и получить тот же ответ:

{'churn': False, 'churn_probability': 0.061875678218396776}

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

eb create churn-serving-env

Эта простая команда позаботится о настройке всего, что нам нужно: от экземпляров EC2 до правил автоматического масштабирования:

Creating application version archive "app-200418_120347".
 Uploading churn-serving/app-200418_120347.zip to S3. This may take a while.
 Upload Complete.
 Environment details for: churn-serving-env
   Application name: churn-serving
   Region: us-west-2
   Deployed Version: app-200418_120347
   Environment ID: e-3xkqdzdjbq
   Platform: arn:aws:elasticbeanstalk:us-west-2::platform/Docker running on 64bit Amazon Linux 2/3.0.0
   Tier: WebServer-Standard-1.0
   CNAME: UNKNOWN
   Updated: 2020-04-18 10:03:52.276000+00:00
 Printing Status:
 2020-04-18 10:03:51    INFO    createEnvironment is starting.
  -- Events -- (safe to Ctrl+C)

На создание всего уйдет несколько минут. Мы можем отслеживать процесс и видеть, что он делает, в терминале.

Когда все будет готово, мы должны увидеть следующую информацию:

2020-04-18 10:06:53    INFO    Application available at churn-serving-env.5w9pp7bkmj.us-west-2.elasticbeanstalk.com.
 2020-04-18 10:06:53    INFO    Successfully launched environment: churn-serving-env

URL-адрес (churn-serving-env.5w9pp7bkmj.us-west-2.elasticbeanstalk.com) в журналах важен: это то, как мы достигаем нашего приложения. Теперь мы можем использовать этот URL для прогнозов (рисунок 1).

Давайте проверим это:

host = 'churn-serving-env.5w9pp7bkmj.us-west-2.elasticbeanstalk.com'
 url = 'http://%s/predict' % host
 response = requests.post(url, json=customer)
 result = response.json()
 result

Как и раньше, мы должны увидеть тот же ответ:

{'churn': False, 'churn_probability': 0.05960590758316393}

Это все! У нас есть работающий сервис.

ВНИМАНИЕ! Это игрушечный пример, и созданный нами сервис доступен для всех в мире. Если вы делаете это внутри организации, доступ должен быть максимально ограничен. Нетрудно расширить этот пример для обеспечения безопасности, но это выходит за рамки данной статьи. Прежде чем делать это на работе, проконсультируйтесь с отделом безопасности вашей компании.

Мы можем делать все из терминала с помощью интерфейса командной строки, но также можно управлять им из консоли AWS. Для этого находим там «Elastic Beanstalk» и выбираем созданную среду (рисунок 2).

Чтобы отключить его, выберите «прекратить развертывание» в меню «Действия среды» с помощью Консоли AWS.

ПРЕДУПРЕЖДЕНИЕ. Несмотря на то, что Elastic Beanstalk имеет право на бесплатный уровень, мы всегда должны быть осторожны и отключать его, как только он нам больше не нужен.

В качестве альтернативы мы используем для этого CLI:

eb terminate churn-serving-env

Через несколько минут развертывание удаляется из AWS, и URL-адрес становится недоступным.

AWS Elastic Beanstalk - отличный инструмент для начала работы с моделями машинного обучения. Вы можете найти более продвинутые способы сделать это, которые включают системы оркестровки контейнеров, такие как AWS ECS или Kubernetes; или «без сервера» с AWS Lambda.

Вот и все по этой серии.

Если вы хотите узнать больше о книге, посмотрите ее на нашей браузерной платформе liveBook здесь.