В итоге

Заставьте свои приложения использовать обученную модель машинного обучения с помощью стандартных запросов REST с помощью SageMaker и TensorFlow.

При работе над проектом, требующим создания и обучения пользовательской модели машинного обучения, TensorFlow значительно упрощает работу. Он предоставляет вам большинство инструментов, которые вам понадобятся:

  • Обрабатывайте свои наборы данных.
  • Предварительно обработайте данные и постобработайте результаты модели.
  • Обучите свою модель.
  • Преобразуйте информацию в полезные визуализации (особенно при работе на ноутбуке Jupyter).
  • Сохраните предварительно обученные модели.
  • Тестовые выводы.
  • И Т. Д.

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

Реальное использование нашей обученной модели

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

Например, допустим, вы обучили модель на этом примере TensorFlow для извлечения маски сегментации домашнего животного по изображению. Когда пользователь загружает новое изображение питомца, нам нужно будет предварительно обработать изображение до допустимого формата, который может использовать модель, и постобработать результат, чтобы преобразовать маску сегментации во что-то, что имеет смысл для внутреннего использования. нашим бэкэндом или визуализируется извне в приложении. Примечание: в этой статье мы сосредоточимся на модели, основанной на сверточной нейронной сети, построенной с помощью Keras, но, по сути, ее следует применять к любой другой модели, построенной с помощью TensorFlow.

Sagemaker для обслуживания модельных выводов

Хотя TensorFlow уже предоставляет некоторые инструменты для обслуживания выводов вашей модели через свой API, с AWS SageMaker вы сможете выполнить остальную часть:

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

Вы можете продолжить, напрямую выбрав один из доступных готовых образов Docker при построении модели SageMaker, или вы можете создать свой собственный контейнер, следуя определенной структуре, и развернуть его через ECR. Преимущества выбора последнего заключаются в следующем:

  • Локальное тестирование вашей конечной точки вывода
  • Полный контроль над машиной

Amazon упростил работу по созданию контейнера, публикации и документированию таких проектов, как SageMaker TensorFlow Serving Container in GitHub, со всем готовым кодом, необходимым для локального запуска контейнера, что очень ценно.

Подготовка обслуживающего контейнера SageMaker TensorFlow

Клонируйте указанный репозиторий и выберите версию TensorFlow и необходимую архитектуру, чтобы запустить на своем компьютере контейнер, в котором будет размещена ваша модель.

Сохраните уже обученную модель:

import tensorflow as tf
tf.saved_model.save(model, "./savedmodels/imagesegmentation/1/")

Убедитесь, что модель сохранена правильно:

!saved_model_cli show --dir ./savedmodels/imagesegmentation/1/ --tag_set
serve --signature_def serving_default
# Output:
The given SavedModel SignatureDef contains the following input(s):
 inputs[‘input_2’] tensor_info:
 dtype: DT_FLOAT
 shape: (-1, 128, 128, 3)
 name: serving_default_input_2:0
The given SavedModel SignatureDef contains the following output(s):
 outputs[‘conv2d_transpose_4’] tensor_info:
 dtype: DT_FLOAT
 shape: (-1, 128, 128, 3)
 name: StatefulPartitionedCall:0
Method name is: tensorflow/serving/predict

И поместите его на контейнер, чтобы начать тестирование. Ожидаемое расположение: /opt/ml/model в контейнере, который используется совместно с вашим (хостовым) компьютером через test/resources/models.

├── models
    ├── petsegmentation
       ├── saved_model.pb
       └── variables
          ├── variables.data-00000-of-00001
          └── variables.index

На данный момент ваша модель уже доступна, и прогнозы можно запросить через HTTP…

curl -X POST --data-binary @test/resources/inputs/test-image-segmentation.json -H 'Content-Type: application/json' -H 'X-Amzn-SageMaker-Custom-butes: tfs-model-name=imagesegmentation' http://localhost:8080/invocations

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

Однако цель состоит в том, чтобы сделать конечную точку максимально доступной для наших приложений и избавить их от тяжелых вычислений. Итак, упростим дизайн API для работы со стандартными запросами application/json следующим образом:

Обработка данных до и после вывода может быть достигнута путем реализации методов input_handler и output_handler (или просто обработчика, который будет охватывать оба) в inference.py, который необходимо поместить в папку с именем code вместе с файлом requirements.txt с пакетами, которые необходимо установить. Окончательная структура будет выглядеть так:

├──   models
      ├── code
      │   ├── inference.py
      │   └── requirements.txt
      └── petsegmentation
         ├── saved_model.pb
         └── variables
            ├── variables.data-00000-of-00001
            └── variables.index

