Руководство для начинающих с пошаговым практическим примером.
В этой статье я поделюсь примером того, как мы можем развернуть локально обученную модель машинного обучения в облаке с помощью сервиса AWS SageMaker. Под «обучением на месте» я подразумеваю модель машинного обучения, которая обучается локально на нашем ноутбуке (т. Е. Вне облака AWS). Я проведу вас через различные этапы, начиная с обучения модели и заканчивая развертыванием модели в облаке AWS и вызовом развертывания с локального клиента для получения прогнозов.
Введение
Если мы найдем в Google способы развертывания модели машинного обучения в AWS, мы найдем немало видео и статей, в которых рассказывается о развертывании модели машинного обучения на инстансе Amazon EC2. Они говорят о запуске экземпляра AWS EC2 для размещения нашего собственного приложения Flask и модели машинного обучения; где клиент (браузер) будет использоваться для отправки тестовых данных на сервер фляги, размещенный на EC2, который, в свою очередь, вызывает модель, размещенную на том же EC2, для получения прогноза, а затем отправляет результат прогноза клиенту.
Но этот подход - всего лишь еще один общий вариант использования облачной виртуальной машины (EC2) для запуска приложения и не имеет ничего особенного, связанного с развертыванием модели машинного обучения. Он не использует никаких полностью управляемых / бессерверных средств и преимуществ, таких как масштабируемость по запросу (автоматическое масштабирование), которые конечные точки AWS SageMaker могут предоставить для вывода машинного обучения. Более того, инстанс EC2 может оказаться дорогостоящим как с точки зрения затрат на использование ресурсов, так и с точки зрения затрат на управление.
AWS SageMaker предоставляет более элегантные способы обучения, тестирования и развертывания моделей с помощью таких инструментов, как конвейеры вывода, пакетное преобразование, многомодельные конечные точки, A / B-тестирование с производственными вариантами, настройка гиперпараметров, автоматическое масштабирование и т. д.
Немного основ
Прежде чем перейти к примеру развертывания, который будет обсуждаться в ближайшее время, я постараюсь дать некоторые основные сведения об используемых сервисах AWS, чтобы читатели, которые совершенно не знакомы с AWS, могли при необходимости провести дополнительное базовое исследование AWS, прежде чем попробовать шаги и услуги, обсуждаемые в этой статье.
Amazon SageMaker - это полностью управляемая служба машинного обучения. Он помогает специалистам по обработке данных и разработчикам быстро подготавливать, создавать, обучать и развертывать высококачественные модели машинного обучения (ML). Он предоставляет интегрированный экземпляр записной книжки Jupyter для легкого доступа к источникам данных для исследования и анализа.
Amazon Simple Storage Service (Amazon S3) - это сервис объектного хранилища, который предлагает лучшую в отрасли масштабируемость, доступность данных, безопасность и производительность. Мы можем использовать S3 для хранения любых файлов, моделей, входных данных для обучающих моделей и т. Д.
AWS Lambda - это сервис бессерверных вычислений, который позволяет запускать код без выделения серверов и управления ими. Просто загрузите свой код в виде ZIP-файла или образа контейнера, и Lambda автоматически и точно распределяет вычислительную мощность и запускает ваш код на основе входящего запроса или события для любого масштаба трафика.
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.
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 и т. Д. После того, как попробуете это упражнение по развертыванию. Я поделился подробностями об очистке в конце этой статьи.
Наш пошаговый подход к выполнению упражнения кратко изложен ниже.
- Загрузите набор данных и обучите модель на локальном ноутбуке без использования какой-либо облачной библиотеки или SageMaker.
2. Загрузите файл обученной модели в AWS SageMaker и разверните там. Развертывание включает размещение модели в корзине S3, создание объекта модели SageMaker, настройку и создание конечных точек, а также несколько безсерверных служб (шлюз API и Lambda) для запуска конечной точки из внешнего мира.
3. Используйте локальный клиент (мы используем Postman), чтобы отправить образец тестовых данных в развернутую модель в облаке и получить прогноз обратно клиенту. В этом нам на помощь приходят спокойные методы htttp.
Давайте рассмотрим подробное пошаговое упражнение ниже.
Обучение модели
- На локальном портативном компьютере используйте блокнот 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, которые мы создали и запустили, потому что если вы оставите какой-либо ресурс работающим или занимающим пространство, с вас будет взиматься плата за все время, пока ресурс остается. там…
Важно - Уборка, иначе вы оплачиваете сборы!
- Для SageMaker не забудьте удалить экземпляр записной книжки, конечную точку, конфигурацию и модель конечной точки. Вы можете перейти по этой ссылке для того же.
- Перейдите в сервис Lambda и удалите созданную вами функцию.
- Перейдите в сервис Cloudwatch, выберите «Группы журналов» и удалите группы журналов, которые вы там найдете.
- Перейдите в службу IAM и удалите роль и политику, которые вы создали для этого упражнения.
- Удалите запущенный API-шлюз.
На этом заканчивается упражнение по развертыванию модели в AWS SageMaker.
Надеюсь, вам понравилось и вы цените это ... Спасибо, что дошли до этого места !!