Prilagodite sklepanje YOLOv5 s končnimi točkami Amazon SageMaker in AWS Lambda PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Prilagodite sklepanje YOLOv5 s končnimi točkami Amazon SageMaker in AWS Lambda

Potem ko podatkovni znanstveniki skrbno pripravijo zadovoljiv model strojnega učenja (ML), je treba model uvesti tako, da je lahko dostopen za sklepanje drugim članom organizacije. Vendar pa je uvajanje modelov v obsegu z optimiziranimi stroški in računalniško učinkovitostjo lahko zastrašujoča in okorna naloga. Amazon SageMaker končne točke zagotavljajo enostavno razširljivo in stroškovno optimizirano rešitev za uvajanje modela. Model YOLOv5, ki se distribuira pod licenco GPLv3, je priljubljen model za zaznavanje objektov, znan po učinkovitosti izvajanja in natančnosti zaznavanja. V tej objavi prikazujemo, kako gostiti predhodno usposobljen model YOLOv5 na končnih točkah SageMaker in uporabljati AWS Lambda funkcije za priklic teh končnih točk.

Pregled rešitev

Naslednja slika opisuje storitve AWS, ki se uporabljajo za gostovanje modela YOLOv5 z uporabo končne točke SageMaker in priklic končne točke z uporabo Lambda. Prenosni računalnik SageMaker dostopa do modela YOLOv5 PyTorch iz Preprosta storitev shranjevanja Amazon (Amazon S3) vedro, ga pretvori v YOLOv5 TensorFlow SavedModel format in ga shrani nazaj v vedro S3. Ta model se nato uporabi pri gostovanju končne točke. Ko je slika naložena v Amazon S3, deluje kot sprožilec za zagon funkcije Lambda. Funkcija uporablja OpenCV Lambda plasti za branje naložene slike in izvajanje sklepanja z uporabo končne točke. Ko je sklepanje zagnano, lahko po potrebi uporabite iz njega pridobljene rezultate.

V tej objavi se sprehodimo skozi postopek uporabe privzetega modela YOLOv5 v PyTorchu in njegove pretvorbe v TensorFlow SavedModel. Ta model gostuje s končno točko SageMaker. Nato ustvarimo in objavimo funkcijo Lambda, ki prikliče končno točko za izvajanje sklepanja. Vnaprej usposobljeni modeli YOLOv5 so na voljo na GitHub. Za namen te objave uporabljamo yolov5l model.

Predpogoji

Kot predpogoj moramo nastaviti naslednje AWS upravljanje identitete in dostopa (IAM) vloge z ustreznimi politike dostopa za SageMaker, Lambda in Amazon S3:

  • Vloga SageMaker IAM – To zahteva AmazonS3FullAccess priloženi pravilniki za shranjevanje in dostop do modela v vedru S3
  • Vloga Lambda IAM – Ta vloga potrebuje več politik:
    • Za dostop do slik, shranjenih v Amazon S3, potrebujemo naslednje pravilnike IAM:
      • s3:GetObject
      • s3:ListBucket
    • Za zagon končne točke SageMaker potrebujemo dostop do naslednjih pravilnikov IAM:
      • sagemaker:ListEndpoints
      • sagemaker:DescribeEndpoint
      • sagemaker:InvokeEndpoint
      • sagemaker:InvokeEndpointAsync

Potrebujete tudi naslednje vire in storitve:

  • O Vmesnik ukazne vrstice AWS (AWS CLI), ki ga uporabljamo za ustvarjanje in konfiguracijo Lambde.
  • Primerek prenosnega računalnika SageMaker. Te imajo vnaprej nameščen Docker, ki ga uporabljamo za ustvarjanje slojev Lambda. Če želite nastaviti primerek zvezka, izvedite naslednje korake:
    • Na konzoli SageMaker ustvarite primerek zvezka in podajte ime zvezka, vrsto primerka (za to objavo uporabljamo ml.c5.large), vlogo IAM in druge parametre.
    • Kloniraj javno skladišče in dodajte Repozitorij YOLOv5 zagotavlja Ultralytics.

Gostite YOLOv5 na končni točki SageMaker

Preden lahko na SageMakerju gostimo vnaprej pripravljen model YOLOv5, ga moramo izvoziti in zapakirati v pravilno strukturo imenika znotraj model.tar.gz. Za to objavo prikazujemo, kako gostiti YOLOv5 v saved_model format. Repo YOLOv5 zagotavlja export.py datoteko, ki lahko izvozi model na veliko različnih načinov. Ko klonirate YOLOv5 in v ukazno vrstico vnesete imenik YOLOv5, lahko izvozite model z naslednjim ukazom:

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

Ta ukaz ustvari nov imenik, imenovan yolov5l_saved_model znotraj yolov5 imenik. Znotraj yolov5l_saved_model imenik, bi morali videti naslednje elemente:

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

Če želite ustvariti model.tar.gz datoteko, premaknite vsebino yolov5l_saved_model do export/Servo/1. V ukazni vrstici lahko stisnemo export tako, da zaženete naslednji ukaz in naložite model v vedro 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>"

Nato lahko razmestimo končno točko SageMaker iz prenosnega računalnika SageMaker tako, da zaženemo naslednjo kodo:

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)

Prejšnji skript traja približno 2–3 minute, da popolnoma uvede model v končno točko SageMaker. Stanje uvajanja lahko spremljate na konzoli SageMaker. Ko je model uspešno gostovan, je model pripravljen za sklepanje.

Preizkusite končno točko SageMaker

Ko je model uspešno gostovan na končni točki SageMaker, ga lahko preizkusimo, kar naredimo s prazno sliko. Testna koda je naslednja:

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)

