Масштабируйте логический вывод YOLOv5 с помощью конечных точек Amazon SageMaker и AWS Lambda PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Масштабируйте вывод YOLOv5 с помощью конечных точек Amazon SageMaker и AWS Lambda

После того, как специалисты по данным тщательно разработали удовлетворительную модель машинного обучения (ML), модель необходимо развернуть, чтобы она была легко доступна для вывода другими членами организации. Однако масштабное развертывание моделей с оптимизированными затратами и эффективностью вычислений может оказаться сложной и трудоемкой задачей. Создатель мудреца Амазонки конечные точки обеспечивают легко масштабируемое и оптимизированное по стоимости решение для развертывания модели. Модель YOLOv5, распространяемая по лицензии GPLv3, является популярной моделью обнаружения объектов, известной своей эффективностью во время выполнения, а также точностью обнаружения. В этом посте мы покажем, как разместить предварительно обученную модель YOLOv5 на конечных точках SageMaker и использовать AWS Lambda функции для вызова этих конечных точек.

Обзор решения

На следующем изображении показаны сервисы AWS, используемые для размещения модели YOLOv5 с использованием конечной точки SageMaker и вызова конечной точки с помощью Lambda. Блокнот SageMaker получает доступ к модели YOLOv5 PyTorch из Простой сервис хранения Amazon (Amazon S3), преобразует его в YOLOv5 TensorFlow. SavedModel формат и сохраняет его обратно в корзину S3. Затем эта модель используется при размещении конечной точки. Когда изображение загружается в Amazon S3, оно действует как триггер для запуска функции Lambda. Функция использует OpenCV Лямбда-слои чтобы прочитать загруженное изображение и выполнить вывод, используя конечную точку. После запуска логического вывода вы можете использовать полученные результаты по мере необходимости.

В этом посте мы рассмотрим процесс использования модели по умолчанию YOLOv5 в PyTorch и преобразования ее в TensorFlow. SavedModel. Эта модель размещается с использованием конечной точки SageMaker. Затем мы создаем и публикуем функцию Lambda, которая вызывает конечную точку для выполнения логического вывода. Предварительно обученные модели YOLOv5 доступны на GitHub. Для целей этого поста мы используем йолов5л модели.

Предпосылки

В качестве предварительного условия нам необходимо настроить следующее Управление идентификацией и доступом AWS (IAM) роли с соответствующими политики доступа для SageMaker, Lambda и Amazon S3:

  • IAM-роль SageMaker - Это требует AmazonS3FullAccess прикрепленные политики для хранения и доступа к модели в корзине S3
  • Лямбда IAM роль – Для этой роли требуется несколько политик:
    • Для доступа к изображениям, хранящимся в Amazon S3, нам требуются следующие политики IAM:
      • s3:GetObject
      • s3:ListBucket
    • Чтобы запустить конечную точку SageMaker, нам нужен доступ к следующим политикам IAM:
      • sagemaker:ListEndpoints
      • sagemaker:DescribeEndpoint
      • sagemaker:InvokeEndpoint
      • sagemaker:InvokeEndpointAsync

Вам также потребуются следующие ресурсы и услуги:

  • Ассоциация Интерфейс командной строки AWS (AWS CLI), который мы используем для создания и настройки Lambda.
  • Экземпляр записной книжки SageMaker. Они поставляются с предустановленным Docker, и мы используем его для создания слоев Lambda. Чтобы настроить экземпляр записной книжки, выполните следующие действия:
    • В консоли SageMaker создайте экземпляр блокнота и укажите имя блокнота, тип экземпляра (в этом посте мы используем ml.c5.large), роль IAM и другие параметры.
    • Клонировать публичный репозиторий и добавить YOLOv5 репозиторий предоставлено Ultralytics.

Размещение YOLOv5 на конечной точке SageMaker

