Руководство для начинающих с пошаговым практическим примером.

В этой статье я поделюсь примером того, как мы можем развернуть локально обученную модель машинного обучения в облаке с помощью сервиса AWS SageMaker. Под «обучением на месте» я подразумеваю модель машинного обучения, которая обучается локально на нашем ноутбуке (т. Е. Вне облака AWS). Я проведу вас через различные этапы, начиная с обучения модели и заканчивая развертыванием модели в облаке AWS и вызовом развертывания с локального клиента для получения прогнозов.

Введение

Если мы найдем в Google способы развертывания модели машинного обучения в AWS, мы найдем немало видео и статей, в которых рассказывается о развертывании модели машинного обучения на инстансе Amazon EC2. Они говорят о запуске экземпляра AWS EC2 для размещения нашего собственного приложения Flask и модели машинного обучения; где клиент (браузер) будет использоваться для отправки тестовых данных на сервер фляги, размещенный на EC2, который, в свою очередь, вызывает модель, размещенную на том же EC2, для получения прогноза, а затем отправляет результат прогноза клиенту.

Но этот подход - всего лишь еще один общий вариант использования облачной виртуальной машины (EC2) для запуска приложения и не имеет ничего особенного, связанного с развертыванием модели машинного обучения. Он не использует никаких полностью управляемых / бессерверных средств и преимуществ, таких как масштабируемость по запросу (автоматическое масштабирование), которые конечные точки AWS SageMaker могут предоставить для вывода машинного обучения. Более того, инстанс EC2 может оказаться дорогостоящим как с точки зрения затрат на использование ресурсов, так и с точки зрения затрат на управление.

AWS SageMaker предоставляет более элегантные способы обучения, тестирования и развертывания моделей с помощью таких инструментов, как конвейеры вывода, пакетное преобразование, многомодельные конечные точки, A / B-тестирование с производственными вариантами, настройка гиперпараметров, автоматическое масштабирование и т. д.

Немного основ

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

AWS SageMaker

Amazon SageMaker - это полностью управляемая служба машинного обучения. Он помогает специалистам по обработке данных и разработчикам быстро подготавливать, создавать, обучать и развертывать высококачественные модели машинного обучения (ML). Он предоставляет интегрированный экземпляр записной книжки Jupyter для легкого доступа к источникам данных для исследования и анализа.

Amazon S3

Amazon Simple Storage Service (Amazon S3) - это сервис объектного хранилища, который предлагает лучшую в отрасли масштабируемость, доступность данных, безопасность и производительность. Мы можем использовать S3 для хранения любых файлов, моделей, входных данных для обучающих моделей и т. Д.

Лямбда

AWS Lambda - это сервис бессерверных вычислений, который позволяет запускать код без выделения серверов и управления ими. Просто загрузите свой код в виде ZIP-файла или образа контейнера, и Lambda автоматически и точно распределяет вычислительную мощность и запускает ваш код на основе входящего запроса или события для любого масштаба трафика.

AWS API Gateway

Amazon API Gateway - это полностью управляемый сервис, который позволяет разработчикам легко создавать, публиковать, поддерживать, отслеживать и защищать API в любом масштабе. API-интерфейсы выступают в качестве «входной двери» для приложений, чтобы получить доступ к данным, бизнес-логике или функциям ваших серверных служб. Используя API Gateway, вы можете создавать RESTful API и WebSocket API, которые позволяют приложениям двусторонней связи в реальном времени.

Boto3

AWS SDK для Python. Вы используете AWS SDK для Python (Boto3) для создания, настройки и управления сервисами AWS, такими как Amazon Elastic Compute Cloud (Amazon EC2) и Amazon Simple Storage Service (Amazon S3). SDK предоставляет объектно-ориентированный API, а также низкоуровневый доступ к сервисам AWS.

SDK Amazon SageMaker Python

SageMaker Python SDK предоставляет несколько высокоуровневых абстракций для работы с Amazon SageMaker.

Развертывание моделей в SageMaker

