Существует множество способов развернуть конечную точку 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
  • Получение мощности графического процессора с помощью эластичного вывода

Спасибо за прочтение.