Прежде чем мы сможем разместить предварительно обученную модель YOLOv5 в SageMaker, мы должны экспортировать и упаковать ее в правильную структуру каталогов внутри. model.tar.gz. В этом посте мы покажем, как разместить YOLOv5 в saved_model формат. Репозиторий YOLOv5 предоставляет export.py файл, который может экспортировать модель разными способами. После того, как вы клонируете YOLOv5 и входите в каталог YOLOv5 из командной строки, вы можете экспортировать модель с помощью следующей команды:

$ cd yolov5
$ pip install -r requirements.txt tensorflow-cpu
$ python export.py --weights yolov5l.pt --include saved_model --nms

Эта команда создает новый каталог с именем yolov5l_saved_model внутри yolov5 каталог. Внутри yolov5l_saved_model каталог, мы должны увидеть следующие элементы:

yolov5l_saved_model
    ├─ assets
    ├─ variables
    │    ├── variables.data-00000-of-00001
    │    └── variables.index
    └── saved_model.pb

Чтобы создать model.tar.gz файл, переместите содержимое yolov5l_saved_model в export/Servo/1. Из командной строки мы можем сжать export каталоге, выполнив следующую команду, и загрузите модель в корзину S3:

$ mkdir export && mkdir export/Servo
$ mv yolov5l_saved_model export/Servo/1
$ tar -czvf model.tar.gz export/
$ aws s3 cp model.tar.gz "<s3://BUCKET/PATH/model.tar.gz>"

Затем мы можем развернуть конечную точку SageMaker из записной книжки SageMaker, выполнив следующий код:

import os
import tensorflow as tf
from tensorflow.keras import backend
from sagemaker.tensorflow import TensorFlowModel

model_data = '<s3://BUCKET/PATH/model.tar.gz>'
role = '<IAM ROLE>'

model = TensorFlowModel(model_data=model_data,
                        framework_version='2.8', role=role)

INSTANCE_TYPE = 'ml.m5.xlarge'
ENDPOINT_NAME = 'yolov5l-demo'

predictor = model.deploy(initial_instance_count=1,
                            instance_type=INSTANCE_TYPE,
                            endpoint_name=ENDPOINT_NAME)

Предыдущий сценарий занимает примерно 2–3 минуты для полного развертывания модели на конечной точке SageMaker. Вы можете отслеживать состояние развертывания на консоли SageMaker. После успешного размещения модели модель готова к выводу.

Протестируйте конечную точку SageMaker

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

import numpy as np

ENDPOINT_NAME = 'yolov5l-demo'

modelHeight, modelWidth = 640, 640
blank_image = np.zeros((modelHeight,modelWidth,3), np.uint8)
data = np.array(resized_image.astype(np.float32)/255.)
payload = json.dumps([data.tolist()])
response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
ContentType='application/json',
Body=payload)

result = json.loads(response['Body'].read().decode())
print('Results: ', result)

Настройте Lambda со слоями и триггерами

Мы используем OpenCV для демонстрации модели, передавая изображение и получая результаты вывода. Lambda не поставляется с предварительно созданными внешними библиотеками, такими как OpenCV, поэтому нам нужно собрать его, прежде чем мы сможем вызывать код Lambda. Кроме того, мы хотим убедиться, что мы не создаем внешние библиотеки, такие как OpenCV, каждый раз, когда вызывается Lambda. Для этой цели Lambda предоставляет функциональные возможности для создания слоев Lambda. Мы можем определить, что происходит в этих слоях, и они могут использоваться лямбда-кодом каждый раз, когда он вызывается. Мы также покажем, как создавать слои Lambda для OpenCV. Для этого поста мы используем Эластичное вычислительное облако Amazon (Amazon EC2) для создания слоев.

После того, как у нас есть слои, мы создаем app.py сценарий, представляющий собой лямбда-код, который использует слои, выполняет вывод и получает результаты. Следующая диаграмма иллюстрирует этот рабочий процесс.

Лямбда-разрешение

Создайте слои Lambda для OpenCV с помощью Docker

Используйте Dockerfile следующим образом, чтобы создать образ Docker с помощью Python 3.7:

FROM amazonlinux

RUN yum update -y
RUN yum install gcc openssl-devel bzip2-devel libffi-devel wget tar gzip zip make -y

