Mở rộng quy mô suy luận YOLOv5 bằng điểm cuối Amazon SageMaker và AWS Lambda PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Quy mô suy luận YOLOv5 với điểm cuối Amazon SageMaker và AWS Lambda

Sau khi các nhà khoa học dữ liệu cẩn thận đưa ra một mô hình học máy (ML) thỏa mãn, mô hình này phải được triển khai để các thành viên khác trong tổ chức có thể dễ dàng truy cập để suy luận. Tuy nhiên, việc triển khai các mô hình trên quy mô lớn với chi phí được tối ưu hóa và hiệu quả tính toán có thể là một nhiệm vụ khó khăn và cồng kềnh. Amazon SageMaker điểm cuối cung cấp một giải pháp dễ dàng mở rộng và tối ưu hóa chi phí để triển khai mô hình. Mô hình YOLOv5, được phân phối theo giấy phép GPLv3, là một mô hình phát hiện đối tượng phổ biến được biết đến với hiệu quả thời gian chạy cũng như độ chính xác của việc phát hiện. Trong bài đăng này, chúng tôi trình bày cách lưu trữ mô hình YOLOv5 được đào tạo trước trên các điểm cuối của SageMaker và sử dụng AWS Lambda hàm để gọi các điểm cuối này.

Tổng quan về giải pháp

Hình ảnh sau đây phác thảo các dịch vụ AWS được sử dụng để lưu trữ mô hình YOLOv5 bằng cách sử dụng điểm cuối SageMaker và gọi điểm cuối bằng Lambda. Máy tính xách tay SageMaker truy cập mô hình PyTorch YOLOv5 từ một Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3), chuyển đổi nó thành YOLOv5 TensorFlow SavedModel và lưu trữ nó trở lại nhóm S3. Mô hình này sau đó được sử dụng khi lưu trữ điểm cuối. Khi một hình ảnh được tải lên Amazon S3, nó hoạt động như một trình kích hoạt để chạy chức năng Lambda. Chức năng sử dụng OpenCV Lớp lambda để đọc hình ảnh đã tải lên và chạy suy luận bằng cách sử dụng điểm cuối. Sau khi suy luận được chạy, bạn có thể sử dụng kết quả thu được từ nó nếu cần.

Trong bài đăng này, chúng tôi hướng dẫn quy trình sử dụng mô hình mặc định YOLOv5 trong PyTorch và chuyển đổi nó thành TensorFlow SavedModel. Mô hình này được lưu trữ bằng cách sử dụng điểm cuối SageMaker. Sau đó, chúng tôi tạo và xuất bản một hàm Lambda gọi điểm cuối để chạy suy luận. Các mô hình YOLOv5 được đào tạo trước có sẵn trên GitHub. Với mục đích của bài đăng này, chúng tôi sử dụng yolov5l mô hình.

Điều kiện tiên quyết

Như một điều kiện tiên quyết, chúng tôi cần thiết lập những điều sau Quản lý truy cập và nhận dạng AWS (IAM) các vai trò thích hợp chính sách truy cập cho SageMaker, Lambda và Amazon S3:

  • Vai trò IAM của SageMaker - Điều này yêu cầu AmazonS3FullAccess các chính sách được đính kèm để lưu trữ và truy cập mô hình trong nhóm S3
  • Vai trò IAM của Lambda - Vai trò này cần nhiều chính sách:
    • Để truy cập hình ảnh được lưu trữ trong Amazon S3, chúng tôi yêu cầu các chính sách IAM sau:
      • s3:GetObject
      • s3:ListBucket
    • Để chạy điểm cuối SageMaker, chúng tôi cần quyền truy cập vào các chính sách IAM sau:
      • sagemaker:ListEndpoints
      • sagemaker:DescribeEndpoint
      • sagemaker:InvokeEndpoint
      • sagemaker:InvokeEndpointAsync

Bạn cũng cần các tài nguyên và dịch vụ sau:

  • Sản phẩm Giao diện dòng lệnh AWS (AWS CLI), mà chúng tôi sử dụng để tạo và định cấu hình Lambda.
  • Một phiên bản sổ ghi chép SageMaker. Chúng được cài đặt sẵn Docker và chúng tôi sử dụng nó để tạo các lớp Lambda. Để thiết lập phiên bản sổ tay, hãy hoàn thành các bước sau:
    • Trên bảng điều khiển SageMaker, tạo một phiên bản sổ ghi chép và cung cấp tên sổ ghi chép, loại phiên bản (đối với bài đăng này, chúng tôi sử dụng ml.c5.large), vai trò IAM và các tham số khác.
    • Sao chép kho lưu trữ công cộng và thêm Kho lưu trữ YOLOv5 được cung cấp bởi Ultralytics.