И файлы inference.py и requirements.txt, такие как:

# requirements.txt
numpy==1.17.4
tensorflow==2.0
# inference.py
import tensorflow as tf
import numpy as np
import requests
import base64
import json
import os
 
IMG_HEIGHT = 128
IMG_WIDTH = 128
 
 
def handler(data, context):
   """Handle request.
   Args:
       data (obj): the request data
       context (Context): an object containing request and configuration details
   Returns:
       (bytes, string): data to return to client, (optional) response content type
   """
   decoded_data = data.read().decode('utf-8')
 
   processed_input = _process_input(data, context)
   response = requests.post(context.rest_uri, data=processed_input)
   return _process_output(response, context)
 
def _process_input(data, context):
   if context.request_content_type == 'application/json':
       decoded_data = data.read().decode('utf-8')
 # Converts the JSON object to an array
 # that meets the model signature.
       image_array = image_to_array(decoded_data)
       return json.dumps({"inputs": [image_array]})
 
   raise ValueError('{{"error": "unsupported content type {}"}}'.format(
       context.request_content_type or "unknown"))
 
 
def _process_output(data, context, request_data):
   if data.status_code != 200:
       raise ValueError(data.content.decode('utf-8'))
 
   response_content_type = context.accept_header
   prediction = json.loads(data.content.decode('utf-8'))
   segmented_image = mask_to_image(prediction["outputs"])
 
   return json.dumps({"segmented_image": segmented_image}), response_content_type

Теперь наш контейнер готов к использованию реальными приложениями.

Развертывание контейнера и создание конечной точки

Отправьте свое пользовательское изображение в ECR, выполнив скрипт:

./scripts/publish.sh --version 1.14 --arch gpu --region eu-west-x

Сожмите и загрузите сохраненную модель и папку с кодом в корзину S3:

tar -czvf model.tar.gz imagesegmentation code
aws s3 cp model.tar.gz s3://model-bucket/mymodel/model.tar.gz

Создайте модель в Sagemaker, выбрав наше опубликованное пользовательское изображение и загрузив файл model.tar.gz и задав другие параметры, такие как версия TensorFlow и тип архитектуры:

# Create the model in Sagemaker
REGION="eu-west-x"
TFS_VERSION="1.14.0"
PROCESSOR_TYPE="gpu"
IMAGE="xxxx.dkr.ecr.$REGION.amazonaws.com/sagemaker-tensorflow-serving:$TFS_VERSION-$PROCESSOR_TYPE"
MODEL="petsegmentation"
 
# See the following document for more on SageMaker Roles:
# https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html
ROLE_ARN="arn:aws:iam::xxxx:role/service-role/my-role"
 
aws sagemaker create-model \
   --model-name $MODEL \
   --primary-container Image=$IMAGE,ModelDataUrl=s3://model-bucket/mymodel/model.tar.gz \
   --execution-role-arn $ROLE_ARN

Создайте конфигурацию конечной точки (со ссылкой на созданную модель SageMaker) и разверните конечную точку. Вам нужно будет выбрать экземпляры, которые лучше соответствуют вашим потребностям:

# You need to change the timestamp value with the output of deploy-model.sh
ENDPOINT_CONFIG_NAME="$MODEL-config"
INITIAL_INSTANCE_COUNT=1
INSTANCE_TYPE="ml.t3.xlarge"
 
# It creates endpoint configuration.
aws sagemaker create-endpoint-config \
   --endpoint-config-name $ENDPOINT_CONFIG_NAME \
   --production-variants VariantName=TFS,ModelName=$MODEL_NAME,InitialInstanceCount=$INITIAL_INSTANCE_COUNT,InstanceType=$INSTANCE_TYPE
 
# Create the endpoint
aws sagemaker create-endpoint \
   --endpoint-name $MODEL \
   --endpoint-config-name $ENDPOINT_CONFIG_NAME

И вуаля, конечная точка будет активна и доступна для обслуживания выводов через несколько минут. Команда invoke-endpoint позволит вам перепроверить успешность развертывания:

aws sagemaker-runtime invoke-endpoint \
   --endpoint-name petsegmentation \
   --content-type=application/json \
   --body "file://./test/resources/inputs/test-image-segmentation.json \
   response.json

Если все работает так, как ожидалось, вы должны получить json с обработанным прогнозом:

{"segmented_image": "/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA...Q

Использованная литература:

Первоначально опубликовано на https://www.gravitywell.co.uk.