Короче говоря, SageMaker - это сервис машинного обучения, предоставляемый AWS для кодирования, обучения и развертывания моделей машинного обучения в облаке. Если мы рассмотрим руководство разработчика SageMaker, мы сможем понять, насколько обширна и разнообразна структура сервисов, включая встроенную поддержку ряда популярных алгоритмов, от Linear Learner, XGBoost, K- NN, K-Means и т. Д. До фреймворков глубокого обучения, таких как Tensorflow, MXNet и т. Д.

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

  • Обучение и развертывание внутри SageMaker с использованием собственных контейнеров встроенных алгоритмов SageMaker (пожалуйста, обратите внимание, что это контейнеры, управляемые AWS).
  • Обучение нашей модели локально / вне SageMaker, а затем использование встроенного контейнера алгоритмов SageMaker для развертывания модели, обученной локально (тип Bring Your Own Model).
  • Используйте встроенные контейнеры алгоритмов SageMaker (под управлением AWS), но настраивайте обучение в соответствии с потребностями с помощью наших собственных сценариев (тип Bring Your Own Model).
  • Обучите нашу модель любым методом / или нашими собственными алгоритмами, которые мы хотим локально в нашем контейнере (созданном и управляемом нами), а затем перенесите этот контейнер в SageMaker и разверните его для использования (BYOC - Bring Your Own Container).

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

Развертывание модели с локальным обучением в облаке AWS

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

Давайте приступим к выполнению упражнения!

Я взял хорошо знакомый и простой, но популярный пример модели классификации в мире машинного обучения - предсказание типа цветов ириса. ..
Поскольку мы сосредоточены здесь только на развертывании, мы не собираемся тратить время на EDA набора данных, подготовку данных, настройку гиперпараметров, выбор модели и т. д. и т.д. набор !

Необходимые условия для выполнения упражнения -

Чтобы пользоваться облачными сервисами Amazon, включая SageMaker, Lambda, S3 и т. Д., Необходимо иметь учетную запись AWS бесплатного уровня, а также некоторое знакомство с запуском этих сервисов на консоли AWS. Подробную информацию о том, как создать бесплатную учетную запись AWS и попробовать запустить эти сервисы на консоли AWS, можно легко найти в сети.

Важно. Обратите внимание, что SageMaker НЕ является бесплатной службой и требует определенных затрат в зависимости от того, как долго вы запускаете и используете ресурсы, например экземпляры записных книжек. Вы должны правильно очистить все ресурсы SageMaker, сегменты Lambda, S3 и т. Д. После того, как попробуете это упражнение по развертыванию. Я поделился подробностями об очистке в конце этой статьи.

Наш пошаговый подход к выполнению упражнения кратко изложен ниже.

  1. Загрузите набор данных и обучите модель на локальном ноутбуке без использования какой-либо облачной библиотеки или SageMaker.

2. Загрузите файл обученной модели в AWS SageMaker и разверните там. Развертывание включает размещение модели в корзине S3, создание объекта модели SageMaker, настройку и создание конечных точек, а также несколько безсерверных служб (шлюз API и Lambda) для запуска конечной точки из внешнего мира.

3. Используйте локальный клиент (мы используем Postman), чтобы отправить образец тестовых данных в развернутую модель в облаке и получить прогноз обратно клиенту. В этом нам на помощь приходят спокойные методы htttp.

Давайте рассмотрим подробное пошаговое упражнение ниже.

Обучение модели

  1. На локальном портативном компьютере используйте блокнот Jupyter и обучите модель классификации XGBoost на популярном наборе данных о цветках ириса.

2. Протестируйте модель и сохраните файл модели локально с помощью joblib.

Для выполнения двух вышеуказанных шагов обратитесь к записной книжке iris-model-creation.ipynb, которую можно найти в моем репозитории на github.

Загрузите iris-model-creation.ipynb с github на свой ноутбук и запустите его, чтобы создать файлы модели и test_point.csv.

В блокноте для создания модели радужной оболочки мы загружаем набор данных о цветках радужной оболочки, запускаем на нем простую модель XGBoost, тестируем ее и сохраняем модель как локальный файл с помощью дампа joblib. Мы сохраняем образцы данных цветов в test_point.csv для тестирования.

Развертывание модели в SageMaker

Чтобы узнать о следующих двух шагах, обратитесь к записной книжке iris-model-deployment.ipynb, доступной в моем репозитории на github.

Мы должны загрузить и запустить этот блокнот в SageMaker, а не локально.