# Install Python 3.7
WORKDIR /
RUN wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz
RUN tar -xzvf Python-3.7.12.tgz
WORKDIR /Python-3.7.12
RUN ./configure --enable-optimizations
RUN make altinstall

# Install Python packages
RUN mkdir /packages
RUN echo "opencv-python" >> /packages/requirements.txt
RUN mkdir -p /packages/opencv-python-3.7/python/lib/python3.7/site-packages
RUN pip3.7 install -r /packages/requirements.txt -t /packages/opencv-python-3.7/python/lib/python3.7/site-packages

# Create zip files for Lambda Layer deployment
WORKDIR /packages/opencv-python-3.7/
RUN zip -r9 /packages/cv2-python37.zip .
WORKDIR /packages/
RUN rm -rf /packages/opencv-python-3.7/

Соберите и запустите Docker и сохраните выходной ZIP-файл в текущем каталоге в layers:

$ docker build --tag aws-lambda-layers:latest <PATH/TO/Dockerfile>
$ docker run -rm -it -v $(pwd):/layers aws-lambda-layers cp /packages/cv2-python37.zip /layers

Теперь мы можем загрузить артефакты слоя OpenCV в Amazon S3 и создать слой Lambda:

$ aws s3 cp layers/cv2-python37.zip s3://<BUCKET>/<PATH/TO/STORE/ARTIFACTS>
$ aws lambda publish-layer-version --layer-name cv2 --description "Open CV" --content S3Bucket=<BUCKET>,S3Key=<PATH/TO/STORE/ARTIFACTS>/cv2-python37.zip --compatible-runtimes python3.7

После успешного выполнения предыдущих команд у вас есть слой OpenCV в Lambda, который вы можете просмотреть в консоли Lambda.

Лямбда-консоль

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

Мы используем app.py script для создания функции Lambda и использования OpenCV. В следующем коде измените значения для BUCKET_NAME и IMAGE_LOCATION в место для доступа к изображению:

import os, logging, json, time, urllib.parse
import boto3, botocore
import numpy as np, cv2

logger = logging.getLogger()
logger.setLevel(logging.INFO)
client = boto3.client('lambda')

# S3 BUCKETS DETAILS
s3 = boto3.resource('s3')
BUCKET_NAME = "<NAME OF S3 BUCKET FOR INPUT IMAGE>"
IMAGE_LOCATION = "<S3 PATH TO IMAGE>/image.png"

# INFERENCE ENDPOINT DETAILS
ENDPOINT_NAME = 'yolov5l-demo'
config = botocore.config.Config(read_timeout=80)
runtime = boto3.client('runtime.sagemaker', config=config)
modelHeight, modelWidth = 640, 640

# RUNNING LAMBDA
def lambda_handler(event, context):
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')

    # INPUTS - Download Image file from S3 to Lambda /tmp/
    input_imagename = key.split('/')[-1]
    logger.info(f'Input Imagename: {input_imagename}')
    s3.Bucket(BUCKET_NAME).download_file(IMAGE_LOCATION + '/' + input_imagename, '/tmp/' + input_imagename)

    # INFERENCE - Invoke the SageMaker Inference Endpoint
    logger.info(f'Starting Inference ... ')
    orig_image = cv2.imread('/tmp/' + input_imagename)
    if orig_image is not None:
        start_time_iter = time.time()
        # pre-processing input image
        image = cv2.resize(orig_image.copy(), (modelWidth, modelHeight), interpolation = cv2.INTER_AREA)
        data = np.array(image.astype(np.float32)/255.)
        payload = json.dumps([data.tolist()])
        # run inference
        response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME, ContentType='application/json', Body=payload)
        # get the output results
        result = json.loads(response['Body'].read().decode())
        end_time_iter = time.time()
        # get the total time taken for inference
        inference_time = round((end_time_iter - start_time_iter)*100)/100
    logger.info(f'Inference Completed ... ')

    # OUTPUTS - Using the output to utilize in other services downstream
    return {
        "statusCode": 200,
        "body": json.dumps({
                "message": "Inference Time:// " + str(inference_time) + " seconds.",
                "results": result
                }),
            }