Lưu trữ YOLOv5 trên điểm cuối SageMaker

Trước khi có thể lưu trữ mô hình YOLOv5 đã được đào tạo trước trên SageMaker, chúng tôi phải xuất và đóng gói nó theo đúng cấu trúc thư mục bên trong model.tar.gz. Đối với bài đăng này, chúng tôi trình bày cách lưu trữ YOLOv5 trong saved_model định dạng. Repo YOLOv5 cung cấp một export.py tệp có thể xuất mô hình theo nhiều cách khác nhau. Sau khi bạn sao chép YOLOv5 và nhập thư mục YOLOv5 từ dòng lệnh, bạn có thể xuất mô hình bằng lệnh sau:

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

Lệnh này tạo một thư mục mới có tên là yolov5l_saved_model Bên trong yolov5 danh mục. Bên trong yolov5l_saved_model thư mục, chúng ta sẽ thấy các mục sau:

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

Để tạo ra một model.tar.gz tập tin, di chuyển nội dung của yolov5l_saved_model đến export/Servo/1. Từ dòng lệnh, chúng ta có thể nén export bằng cách chạy lệnh sau và tải mô hình lên thùng 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>"

Sau đó, chúng ta có thể triển khai điểm cuối SageMaker từ sổ ghi chép SageMaker bằng cách chạy mã sau:

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)

Tập lệnh trước mất khoảng 2-3 phút để triển khai đầy đủ mô hình tới điểm cuối SageMaker. Bạn có thể theo dõi trạng thái triển khai trên bảng điều khiển SageMaker. Sau khi mô hình được lưu trữ thành công, mô hình đã sẵn sàng để suy luận.

Kiểm tra điểm cuối SageMaker

Sau khi mô hình được lưu trữ thành công trên điểm cuối của SageMaker, chúng tôi có thể kiểm tra mô hình đó bằng cách sử dụng một hình ảnh trống. Mã thử nghiệm như sau:

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)

Thiết lập Lambda với các lớp và trình kích hoạt

Chúng tôi sử dụng OpenCV để chứng minh mô hình bằng cách truyền một hình ảnh và nhận kết quả suy luận. Lambda không đi kèm với các thư viện bên ngoài như OpenCV được tạo sẵn, do đó chúng ta cần xây dựng nó trước khi có thể gọi mã Lambda. Hơn nữa, chúng tôi muốn đảm bảo rằng chúng tôi không xây dựng các thư viện bên ngoài như OpenCV mỗi khi Lambda được gọi. Với mục đích này, Lambda cung cấp một chức năng để tạo các lớp Lambda. Chúng ta có thể xác định những gì diễn ra trong các lớp này và chúng có thể được sử dụng bởi mã Lambda mỗi khi nó được gọi. Chúng tôi cũng trình bày cách tạo các lớp Lambda cho OpenCV. Đối với bài đăng này, chúng tôi sử dụng một Đám mây điện toán đàn hồi Amazon (Amazon EC2) thể hiện để tạo các lớp.

Sau khi chúng tôi có các lớp ở vị trí, chúng tôi tạo app.py script, là mã Lambda sử dụng các lớp, chạy suy luận và nhận kết quả. Sơ đồ sau minh họa quy trình làm việc này.

Sự cho phép của Lambda

Tạo các lớp Lambda cho OpenCV bằng Docker

Sử dụng Dockerfile như sau để tạo hình ảnh Docker bằng 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/

Xây dựng và chạy Docker và lưu trữ tệp ZIP đầu ra trong thư mục hiện tại dưới 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

Bây giờ chúng ta có thể tải các tạo tác lớp OpenCV lên Amazon S3 và tạo lớp 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

Sau khi các lệnh trước chạy thành công, bạn có một lớp OpenCV trong Lambda, bạn có thể xem lại lớp này trên bảng điều khiển Lambda.

Bảng điều khiển Lambda

Tạo hàm Lambda

Chúng tôi sử dụng app.py script để tạo hàm Lambda và sử dụng OpenCV. Trong đoạn mã sau, hãy thay đổi các giá trị cho BUCKET_NAMEIMAGE_LOCATION đến vị trí để truy cập hình ảnh:

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
                }),
            }

Triển khai hàm Lambda với đoạn mã sau:

$ 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>"

Đính kèm lớp OpenCV vào hàm Lambda

Sau khi chúng ta có hàm và lớp Lambda tại chỗ, chúng ta có thể kết nối lớp với hàm như sau:

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

Chúng tôi có thể xem lại cài đặt lớp thông qua bảng điều khiển Lambda.

Cài đặt Lambda

Kích hoạt Lambda khi một hình ảnh được tải lên Amazon S3

Chúng tôi sử dụng tải hình ảnh lên Amazon S3 làm trình kích hoạt để chạy chức năng Lambda. Để được hướng dẫn, hãy tham khảo Hướng dẫn: Sử dụng trình kích hoạt Amazon S3 để gọi hàm Lambda.

Bạn sẽ thấy chi tiết chức năng sau trên bảng điều khiển Lambda.

tổng quan về chức năng

Chạy suy luận

Sau khi bạn thiết lập Lambda và điểm cuối SageMaker, bạn có thể kiểm tra đầu ra bằng cách gọi hàm Lambda. Chúng tôi sử dụng hình ảnh tải lên Amazon S3 làm trình kích hoạt để gọi Lambda, từ đó gọi ra điểm cuối để suy luận. Ví dụ: chúng tôi tải hình ảnh sau lên vị trí Amazon S3 <S3 PATH TO IMAGE>/test_image.png đã cấu hình trong phần trước.

thử nghiệm hình ảnh

Sau khi hình ảnh được tải lên, hàm Lambda được kích hoạt để tải xuống và đọc dữ liệu hình ảnh và gửi nó đến điểm cuối SageMaker để suy luận. Kết quả đầu ra từ điểm cuối SageMaker được hàm thu được và trả về ở định dạng JSON, chúng ta có thể sử dụng kết quả này theo nhiều cách khác nhau. Hình ảnh sau đây cho thấy ví dụ đầu ra được phủ trên hình ảnh.

kết quả suy luận

Làm sạch

Tùy thuộc vào loại phiên bản, máy tính xách tay SageMaker có thể yêu cầu mức sử dụng máy tính và chi phí đáng kể. Để tránh những chi phí không cần thiết, chúng tôi khuyên bạn nên dừng phiên bản sổ tay khi nó không được sử dụng. Ngoài ra, các hàm Lambda và điểm cuối SageMaker chỉ phải trả phí khi chúng được gọi. Do đó, không cần dọn dẹp cho các dịch vụ đó. Tuy nhiên, nếu một điểm cuối không còn được sử dụng nữa, bạn nên xóa điểm cuối và mô hình.

Kết luận

Trong bài đăng này, chúng tôi đã trình bày cách lưu trữ mô hình YOLOv5 được đào tạo trước trên điểm cuối SageMaker và sử dụng Lambda để gọi ra suy luận và xử lý đầu ra. Mã chi tiết có sẵn trên GitHub.

Để tìm hiểu thêm về các điểm cuối của SageMaker, hãy xem Tạo điểm cuối và triển khai mô hình của bạnXây dựng, kiểm tra và triển khai các mô hình suy luận Amazon SageMaker của bạn cho AWS Lambda, trong đó nêu bật cách bạn có thể tự động hóa quá trình triển khai các mô hình YOLOv5.


Giới thiệu về tác giả

Mở rộng quy mô suy luận YOLOv5 bằng điểm cuối Amazon SageMaker và AWS Lambda PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.Bài hát Kevin là Nhà khoa học dữ liệu về IoT Edge tại Dịch vụ Chuyên nghiệp của AWS. Kevin có bằng Tiến sĩ về Lý sinh tại Đại học Chicago. Ông có hơn 4 năm kinh nghiệm trong ngành về Thị giác máy tính và Học máy. Anh ấy tham gia vào việc giúp khách hàng trong ngành thể thao và khoa học đời sống triển khai các mô hình Học máy.

Mở rộng quy mô suy luận YOLOv5 bằng điểm cuối Amazon SageMaker và AWS Lambda PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.Romil Shah là Nhà khoa học dữ liệu Edge IoT tại Dịch vụ Chuyên nghiệp của AWS. Romil có hơn 6 năm kinh nghiệm trong ngành về Thị giác máy tính, Học máy và các thiết bị tiên tiến IoT. Anh ấy tham gia vào việc giúp khách hàng tối ưu hóa và triển khai các mô hình Học máy của họ cho các thiết bị tiên tiến để thiết lập công nghiệp.

Dấu thời gian:

Thêm từ Học máy AWS