3. В консоли AWS создайте экземпляр записной книжки SageMaker и откройте записную книжку Jupyter.

Загрузите локально обученную модель, файлы test_point.csv и iris-model-deployment.ipynb в sageMaker ноутбук.

4. Запустите блокнот для развертывания модели радужной оболочки в SageMaker.

Важно! Запустите все ячейки в записной книжке, кроме последней - «Удалить конечную точку».

Выберите и установите conda_python3 в качестве ядра, когда вы увидите всплывающее окно «Ядро не найдено».

Код записной книжки делает следующее.

  • Загрузите файл модели, откройте его и протестируйте, а затем загрузите его в корзину S3 (откуда SageMaker будет брать артефакты модели).
  • Создайте объект модели SageMaker из модели, хранящейся в S3. Для этой цели мы будем использовать встроенный контейнер XGBoost SageMaker, так как модель была обучена локально с помощью алгоритма XGBoost. В зависимости от алгоритма, который вы используете для моделирования, вы должны правильно выбрать соответствующий встроенный контейнер и разобраться с нюансами, связанными с этим ... Руководство разработчика SageMaker должно помочь в этом.
  • Создайте конфигурацию конечной точки. Конечная точка - это интерфейс, через который внешний мир может использовать развернутую модель для прогнозов. Более подробную информацию о конечных точках можно найти в документации SageMaker.
  • Создайте конечную точку для модели.
  • Вызовите конечную точку из записной книжки развертывания, чтобы убедиться, что конечная точка и модель работают нормально.

Запустив ноутбук до этого момента, вы увидите конечную точку, созданную в разделе
Sagemaker - ›Inference -› Endpoints в консоли AWS.

Вы должны записать отображаемое имя конечной точки. Это будет использоваться при создании лямбда-функции (описанной в следующем разделе).

Запуск необходимых сервисов AWS для непрерывной связи

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

На следующей диаграмме показано, как можно вызвать развернутую модель с использованием бессерверной архитектуры AWS. Клиентский сценарий вызывает действие API Amazon API Gateway и передает значения параметров. API Gateway - это уровень, который предоставляет API клиенту. API Gateway передает значения параметров лямбда-функции. Функция Lambda анализирует значение и вызывает конечную точку модели SageMaker, передавая ей параметры. Модель выполняет задачу прогнозирования и возвращает результаты прогнозирования в Lambda. Функция Lambda анализирует возвращаемое значение и отправляет его обратно в API Gateway. API Gateway отвечает клиенту этим значением.

Для наших целей мы будем использовать шлюз Amazon Rest API. Вместо веб-браузера в качестве клиента мы будем использовать приложение Postman, чтобы упростить задачу (если вы хотите использовать веб-интерфейс браузера, вам нужно, чтобы Flask был упакован в контейнер, который необходимо разместить и запустить внутри SageMaker). В нашем примере Postman будет использоваться для отправки метода Restful POST для вызова шлюза API и получения ответа (прогнозов).

Итак, нам нужно настроить шлюз API и Lambda. Проделаем оставшиеся несколько шагов.

5. Создайте роль IAM, которая включает следующую политику, которая дает вашей лямбда-функции разрешение на вызов конечной точки модели.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sagemaker:InvokeEndpoint",
            "Resource": "*"
        }
    ]
}

Выберите Lambda в качестве варианта использования в сервисе AWS при создании роли и присоедините политику к роли.

6. Создайте лямбда-функцию с помощью указанного ниже кода Python, который вызывает среду выполнения SageMaker invoke_endpoint и возвращает прогноз.

import os
import boto3
import json
# grab environment variables
ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
runtime= boto3.client('runtime.sagemaker')
def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    
    data = json.loads(json.dumps(event))
    payload = data['data']
    #print(payload)
    
    response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                       ContentType='text/csv',
                                       Body=payload)
    #print(response)
    result = json.loads(response['Body'].read().decode())
   
    classes = ['Setosa', 'Versicolor', 'Virginica']
    res_list =  [ float(i) for i in result]
    return classes[res_list.index(max(res_list))]

Выберите «Автор с нуля», укажите имя функции и выберите «Среда выполнения как Python 3.8», как показано ниже.

