Amazon SageMaker uç noktaları ve AWS Lambda PlatoBlockchain Veri Zekası ile YOLOv5 çıkarımını ölçeklendirin. Dikey Arama. Ai.

YOLOv5 çıkarımını Amazon SageMaker uç noktaları ve AWS Lambda ile ölçeklendirin

Veri bilimcileri dikkatli bir şekilde tatmin edici bir makine öğrenimi (ML) modeli bulduktan sonra, modelin kuruluşun diğer üyelerinin çıkarımları için kolayca erişilebilecek şekilde dağıtılması gerekir. Ancak modelleri optimize edilmiş maliyet ve bilgi işlem verimliliğiyle geniş ölçekte dağıtmak göz korkutucu ve hantal bir iş olabilir. Amazon Adaçayı Yapıcı uç noktalar, model dağıtımı için kolayca ölçeklenebilir ve maliyeti optimize edilmiş bir çözüm sağlar. GPLv5 lisansı altında dağıtılan YOLOv3 modeli, çalışma zamanı verimliliği ve algılama doğruluğu ile bilinen popüler bir nesne algılama modelidir. Bu yazıda, önceden eğitilmiş bir YOLOv5 modelinin SageMaker uç noktalarında nasıl barındırılacağını ve kullanılacağını gösteriyoruz. AWS Lambda Bu uç noktaları çağırmak için işlevler.

Çözüme genel bakış

Aşağıdaki resimde, bir SageMaker uç noktası kullanarak YOLOv5 modelini barındırmak ve Lambda kullanarak uç noktayı çağırmak için kullanılan AWS hizmetleri özetlenmektedir. SageMaker dizüstü bilgisayar, YOLOv5 PyTorch modeline bir Amazon Basit Depolama Hizmeti (Amazon S3) kovası, onu YOLOv5 TensorFlow'a dönüştürür SavedModel biçimine dönüştürür ve S3 klasörüne geri kaydeder. Bu model daha sonra uç noktayı barındırırken kullanılır. Amazon S3'e bir görüntü yüklendiğinde Lambda işlevini çalıştırmak için tetikleyici görevi görür. İşlev OpenCV'yi kullanır Lambda katmanları yüklenen görüntüyü okumak ve uç noktayı kullanarak çıkarım yapmak için. Çıkarım çalıştırıldıktan sonra, bundan elde edilen sonuçları gerektiği gibi kullanabilirsiniz.

Bu yazıda, PyTorch'ta YOLOv5 varsayılan modelini kullanma ve onu TensorFlow'a dönüştürme sürecini inceleyeceğiz. SavedModel. Bu model bir SageMaker uç noktası kullanılarak barındırılır. Daha sonra çıkarımı çalıştırmak için uç noktayı çağıran bir Lambda işlevi oluşturup yayınlıyoruz. Önceden eğitilmiş YOLOv5 modelleri şu adreste mevcuttur: GitHub. Bu yazının amacı doğrultusunda, şunu kullanıyoruz: yolov5l modeli.

Önkoşullar

Önkoşul olarak aşağıdakileri ayarlamamız gerekir: AWS Kimlik ve Erişim Yönetimi (IAM) rolleri uygun erişim politikaları SageMaker, Lambda ve Amazon S3 için:

  • SageMaker IAM rolü - Bu gerektirir AmazonS3FullAccess Modelin S3 klasöründe saklanması ve modele erişim için eklenen politikalar
  • Lambda IAM rolü – Bu rolün birden fazla politikaya ihtiyacı var:
    • Amazon S3'te depolanan görüntülere erişmek için aşağıdaki IAM politikalarına ihtiyacımız var:
      • s3:GetObject
      • s3:ListBucket
    • SageMaker uç noktasını çalıştırmak için aşağıdaki IAM politikalarına erişmemiz gerekir:
      • sagemaker:ListEndpoints
      • sagemaker:DescribeEndpoint
      • sagemaker:InvokeEndpoint
      • sagemaker:InvokeEndpointAsync

Ayrıca aşağıdaki kaynaklara ve hizmetlere de ihtiyacınız var:

  • The AWS Komut Satırı Arayüzü (AWS CLI) Lambda'yı oluşturmak ve yapılandırmak için kullanıyoruz.
  • Bir SageMaker not defteri örneği. Bunlar Docker önceden yüklenmiş olarak gelir ve bunu Lambda katmanlarını oluşturmak için kullanırız. Not defteri örneğini ayarlamak için aşağıdaki adımları tamamlayın:
    • SageMaker konsolunda bir not defteri örneği oluşturun ve not defteri adını, örnek türünü (bu gönderi için ml.c5.large kullanıyoruz), IAM rolünü ve diğer parametreleri sağlayın.
    • klonlamak halka açık depo ve ekle YOLOv5 deposu Ultralytics tarafından sağlanmıştır.

