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

Масштабуйте висновки YOLOv5 за допомогою кінцевих точок Amazon SageMaker і AWS Lambda

Після того, як спеціалісти з обробки даних ретельно розробили задовольняючу модель машинного навчання (ML), цю модель необхідно розгорнути, щоб вона була легко доступною для висновків іншими членами організації. Однак розгортання моделей у масштабі з оптимізованими витратами та ефективністю обчислень може бути складним і громіздким завданням. Amazon SageMaker кінцеві точки забезпечують легко масштабоване та економічно оптимізоване рішення для розгортання моделі. Модель 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. Потім ми створюємо та публікуємо лямбда-функцію, яка викликає кінцеву точку для виконання висновку. Попередньо навчені моделі YOLOv5 доступні на GitHub. Для цілей цієї публікації ми використовуємо yolov5l модель.

Передумови

Як передумова нам потрібно налаштувати наступне Управління ідентифікацією та доступом AWS (IAM) ролі з відповідними політики доступу для SageMaker, Lambda та Amazon S3:

  • Роль IAM SageMaker – Це вимагає AmazonS3FullAccess додані політики для зберігання та доступу до моделі в сегменті S3
  • Роль Lambda IAM – Ця роль вимагає кількох політик:
    • Щоб отримати доступ до зображень, що зберігаються в Amazon S3, нам потрібні такі політики IAM:
      • s3:GetObject
      • s3:ListBucket
    • Щоб запустити кінцеву точку SageMaker, нам потрібен доступ до таких політик IAM:
      • sagemaker:ListEndpoints
      • sagemaker:DescribeEndpoint
      • sagemaker:InvokeEndpoint
      • sagemaker:InvokeEndpointAsync

Вам також потрібні такі ресурси та послуги:

  • Команда Інтерфейс командного рядка AWS (AWS CLI), який ми використовуємо для створення та налаштування Lambda.
  • Примірник блокнота SageMaker. Вони поставляються з попередньо встановленим Docker, і ми використовуємо його для створення лямбда-шарів. Щоб налаштувати екземпляр блокнота, виконайте такі дії:
    • На консолі 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 надає функціональність для створення лямбда-шарів. Ми можемо визначити, що міститься в цих шарах, і вони можуть споживатися лямбда-кодом кожного разу, коли він викликається. Ми також демонструємо, як створити лямбда-шари для OpenCV. Для цієї публікації ми використовуємо Обчислювальна хмара Amazon Elastic (Amazon EC2) для створення шарів.

Після того, як шари на місці, ми створюємо app.py сценарій, який є лямбда-кодом, який використовує шари, виконує висновок і отримує результати. Наступна діаграма ілюструє цей робочий процес.

Лямбда дозвіл

Створюйте лямбда-шари для 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 сценарій для створення функції 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

Після того, як у нас є функція 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. Вертикальний пошук. Ai.Кевін Сонг є IoT Edge Data Scientist в AWS Professional Services. Кевін отримав ступінь доктора філософії з біофізики в Чиказькому університеті. Він має понад 4 роки досвіду роботи в галузі комп’ютерного зору та машинного навчання. Він допомагає клієнтам у галузі спорту та наук про життя розгортати моделі машинного навчання.

Масштабуйте висновки YOLOv5 за допомогою кінцевих точок Amazon SageMaker і AWS Lambda PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.Роміл Шах є IoT Edge Data Scientist в AWS Professional Services. Роміл має понад 6 років досвіду роботи в галузі комп’ютерного зору, машинного навчання та периферійних пристроїв Інтернету речей. Він допомагає клієнтам оптимізувати та розгортати їхні моделі машинного навчання для периферійних пристроїв для промислового налаштування.

Часова мітка:

Більше від AWS Машинне навчання