Возможно, у вас есть конечная точка SageMaker в Amazon Web Services (AWS), созданная путем загрузки существующей модели TensorFlow. Теперь вы можете выполнить некоторую дополнительную предварительную обработку перед отправкой входных данных в модель или постобработку после получения результатов из модели. На самом деле вы можете сделать это на самом AWS, используя функцию Lambda.

0. Предпосылки

  • Развернутая конечная точка SageMaker. (Имя конечной точки может быть примерно таким: «tensorflow-inference-202X-XX-XX-XX-XX-XX-XXX»)

1. Создайте новую политику для вызова конечной точки SageMaker.

В консоли AWS перейдите в раздел Сервисы > IAM > Политики > Создать политику > JSON. Очистите все и введите следующий фрагмент.

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

Пройдите мимо «Теги» и перейдите к «Политика проверки». Дайте политике имя «SagemakerInvokeEndpointPolicy» и создайте.

2. Создайте новую роль с «SagemakerInvokeEndpointPolicy».

В консоли AWS перейдите в раздел Сервисы > IAM > Роли > Создать роль > Сервис AWS > Lambda.

Идите вперед, затем найдите и добавьте политики «CloudWatchLogsFullAccess» и «SagemakerInvokeEndpointPolicy». Идите вперед, назовите роль «SagemakerInvokeEndpointRole» и создайте.

3. Создайте лямбда-функцию

В консоли AWS перейдите в раздел Сервисы > Lambda > Создать функцию > Создать с нуля. Внесите следующие изменения.

  • Имя функции = SagemakerInvokeEndpointFunction
  • Время выполнения = Python 3.7
  • Изменить роль выполнения по умолчанию –> Использовать существующую роль –> SagemakerInvokeEndpointRole

Создайте функцию.

4. Изменить конфигурации функций

Перейдите на вкладку «Конфигурация» лямбда-функции «SagemakerInvokeEndpointFunction». Измените следующие конфигурации.

Общая конфигурация

  • Память = 4096 МБ (зависит от препроцессинга и постобработки)
  • Таймаут = 1 мин (зависит от производительности модели)

Переменная среды

Добавьте переменную среды с именем конечной точки.

  • ENDPOINT_NAME = тензорный вывод-202X-XX-XX-XX-XX-XX-XXX

5. Отредактируйте код функции

Код может выглядеть следующим образом в зависимости от вашей модели. В этом случае входом в модель является словарь.

import os
import io
import boto3
import json

# grab environment variables
ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
runtime= boto3.client('runtime.sagemaker')


def lambda_handler(event, context):
    
    data = json.dumps(event, indent=2).encode('utf-8')

    # you can do preprocessing here.
    
    # run model
    response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                       ContentType='application/json',
                                       Body=data)

    results = json.loads(response['Body'].read().decode())

    # you can do postprocessing here.
    
    return results

Разверните функцию.

Остальное можно пропустить, если вы уже знакомы со шлюзами REST API на AWS.

6. Создайте шлюз REST API для функции.

В консоли AWS перейдите в раздел Сервисы > Шлюз API > REST API > Сборка. Внесите следующие изменения.

  • Выберите протокол = REST
  • Создать новый API = Новый API
  • Имя API = SagemakerInvokeEndpointAPI
  • Тип конечной точки = региональный

Создайте API.

Создать ресурс

Перейдите в раздел Действия > Создать ресурс. Внесите следующие изменения.

  • Имя ресурса = SagemakerInvokeEndpointAPIResource
  • Путь к ресурсу = sagemakerinvokeendpointapiresource (установится автоматически)

Создать метод POST

Перейдите в раздел Действия > Создать метод > POST. Внесите следующие изменения.

  • Тип интеграции = лямбда-функция
  • Лямбда-функция (имя) = SagemakerInvokeEndpointFunction

Нажмите «Сохранить». Вам будет предложено предоставить шлюзу API разрешение на вызов функции Lambda. Нажмите «ОК».

Развернуть API

Перейдите в раздел Действия > Развернуть API. Внесите следующие изменения.

  • Этап развертывания = [Новый этап]
  • Имя стадии = SagemakerInvokeEndpointAPIStage

Развертывать.

Скопировать URL вызова

На левой панели перейдите к SagemakerInvokeEndpointAPIStage/sagemakerinvokeendpointapiresource -> POST.

Скопируйте URL-адрес вызова.

7. Протестируйте удаленный вызов с библиотекой запросов Python3.

Вы можете использовать сценарий Python3, как показано ниже, для проверки удаленного вызова, если вы подключены к Интернету. (Не забудьте установить библиотеку requests с pip install requests перед выполнением.) Давайте определим следующие термины.

  • input_dict = станет data в коде «Раздел 5» при кодировании.
  • LIST_OF_INSTANCES = список входных образцов для модели (например, — [sample_0, sample_1, sample_2…])
  • INVOKE_URL = URL-адрес вызова, скопированный в конце «Раздел 6» в виде строки. Может выглядеть как «https://{API_ID}.execute-api.{REGION}.amazonaws.com/SagemakerInvokeEndpointAPIStage/sagemakerinvokeendpointapiresource».
  • results = то же, что и results в «разделе 5»code.
import requests

input_dict = {
  'instances': LIST_OF_INSTANCES
}

r = requests.post(url = INVOKE_URL, json = input_dict, headers = {'content-type': 'application/json'})

print(r)  # 200 for successfull execution

results = r.json()

predictions = results['predictions']

Рекомендации