Skaalaa YOLOv5-päätelmä Amazon SageMaker -päätepisteiden ja AWS Lambda PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Skaalaa YOLOv5-päätelmä Amazon SageMaker -päätepisteiden ja AWS Lambdan avulla

Kun datatieteilijät ovat huolellisesti keksineet tyydyttävän koneoppimismallin (ML), malli on otettava käyttöön, jotta muut organisaation jäsenet voivat tehdä siitä päätelmiä. Mallien käyttöönotto mittakaavassa optimoiduilla kustannuksilla ja laskentateholla voi kuitenkin olla pelottava ja raskas tehtävä. Amazon Sage Maker päätepisteet tarjoavat helposti skaalautuvan ja kustannusoptimoidun ratkaisun mallin käyttöönottoon. GPLv5-lisenssillä jaettu YOLOv3-malli on suosittu objektientunnistusmalli, joka tunnetaan suoritustehokkuudestaan ​​ja tunnistustarkkuudestaan. Tässä viestissä näytämme, kuinka isännöidä esikoulutettua YOLOv5-mallia SageMaker-päätepisteissä ja AWS Lambda toimintoja kutsuakseen nämä päätepisteet.

Ratkaisun yleiskatsaus

Seuraava kuva esittelee AWS-palvelut, joita käytetään YOLOv5-mallin isännöimiseen SageMaker-päätepisteen avulla ja päätepisteen kutsumiseen Lambdan avulla. SageMaker-muistikirja käyttää YOLOv5 PyTorch -mallia osoitteesta Amazonin yksinkertainen tallennuspalvelu (Amazon S3) -ämpäri, muuntaa sen YOLOv5 TensorFlow -muotoon SavedModel muodossa ja tallentaa sen takaisin S3-ämpäriin. Tätä mallia käytetään sitten päätepisteen isännöinnissa. Kun kuva ladataan Amazon S3:een, se toimii laukaisimena Lambda-toiminnon suorittamiseksi. Toiminto käyttää OpenCV:tä Lambda kerrokset lukeaksesi ladatun kuvan ja suorittaaksesi päätelmän päätepisteen avulla. Kun päättely on suoritettu, voit käyttää siitä saatuja tuloksia tarpeen mukaan.

Tässä viestissä käymme läpi YOLOv5-oletusmallin hyödyntämisprosessin PyTorchissa ja sen muuntamisen TensorFlow-malliksi. SavedModel. Tätä mallia isännöidään SageMaker-päätepisteen avulla. Sitten luomme ja julkaisemme Lambda-funktion, joka kutsuu päätepisteen suorittamaan päättelyn. Valmiiksi koulutetut YOLOv5-mallit ovat saatavilla GitHub. Tätä viestiä varten käytämme yolov5l malli.

Edellytykset

Edellytyksenä meidän on määritettävä seuraavat AWS-henkilöllisyyden ja käyttöoikeuksien hallinta (IAM) roolit sopivilla pääsykäytännöt SageMakerille, Lambdalle ja Amazon S3:lle:

  • SageMaker IAM -rooli – Tämä vaatii AmazonS3FullAccess liitteenä olevat mallin tallentamista ja käyttöä koskevat käytännöt S3-säilössä
  • Lambda IAM -rooli – Tämä rooli vaatii useita käytäntöjä:
    • Amazon S3:een tallennettujen kuvien käyttö edellyttää seuraavia IAM-käytäntöjä:
      • s3:GetObject
      • s3:ListBucket
    • Jotta voimme suorittaa SageMaker-päätepisteen, tarvitsemme pääsyn seuraaviin IAM-käytäntöihin:
      • sagemaker:ListEndpoints
      • sagemaker:DescribeEndpoint
      • sagemaker:InvokeEndpoint
      • sagemaker:InvokeEndpointAsync

Tarvitset myös seuraavat resurssit ja palvelut:

  • - AWS-komentoriviliitäntä (AWS CLI), jota käytämme Lambdan luomiseen ja määrittämiseen.
  • SageMaker-muistikirjan esiintymä. Näissä Docker on esiasennettu, ja käytämme tätä Lambda-kerrosten luomiseen. Voit määrittää muistikirjan esiintymän suorittamalla seuraavat vaiheet:
    • Luo SageMaker-konsolissa muistikirjan ilmentymä ja anna muistikirjan nimi, ilmentymän tyyppi (tässä viestissä käytämme ml.c5.largea), IAM-rooli ja muut parametrit.
    • Kloonaa julkinen arkisto ja lisää YOLOv5-arkisto tarjoaa Ultralytics.