Разверните функцию Lambda с помощью следующего кода:

$ zip app.zip app.py
$ aws s3 cp app.zip s3://<BUCKET>/<PATH/TO/STORE/FUNCTION>
$ aws lambda create-function --function-name yolov5-lambda --handler app.lambda_handler --region us-east-1 --runtime python3.7 --environment "Variables={BUCKET_NAME=$BUCKET_NAME,S3_KEY=$S3_KEY}" --code S3Bucket=<BUCKET>,S3Key="<PATH/TO/STORE/FUNCTION/app.zip>"

Прикрепите слой OpenCV к функции Lambda.

После того, как у нас есть лямбда-функция и слой, мы можем подключить слой к функции следующим образом:

$ aws lambda update-function-configuration --function-name yolov5-lambda --layers cv2

Мы можем просмотреть настройки слоя через консоль Lambda.

Лямбда-настройки

Запуск Lambda при загрузке изображения в Amazon S3

Мы используем загрузку изображения в Amazon S3 в качестве триггера для запуска функции Lambda. Инструкции см. Учебное пособие. Использование триггера Amazon S3 для вызова функции Lambda.

Вы должны увидеть следующую информацию о функции на консоли Lambda.

обзор функций

Запустить вывод

После настройки Lambda и конечной точки SageMaker можно проверить вывод, вызвав функцию Lambda. Мы используем загрузку изображения в Amazon S3 в качестве триггера для вызова Lambda, который, в свою очередь, вызывает конечную точку для вывода. В качестве примера мы загружаем следующее изображение в местоположение Amazon S3. <S3 PATH TO IMAGE>/test_image.png настроен в предыдущем разделе.

тестовое изображение

После загрузки изображения запускается функция Lambda, которая загружает и считывает данные изображения и отправляет их на конечную точку SageMaker для вывода. Результат вывода из конечной точки SageMaker получается и возвращается функцией в формате JSON, который мы можем использовать по-разному. На следующем изображении показан пример вывода, наложенного на изображение.

результат вывода

Убирать

В зависимости от типа экземпляра ноутбуки SageMaker могут требовать значительного использования вычислительных ресурсов и затрат. Чтобы избежать ненужных затрат, мы рекомендуем останавливать экземпляр ноутбука, когда он не используется. Кроме того, функции Lambda и конечные точки SageMaker оплачиваются только при их вызове. Поэтому для этих служб не требуется никакой очистки. Однако, если конечная точка больше не используется, рекомендуется удалить конечную точку и модель.

Заключение

В этом посте мы продемонстрировали, как разместить предварительно обученную модель YOLOv5 на конечной точке SageMaker и использовать Lambda для вызова логических выводов и обработки выходных данных. Подробный код доступен на GitHub.

Чтобы узнать больше о конечных точках SageMaker, см. Создайте свою конечную точку и разверните свою модель и Создавайте, тестируйте и развертывайте свои модели логических выводов Amazon SageMaker в AWS Lambda, в котором рассказывается, как можно автоматизировать процесс развертывания моделей YOLOv5.


Об авторах

Масштабируйте логический вывод YOLOv5 с помощью конечных точек Amazon SageMaker и AWS Lambda PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.Кевин Сонг является специалистом по данным IoT Edge в AWS Professional Services. Кевин имеет степень доктора биофизики Чикагского университета. Он имеет более чем 4-летний опыт работы в области компьютерного зрения и машинного обучения. Он помогает клиентам из индустрии спорта и медико-биологических наук развертывать модели машинного обучения.

Масштабируйте логический вывод YOLOv5 с помощью конечных точек Amazon SageMaker и AWS Lambda PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.Ромил Шах является специалистом по данным IoT Edge в AWS Professional Services. Ромил имеет более чем 6-летний опыт работы в области компьютерного зрения, машинного обучения и периферийных устройств IoT. Он помогает клиентам оптимизировать и развертывать их модели машинного обучения для периферийных устройств для промышленной настройки.

Отметка времени:

Больше от Машинное обучение AWS