Существует множество способов развернуть конечную точку AWS SageMaker как службу REST, один из которых представлен в блоге AWS с использованием функции Lambda. В этой статье я покажу, как это можно сделать без использования активных компонентов, таких как Lambda. Архитектурный обзор того, что мы собираемся настроить, будет иметь следующую простую структуру:
Подготовка модели
Во-первых, давайте обучим демонстрационную модель для SageMaker, в частности MNIST. Этот фрагмент кода проведет обучение и создаст файл model.tar.gz
в текущем каталоге.
Обязательно запустите pip install tensorflow
перед выполнением сценария обучения.
Сценарий сохранит файлы модели в каталоге ./model/{timestamp}
и создаст model.tar.gz
в текущем каталоге. Как правило, при создании моделей для SageMaker вам также необходимо предоставить образ докера, который содержит ваш код вывода, веб-сервер, соответствующие библиотеки и т. Д. Но поскольку мы используем модель тензорного потока, мы можем использовать управляемый AWS контейнер sagemaker-tensorflow-serving
в качестве образа вывода. Весь тяжелый и шаблонный код уже упакован в этот образ. Нам нужно только предоставить файл модели и, при необходимости, пользовательский код для предварительной / постобработки вывода.
Обслуживающий контейнер принимает в качестве входных данных только тип содержимого application/json
. Мы можем добавить собственный код вывода для обработки дополнительных типов контента, таких как полезные нагрузки изображений, но это выходит за рамки данной статьи.
Развертывание
После создания файла модели мы можем приступить к развертыванию AWS. Ниже представлена более подробная архитектура ресурсов AWS, используемых в этой настройке.
Обратите внимание, что все примеры построены с использованием terraform 0.12 (с синтаксисом HCL 2).
Сначала мы создадим корзину S3 и загрузим в нее пакет модели.
Теперь мы можем создать модель SageMaker и развернуть конечную точку.
Обратите внимание, что роль IAM, созданная здесь, предназначена только для демонстрационных целей, не используйте AmazonSageMakerFullAccess
политику в рабочей среде.
Развертывание конечной точки состоит из двух основных частей (помимо роли IAM).
Сначала создается модель. Он инкапсулирует роль, файл модели в корзине S3, образ докера вывода и некоторые переменные среды. Как упоминалось ранее, мы используем управляемый образ логического вывода AWS, который принадлежит 520713654638
аккаунту AWS.
Во-вторых, создается конфигурация конечной точки и сама конечная точка.
Развертывание обычно занимает 5–6 минут, так что наберитесь терпения :)
Теперь давайте протестируем конечную точку. Нам нужны тестовые данные в формате JSON
. Его можно извлечь из набора данных MNIST с помощью этого фрагмента кода.
Он сохранит отдельное изображение в payload.json
файл и распечатает ожидаемый результат (в данном случае 7
) в стандартный вывод. Вы можете изменить переменную idx
для извлечения других изображений. Обратите внимание, что весь результат инкапсулируется в дополнительный массив, потому что API может делать вывод сразу для нескольких изображений. Теперь мы можем вызвать sagemaker-runtime invoke-endpoint
для прогнозирования.
$ aws sagemaker-runtime invoke-endpoint --endpoint-name mnist-test --body file://payload.json --content-type application/json result.json { "ContentType": "application/json", "InvokedProductionVariant": "main" } $ cat res.json { "predictions": [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0] ] }
Пока все хорошо, но мы по-прежнему развернули только конечную точку SageMaker. Теперь самое интересное - интеграция с API Gateway.
Давайте сначала создадим обычные вещи, то есть REST-ресурс API Gateway, метод и ответ метода.
И, наконец, давайте создадим интеграцию с SageMaker. Для того, чтобы интеграция работала, нам нужна другая роль IAM, разрешающая доступ к API-шлюзу InvokeEndpoint и самому ресурсу интеграции.
Самая важная строка в этом коде - это URL-адрес ресурса интеграции, которого нет ни в документации, ни в примерах в документации AWS.
arn:aws:apigateway:${var.region}:runtime.sagemaker:path//endpoints/${aws_sagemaker_endpoint.endpoint.name}/invocations
Обратите внимание, что двойная косая черта (//
) преднамерена, без нее интеграция не будет работать. После успешного развертывания terraform выведет URL-адрес конечной точки вызова. Мы можем использовать наш payload.json
, чтобы делать прогнозы, используя curl
:
$ curl -XPOST https://{api-gw-id}.execute-api.eu-central-1.amazonaws.com/predict -H "Content-Type: application/json" -d @payload.json { "predictions": [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0] ] }
Пределы
Дополнительные сведения см. В ограничениях API Gateway и SageMaker Endpoint. Известные из них
- Максимальная полезная нагрузка ограничена 10 МБ API-шлюзом.
- Максимальное время выполнения 60 секунд с помощью SageMaker
Заключение
Это очень быстрый, простой, стабильный и экономичный способ создания гибких конечных точек вывода RESTish. Его можно расширить, чтобы также поддерживать
- Cognito или авторизация на основе статического ключа
- Частные развертывания VPC
- и все другие функции шлюзов API
- Автоматическое масштабирование с помощью SageMaker
- Получение мощности графического процессора с помощью эластичного вывода
Спасибо за прочтение.