Nastavite Lambdo s plastmi in sprožilci

OpenCV uporabljamo za predstavitev modela s posredovanjem slike in pridobitvijo rezultatov sklepanja. Lambda nima predzgrajenih zunanjih knjižnic, kot je OpenCV, zato jo moramo zgraditi, preden lahko prikličemo kodo Lambda. Poleg tega se želimo prepričati, da ne gradimo zunanjih knjižnic, kot je OpenCV, vsakič, ko je Lambda priklicana. V ta namen Lambda nudi funkcionalnost za ustvarjanje plasti Lambda. Določimo lahko, kaj gre v te plasti, in koda Lambda jih lahko porabi vsakič, ko je priklicana. Pokažemo tudi, kako ustvariti plasti Lambda za OpenCV. Za to objavo uporabljamo an Amazonski elastični računalniški oblak (Amazon EC2) za ustvarjanje slojev.

Ko imamo plasti na mestu, ustvarimo app.py skript, ki je koda Lambda, ki uporablja plasti, zažene sklepanje in dobi rezultate. Naslednji diagram ponazarja ta potek dela.

Lambda dovoljenje

Ustvarite Lambda plasti za OpenCV z uporabo Dockerja

Za ustvarjanje slike Docker z uporabo Python 3.7 uporabite Dockerfile na naslednji način:

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/

Zgradite in zaženite Docker ter shranite izhodno datoteko ZIP v trenutni imenik pod 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

Zdaj lahko naložimo artefakte plasti OpenCV v Amazon S3 in ustvarimo plast 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

Ko se prejšnji ukazi uspešno izvedejo, imate v Lambdi sloj OpenCV, ki ga lahko pregledate na konzoli Lambda.

Lambda konzola

Ustvarite funkcijo Lambda

Uporabljamo app.py skript za ustvarjanje funkcije Lambda in uporabo OpenCV. V naslednji kodi spremenite vrednosti za BUCKET_NAME in IMAGE_LOCATION na lokacijo za dostop do slike:

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

Namestite funkcijo Lambda z naslednjo kodo:

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

Pripnite sloj OpenCV na funkcijo Lambda

Ko imamo funkcijo Lambda in plast na mestu, lahko plast povežemo s funkcijo na naslednji način:

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

Nastavitve slojev lahko pregledujemo prek konzole Lambda.

Lambda nastavitve

Sproži Lambda, ko je slika naložena v Amazon S3

Nalaganje slike v Amazon S3 uporabljamo kot sprožilec za zagon funkcije Lambda. Za navodila glejte Vadnica: Uporaba sprožilca Amazon S3 za priklic funkcije Lambda.

Na konzoli Lambda bi morali videti naslednje podrobnosti o funkcijah.

pregled funkcij

Zaženi sklepanje

Ko nastavite Lambda in končno točko SageMaker, lahko preizkusite izhod s priklicem funkcije Lambda. Nalaganje slike v Amazon S3 uporabljamo kot sprožilec za priklic Lambde, ki nato prikliče končno točko za sklepanje. Kot primer naložimo naslednjo sliko na lokacijo Amazon S3 <S3 PATH TO IMAGE>/test_image.png konfiguriran v prejšnjem razdelku.

testna slika

Ko je slika naložena, se sproži funkcija Lambda za prenos in branje slikovnih podatkov ter pošiljanje končni točki SageMaker za sklepanje. Izhodni rezultat končne točke SageMaker pridobi in vrne funkcija v formatu JSON, ki ga lahko uporabimo na različne načine. Naslednja slika prikazuje primer izpisa, prekritega s sliko.

rezultat sklepanja

Čiščenje

Odvisno od vrste primerka lahko prenosniki SageMaker zahtevajo znatno porabo računalnika in stroške. Da bi se izognili nepotrebnim stroškom, svetujemo, da primerek prenosnega računalnika zaustavite, ko ni v uporabi. Poleg tega se funkcije Lambda in končne točke SageMaker zaračunajo le, ko so priklicane. Zato za te storitve ni potrebno čiščenje. Če pa se končna točka ne uporablja več, je dobro odstraniti končno točko in model.

zaključek

V tej objavi smo pokazali, kako gostiti predhodno usposobljen model YOLOv5 na končni točki SageMaker in uporabiti Lambda za priklic sklepanja in obdelavo izhoda. Podrobna koda je na voljo na GitHub.

Če želite izvedeti več o končnih točkah SageMaker, si oglejte Ustvarite svojo končno točko in uvedite svoj model in Zgradite, preizkusite in uvedite svoje inferenčne modele Amazon SageMaker v AWS Lambda, ki poudarja, kako lahko avtomatizirate postopek uvajanja modelov YOLOv5.


O avtorjih

Prilagodite sklepanje YOLOv5 s končnimi točkami Amazon SageMaker in AWS Lambda PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.Kevin Song je IoT Edge Data Scientist pri AWS Professional Services. Kevin je doktoriral iz biofizike na Univerzi v Chicagu. Ima več kot 4 leta izkušenj v industriji na področju računalniškega vida in strojnega učenja. Vključen je v pomoč strankam v industriji športa in znanosti o življenju pri uvajanju modelov strojnega učenja.

Prilagodite sklepanje YOLOv5 s končnimi točkami Amazon SageMaker in AWS Lambda PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.Romil Šah je IoT Edge Data Scientist pri AWS Professional Services. Romil ima več kot 6 let izkušenj v industriji na področju računalniškega vida, strojnega učenja in robnih naprav IoT. Strankam pomaga pri optimizaciji in uvajanju njihovih modelov strojnega učenja za robne naprave za industrijske nastavitve.

Časovni žig:

Več od Strojno učenje AWS