Isännöi YOLOv5:tä SageMaker-päätepisteessä

Ennen kuin voimme isännöidä esikoulutettua YOLOv5-mallia SageMakerissa, meidän on vietävä ja pakattava se oikeaan hakemistorakenteeseen sisällä model.tar.gz. Tässä viestissä näytämme kuinka isännöidä YOLOv5:tä saved_model muoto. YOLOv5-repo tarjoaa export.py tiedosto, joka voi viedä mallin monin eri tavoin. Kun olet kloonannut YOLOv5:n ja kirjoittanut YOLOv5-hakemistoon komentoriviltä, ​​voit viedä mallin seuraavalla komennolla:

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

Tämä komento luo uuden hakemiston nimeltä yolov5l_saved_model sisällä yolov5 hakemistosta. Sisällä yolov5l_saved_model hakemistosta, meidän pitäisi nähdä seuraavat kohteet:

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

Luo a model.tar.gz tiedostoa, siirrä sen sisältö yolov5l_saved_model että export/Servo/1. Komentoriviltä voimme pakata export hakemistoon suorittamalla seuraava komento ja lataamalla malli S3-ämpäriin:

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

Sitten voimme ottaa SageMaker-päätepisteen käyttöön SageMaker-muistikirjasta suorittamalla seuraavan koodin:

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)

Edellisellä komentosarjalla kestää noin 2–3 minuuttia, jotta malli otetaan kokonaan käyttöön SageMaker-päätepisteeseen. Voit seurata käyttöönoton tilaa SageMaker-konsolissa. Kun malli on isännöity onnistuneesti, malli on valmis päättämistä varten.

Testaa SageMaker-päätepistettä

Kun malli on onnistuneesti isännöity SageMaker-päätepisteessä, voimme testata sitä, minkä teemme käyttämällä tyhjää kuvaa. Testauskoodi on seuraava:

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)

Asenna Lambda tasoilla ja liipaisimilla

Käytämme OpenCV:tä mallin esittelyyn välittämällä kuvan ja saamalla päättelytulokset. Lambdassa ei ole valmiiksi rakennettuja ulkoisia kirjastoja, kuten OpenCV, joten meidän on rakennettava se ennen kuin voimme kutsua Lambda-koodia. Lisäksi haluamme varmistaa, että emme rakenna ulkoisia kirjastoja, kuten OpenCV:tä joka kerta, kun Lambdaa kutsutaan. Tätä tarkoitusta varten Lambda tarjoaa toiminnon Lambda-kerrosten luomiseen. Voimme määritellä, mitä näissä kerroksissa menee, ja Lambda-koodi voi kuluttaa ne joka kerta, kun sitä kutsutaan. Esittelemme myös, kuinka luodaan Lambda-tasot OpenCV:lle. Tässä viestissä käytämme an Amazonin elastinen laskentapilvi (Amazon EC2) -esiintymä tasojen luomiseen.

Kun kerrokset ovat paikoillaan, luomme app.py script, joka on Lambda-koodi, joka käyttää tasoja, suorittaa päättelyn ja saa tuloksia. Seuraava kaavio havainnollistaa tätä työnkulkua.

Lambda lupa

Luo Lambda-tasot OpenCV:lle Dockerin avulla

Käytä Dockerfilea seuraavasti luodaksesi Docker-kuvan Python 3.7:n avulla:

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/

Rakenna ja suorita Docker ja tallenna ulostulo ZIP-tiedosto nykyiseen hakemistoon 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

Nyt voimme ladata OpenCV-kerroksen artefaktit Amazon S3:een ja luoda Lambda-kerroksen:

$ 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

Kun edelliset komennot on suoritettu onnistuneesti, sinulla on OpenCV-taso Lambdassa, jota voit tarkastella Lambda-konsolissa.

Lambda-konsoli

Luo Lambda-funktio

Hyödynnämme app.py komentosarja Lambda-funktion luomiseksi ja OpenCV:n käyttämiseksi. Muuta seuraavassa koodissa arvoja BUCKET_NAME ja IMAGE_LOCATION kuvan käyttöpaikkaan:

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

