После того, как специалисты по данным тщательно разработали удовлетворительную модель машинного обучения (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
- Для доступа к изображениям, хранящимся в Amazon S3, нам требуются следующие политики IAM:
Вам также потребуются следующие ресурсы и услуги:
- Ассоциация Интерфейс командной строки 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
каталог, мы должны увидеть следующие элементы:
Чтобы создать 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.
Об авторах
Кевин Сонг является специалистом по данным IoT Edge в AWS Professional Services. Кевин имеет степень доктора биофизики Чикагского университета. Он имеет более чем 4-летний опыт работы в области компьютерного зрения и машинного обучения. Он помогает клиентам из индустрии спорта и медико-биологических наук развертывать модели машинного обучения.
Ромил Шах является специалистом по данным IoT Edge в AWS Professional Services. Ромил имеет более чем 6-летний опыт работы в области компьютерного зрения, машинного обучения и периферийных устройств IoT. Он помогает клиентам оптимизировать и развертывать их модели машинного обучения для периферийных устройств для промышленной настройки.
- Продвинутый (300)
- AI
- ай искусство
- генератор искусств ай
- искусственный интеллект
- Создатель мудреца Амазонки
- искусственный интеллект
- сертификация искусственного интеллекта
- искусственный интеллект в банковском деле
- робот с искусственным интеллектом
- роботы с искусственным интеллектом
- программное обеспечение искусственного интеллекта
- AWS Lambda
- Машинное обучение AWS
- блокчейн
- конференция по блокчейну
- Coingenius
- Вычисление
- разговорный искусственный интеллект
- криптоконференция ИИ
- дал-и
- глубокое обучение
- google ai
- обучение с помощью машины
- Обнаружение объекта
- Платон
- Платон Ай
- Платон Интеллектуальные данные
- Платон игра
- ПлатонДанные
- платогейминг
- масштаб ай
- синтаксис
- Технические инструкции
- зефирнет