Выберите «Использовать существующую роль» и выберите роль, созданную на предыдущем шаге.

В разделе кода лямбды введите код Python, указанный в начале этого шага. Не забудьте нажать «Развернуть» после ввода кода.

Перейдите на вкладку Configuration функции Lambda, добавьте переменную среды ENDPOINT_NAME и установите ее значение как ту же конечную точку, которая была создана на предыдущих шагах. Обратите внимание, что эта переменная среды используется в коде лямбда-функции.

Мы завершили настройку лямбда-функции.

7. Создайте REST API и интегрируйте его с функцией Lambda

Выберите службу API Gateway на консоли AWS и выберите REST API.

Нажмите на «Сборка» и выберите «Новый API». В следующем появившемся окне выберите «Создать ресурс» в раскрывающемся меню «Действия» и введите имя ресурса.

Запишите выбранное имя ресурса. Оно будет частью URL-адреса, созданного этой службой, и будет использоваться позже, когда мы будем тестировать развертывание с помощью Postman. Здесь мы выбрали название ресурса «irisprediction». После создания ресурса выберите «Создать метод» в раскрывающемся меню «Действия».

Выберите метод POST и «Лямбда-функцию» в качестве типа интеграции. Введите имя лямбда-функции, созданной на предыдущих шагах. Затем выберите «Развернуть API» в раскрывающемся меню «Действия». Выберите этап развертывания «Новый этап» и укажите название этапа. Я выбрал «тест».

Затем, наконец, когда вы нажмете «Развернуть», вам будет предоставлен «URL-адрес вызова», как показано ниже.

Запишите URL-адрес, отображаемый в окне, как «URL-адрес вызова». Он будет использоваться в Postman для связи со шлюзом API, как описано ниже.

На этом мы закончили развертывание и настройку сквозного канала связи.

Тестирование окончательного развертывания с локального клиента

8. Наконец, используйте приложение Postman на своем ноутбуке, чтобы отправить данные теста Iris flower на шлюз API и получить результат прогноза обратно из облака AWS.

Пример URL-адреса: (Не забудьте заменить URL-адрес API, полученный при создании API на предыдущих этапах, и добавить в конце имя ресурса.)

Например, если вы получили URL-адрес вызова
https://kmnia554df.execute-api.us-east-1.amazonaws.com/test/

добавьте имя ресурса к указанному выше URL-адресу и используйте его в почтальоне. Например, в нашем случае это было «предсказание». Вы можете увидеть снимок экрана, приведенный ниже, для полного примера URL.

Метод использования: POST

В теле необработанный ввод может быть представлен как:

{«Данные»: »5.099999999999999645e + 00,3.299999999999999822e + 00,1.699999999999999956e + 00,5.000000000000000000e-01}

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

Когда мы отправляем данные, мы успешно вызываем конечную точку развернутой модели и получаем предсказание цветка как «Setosa» в приведенном выше примере.

Итак, мы успешно развернули локально обученную модель в облаке AWS с помощью SageMaker и убедились, что она работает для вывода в реальном времени!

Теперь последний, но самый важный шаг - очистить ресурсы AWS, которые мы создали и запустили, потому что если вы оставите какой-либо ресурс работающим или занимающим пространство, с вас будет взиматься плата за все время, пока ресурс остается. там…

Важно - Уборка, иначе вы оплачиваете сборы!

  1. Для SageMaker не забудьте удалить экземпляр записной книжки, конечную точку, конфигурацию и модель конечной точки. Вы можете перейти по этой ссылке для того же.
  2. Перейдите в сервис Lambda и удалите созданную вами функцию.
  3. Перейдите в сервис Cloudwatch, выберите «Группы журналов» и удалите группы журналов, которые вы там найдете.
  4. Перейдите в службу IAM и удалите роль и политику, которые вы создали для этого упражнения.
  5. Удалите запущенный API-шлюз.

На этом заканчивается упражнение по развертыванию модели в AWS SageMaker.

Надеюсь, вам понравилось и вы цените это ... Спасибо, что дошли до этого места !!

Несколько ссылок для дальнейшего чтения:

Документация Amazon SageMaker

Примеры блокнотов SageMaker

Серия технических подробных погружений по Amazon SageMaker