Ota Lambda-toiminto käyttöön seuraavalla koodilla:

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

Kiinnitä OpenCV-kerros Lambda-toimintoon

Kun meillä on Lambda-toiminto ja kerros paikallaan, voimme yhdistää kerroksen toimintoon seuraavasti:

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

Voimme tarkistaa tasoasetukset Lambda-konsolin kautta.

Lambda asetukset

Laukaise lambda, kun kuva ladataan Amazon S3:een

Käytämme kuvan latausta Amazon S3:een käynnistämään Lambda-toiminnon. Katso ohjeet kohdasta Oppitunti: Amazon S3 -laukaisimen käyttäminen Lambda-toiminnon käynnistämiseen.

Sinun pitäisi nähdä seuraavat toimintotiedot Lambda-konsolissa.

toimintojen yleiskatsaus

Suorita johtopäätös

Kun olet määrittänyt Lambdan ja SageMaker-päätepisteen, voit testata ulostuloa käynnistämällä Lambda-funktion. Käytämme kuvan latausta Amazon S3:een liipaisimena kutsuaksemme Lambdaa, joka puolestaan ​​kutsuu päätepisteen päätelmiä varten. Lataamme esimerkiksi seuraavan kuvan Amazon S3 -sijaintiin <S3 PATH TO IMAGE>/test_image.png määritetty edellisessä osiossa.

testikuva

Kun kuva on ladattu, Lambda-toiminto käynnistyy lataamaan ja lukemaan kuvatiedot ja lähettämään ne SageMaker-päätepisteeseen päätelmiä varten. SageMaker-päätepisteen tulostuloksen saa ja palauttaa funktio JSON-muodossa, jota voimme käyttää eri tavoin. Seuraava kuva näyttää esimerkkitulosteen kuvan päällä.

päätelmä tulos

Puhdistaa

Instanssityypistä riippuen SageMaker-muistikirjat voivat vaatia huomattavaa laskentaa ja kustannuksia. Tarpeettomien kustannusten välttämiseksi suosittelemme pysäyttämään kannettavan tietokoneen esiintymän, kun se ei ole käytössä. Lisäksi Lambda-funktioista ja SageMaker-päätepisteistä veloitetaan vain, kun niitä kutsutaan. Siksi näitä palveluita ei tarvitse puhdistaa. Jos päätepistettä ei kuitenkaan enää käytetä, on hyvä käytäntö poistaa päätepiste ja malli.

Yhteenveto

Tässä viestissä osoitimme, kuinka isännöidä esikoulutettu YOLOv5-malli SageMaker-päätepisteessä ja käyttää Lambdaa päättelyn käynnistämiseen ja tulosteen käsittelemiseen. Tarkempi koodi on saatavilla osoitteessa GitHub.

Lisätietoja SageMaker-päätepisteistä on osoitteessa Luo päätepiste ja ota malli käyttöön ja Rakenna, testaa ja ota käyttöön Amazon SageMaker -päätelmämallisi AWS Lambdassa, joka korostaa, kuinka voit automatisoida YOLOv5-mallien käyttöönottoprosessin.


Tietoja kirjoittajista

Skaalaa YOLOv5-päätelmä Amazon SageMaker -päätepisteiden ja AWS Lambda PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.Kevin Song on IoT Edge Data Scientist AWS Professional Services -palvelussa. Kevin on valmistunut tohtoriksi biofysiikasta Chicagon yliopistosta. Hänellä on yli 4 vuoden kokemus alalta Computer Visionista ja koneoppimisesta. Hän on mukana auttamassa urheilu- ja biotieteiden alan asiakkaita ottamaan käyttöön koneoppimismalleja.

Skaalaa YOLOv5-päätelmä Amazon SageMaker -päätepisteiden ja AWS Lambda PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.Romil Shah on IoT Edge Data Scientist AWS Professional Services -palvelussa. Romililla on yli 6 vuoden kokemus alalta Computer Vision-, koneoppimis- ja IoT-reunalaitteista. Hän on mukana auttamassa asiakkaita optimoimaan ja ottamaan käyttöön koneoppimismallejaan teollisuusasennusten reunalaitteille.

Aikaleima:

Lisää aiheesta AWS-koneoppiminen