YOLOv5'i SageMaker uç noktasında barındırın

Önceden eğitilmiş YOLOv5 modelini SageMaker'da barındırmadan önce, onu dışarı aktarmalı ve içindeki doğru dizin yapısında paketlemeliyiz. model.tar.gz. Bu yazı için YOLOv5'in nasıl barındırılacağını gösteriyoruz. saved_model biçim. YOLOv5 deposu şunları sağlar: export.py Modeli birçok farklı şekilde dışa aktarabilen dosya. YOLOv5'i klonlayıp komut satırından YOLOv5 dizinine girdikten sonra aşağıdaki komutla modeli dışa aktarabilirsiniz:

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

Bu komut adında yeni bir dizin oluşturur. yolov5l_saved_model içinde yolov5 dizin. İçinde yolov5l_saved_model dizinde aşağıdaki öğeleri görmeliyiz:

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

Bir oluşturmak için model.tar.gz dosyanın içeriğini taşıyın yolov5l_saved_model için export/Servo/1. Komut satırından sıkıştırabiliriz export Aşağıdaki komutu çalıştırarak dizini açın ve modeli S3 klasörüne yükleyin:

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

Ardından, aşağıdaki kodu çalıştırarak bir SageMaker not defterinden bir SageMaker uç noktası dağıtabiliriz:

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)

Önceki betiğin modeli SageMaker uç noktasına tam olarak dağıtması yaklaşık 2-3 dakika sürer. Dağıtımın durumunu SageMaker konsolunda izleyebilirsiniz. Model başarıyla barındırıldıktan sonra model çıkarım için hazırdır.

SageMaker uç noktasını test edin

Model bir SageMaker uç noktasında başarılı bir şekilde barındırıldıktan sonra onu test edebiliriz ve bunu boş bir görüntü kullanarak yaparız. Test kodu aşağıdaki gibidir:

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'yı katmanlar ve tetikleyicilerle ayarlama

Bir görüntüyü aktararak ve çıkarım sonuçlarını alarak modeli göstermek için OpenCV'yi kullanıyoruz. Lambda, OpenCV gibi önceden oluşturulmuş harici kütüphanelerle birlikte gelmez, bu nedenle Lambda kodunu çağırmadan önce onu oluşturmamız gerekir. Ayrıca Lambda her çağrıldığında OpenCV gibi harici kütüphaneler oluşturmadığımızdan emin olmak istiyoruz. Bu amaçla Lambda, Lambda katmanları oluşturmaya yönelik bir işlevsellik sağlar. Bu katmanlarda neler olduğunu tanımlayabiliriz ve Lambda kodu her çağrıldığında bunlar tüketilebilir. Ayrıca OpenCV için Lambda katmanlarının nasıl oluşturulacağını da gösteriyoruz. Bu yazı için bir tane kullanıyoruz Amazon Elastik Bilgi İşlem Bulutu Katmanları oluşturmak için (Amazon EC2) örneğini kullanın.

Katmanları yerleştirdikten sonra oluşturuyoruz. app.py Katmanları kullanan Lambda kodu olan komut dosyası, çıkarımı çalıştırır ve sonuçları alır. Aşağıdaki şemada bu iş akışı gösterilmektedir.

Lambda izni

Docker'ı kullanarak OpenCV için Lambda katmanları oluşturma

Python 3.7 kullanarak Docker görüntüsünü oluşturmak için Dockerfile'ı aşağıdaki gibi kullanın:

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'ı derleyip çalıştırın ve çıktı ZIP dosyasını aşağıdaki geçerli dizinde saklayın. 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

Artık OpenCV katmanı yapıtlarını Amazon S3'e yükleyebilir ve Lambda katmanını oluşturabiliriz:

$ 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

Önceki komutlar başarıyla çalıştırıldıktan sonra Lambda'da Lambda konsolunda inceleyebileceğiniz bir OpenCV katmanınız olur.

Lambda konsolu

Lambda işlevini oluşturun

biz kullanıyoruz app.py Lambda işlevini oluşturmak ve OpenCV'yi kullanmak için komut dosyası. Aşağıdaki kodda değerleri değiştirin BUCKET_NAME ve IMAGE_LOCATION resme erişeceğiniz konuma:

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 işlevini aşağıdaki kodla dağıtın:

$ 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 katmanını Lambda işlevine ekleyin

Lambda fonksiyonunu ve katmanını yerleştirdikten sonra, katmanı fonksiyona şu şekilde bağlayabiliriz:

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

Katman ayarlarını Lambda konsolu üzerinden inceleyebiliriz.

Lambda ayarları

Amazon S3'e bir görüntü yüklendiğinde Lambda'yı tetikleyin

Lambda işlevini çalıştırmak için tetikleyici olarak Amazon S3'e bir görüntü yüklemesi kullanıyoruz. Talimatlar için bkz. Öğretici: Lambda işlevini çağırmak için Amazon S3 tetikleyicisini kullanma.

Lambda konsolunda aşağıdaki işlev ayrıntılarını görmelisiniz.

fonksiyona genel bakış

çıkarımı çalıştır

Lambda'yı ve SageMaker uç noktasını ayarladıktan sonra Lambda işlevini çağırarak çıkışı test edebilirsiniz. Lambda'yı çağırmak için tetikleyici olarak Amazon S3'e bir görüntü yüklemesi kullanıyoruz, bu da sonuç olarak uç noktayı çıkarım için çağırıyor. Örnek olarak aşağıdaki görseli Amazon S3 konumuna yüklüyoruz <S3 PATH TO IMAGE>/test_image.png önceki bölümde yapılandırıldı.

test görüntüsü

Görüntü yüklendikten sonra görüntü verilerini indirip okumak ve çıkarım için SageMaker uç noktasına göndermek üzere Lambda işlevi tetiklenir. SageMaker uç noktasından gelen çıktı sonucu, farklı şekillerde kullanabileceğimiz JSON formatındaki fonksiyon tarafından elde edilir ve döndürülür. Aşağıdaki resimde, resmin üzerine yerleştirilmiş örnek çıktı gösterilmektedir.

çıkarım sonucu

Temizlemek

Bulut sunucusu tipine bağlı olarak SageMaker dizüstü bilgisayarlar önemli miktarda bilgi işlem kullanımı ve maliyeti gerektirebilir. Gereksiz maliyetlerden kaçınmak için dizüstü bilgisayar örneğini kullanılmadığında durdurmanızı öneririz. Ayrıca Lambda işlevleri ve SageMaker uç noktaları yalnızca çağrıldıklarında ücrete tabidir. Bu nedenle bu hizmetler için herhangi bir temizleme işlemine gerek yoktur. Ancak bir uç nokta artık kullanılmıyorsa uç noktayı ve modeli kaldırmak iyi bir uygulamadır.

Sonuç

Bu yazıda, önceden eğitilmiş bir YOLOv5 modelini SageMaker uç noktasında nasıl barındıracağımızı ve çıkarımı çağırmak ve çıktıyı işlemek için Lambda'yı nasıl kullanacağımızı gösterdik. Ayrıntılı kod şu adreste mevcuttur: GitHub.

SageMaker uç noktaları hakkında daha fazla bilgi edinmek için şuraya göz atın: Uç noktanızı oluşturun ve modelinizi dağıtın ve Amazon SageMaker çıkarım modellerinizi oluşturun, test edin ve AWS Lambda'ya dağıtınYOLOv5 modellerini dağıtma sürecini nasıl otomatikleştirebileceğinizi vurgulayan.


yazarlar hakkında

Amazon SageMaker uç noktaları ve AWS Lambda PlatoBlockchain Veri Zekası ile YOLOv5 çıkarımını ölçeklendirin. Dikey Arama. Ai.kevin şarkı AWS Profesyonel Hizmetler'de IoT Edge Veri Bilimcisidir. Kevin, Chicago Üniversitesi'nden Biyofizik alanında doktora derecesine sahiptir. Bilgisayarlı Görü ve Makine Öğrenimi alanında 4 yıldan fazla sektör tecrübesine sahiptir. Spor ve yaşam bilimleri sektöründeki müşterilerin Makine Öğrenimi modellerini dağıtmalarına yardımcı olmaya çalışmaktadır.

Amazon SageMaker uç noktaları ve AWS Lambda PlatoBlockchain Veri Zekası ile YOLOv5 çıkarımını ölçeklendirin. Dikey Arama. Ai.Romil Şah AWS Profesyonel Hizmetler'de IoT Edge Veri Bilimcisidir. Romil'in Görüntü İşleme, Makine Öğrenimi ve IoT uç cihazlarında 6 yılı aşkın sektör deneyimi vardır. Müşterilerin endüstriyel kurulum için uç cihazlara yönelik Makine Öğrenimi modellerini optimize etmelerine ve dağıtmalarına yardımcı oluyor.

Zaman Damgası:

Den fazla AWS Makine Öğrenimi