Å distribuere modeller i stor skala kan være en tungvint oppgave for mange dataforskere og maskinlæringsingeniører. Amazon SageMaker-endepunkter gir imidlertid en enkel løsning for å distribuere og skalere maskinlæringsmodellen (ML)-modellslutninger. Vår siste blogginnlegg og GitHub repo på å være vertskap for en YOLOv5 TensorFlowModel
on Amazon SageMaker endepunkter vekket stor interesse fra våre lesere. Mange lesere var også interessert i å lære å være vert for YOLOv5-modellen ved hjelp av PyTorch
. For å løse dette problemet og med den nylige utgivelsen av YOLOv8 modell fra Ultralytics, presenterer vi dette innlegget om hvordan du er vert for en YOLOv8 PyTorchModel
på SageMaker-endepunkter. YOLOv8-modellen, distribuert under GNU GPL3-lisensen, er en populær objektdeteksjonsmodell kjent for sin kjøretidseffektivitet så vel som deteksjonsnøyaktighet. Amazon SageMaker-endepunkter gir en lett skalerbar og kostnadsoptimalisert løsning for modelldistribusjon.
Løsningsoversikt
Følgende bilde skisserer AWS-tjenestene som brukes til å være vert for YOLOv8-modellen ved å bruke et SageMaker-endepunkt og påkalle endepunktet som bruker. Løsningen bruker AWS skyformasjon å automatisere opprettelsen av en SageMaker-forekomst og klone vår GitHub repository til instansen. SageMaker-notisboken får tilgang til og laster ned en YOLOv8 PyTorch-modell og lagrer den tilpassede slutningskoden sammen med modellen i en Amazon enkel lagringstjeneste (Amazon S3) bøtte. Trinnene i notatboken fremhever opprettelsen av SageMaker-endepunktet som er vert for YOLOv8 PyTorch-modellen og den tilpassede slutningskoden. Notatboken viser også hvordan du tester endepunktet og plotter resultatene. Løsningen består av følgende trinn:
- Vi har laget et GitHub-lager med to notatbøker
1_DeployEndpoint.ipynb
og2_TestEndpoint.ipynb
Undersm-notebook/
katalogen. - AWS CloudFormation-malen kjører, oppretter en SageMaker Notebook-forekomst og kloner deretter GitHub-depotet.
- Notatboken
1_DeployEndpoint.ipynb
brukes til å laste ned YOLOv8-modellen. - YOLOv8-modellen og slutningskoden lagres som
model.tar.gz
i Amazon S3. - Et SageMaker-endepunkt opprettes ved å være vert for
model.tar.gz
. - Notatboken
2_TestEndpoint.ipynb
brukes til å teste endepunktet og samle resultater.
Forutsetninger
AWS-konto med AWS Identity and Access Management (IAM) roller som gir tilgang til:
- AWS skyformasjon
- Amazon SageMaker
- Amazon S3
1. Vert YOLOv8 på et SageMaker-endepunkt
Ultralytics har flere YOLOv8-modeller med forskjellige muligheter. De er delt inn i følgende:
- Objektdeteksjon (
yolov8l.pt, yolov8m.pt, yolov8n.pt, yolov8s.pt, yolov8x.pt, yolov8x6.pt
) - segmentering (
yolov8l-seg.pt, yolov8m-seg.pt, yolov8n-seg.pt, yolov8s-seg.pt, yolov8x-seg.pt
) - Klassifisering (
yolov8l-cls.pt, yolov8m-cls.pt, yolov8n-cls.pt, yolov8s-cls.pt, yolov8x-cls.pt
)
I denne bloggen fokuserer vi på objektdeteksjon ved hjelp av yolov8l.pt
PyTorch-modell. For å være vert for YOLOv8-modellen og den tilpassede slutningskoden på SageMaker-endepunktet, må de komprimeres sammen til en enkelt model.tar.gz
med følgende struktur:
model.tar.gz ├─ code/ │ ├── inference.py │ └── requirements.txt └── yolov8l.pt
Modellen veier yolov8l.pt
filen må være utenfor code/
katalogen og hovedinferens-python-skriptet inference.py
, som inneholder funksjonene som trengs for å laste modellen, analysere inndata, kjøre slutningen og etterbehandle utdataene, bør ligge under code/
katalog. Ytterligere detaljer vedr inference.py
presenteres i følgende avsnitt.
1.1. Egendefinert slutningskode
Avhengig av din pipeline og kodearbeidsflyt, kan innganger til og utganger fra SageMaker-endepunkter variere. I dette innlegget presenterer vi en arbeidsflyt for å bestå en numpy
array til endepunktet og prosessering. Imidlertid kan inngangene til endepunktet være json
eller tekst også. Avhengig av arbeidsflyten din, må du endre funksjonene i inference.py
for å imøtekomme ulike innganger og utganger. I tillegg, med den nylige utgivelsen av YOLOv8, lanserte Ultralytics-teamet deres Python API, som lar oss installere YOLO-biblioteket direkte gjennom requirements.txt
og importer modellen inn inference.py
.
1.1.1. Innhold i code/inference.py
:
import numpy as np
import torch, os, json, io, cv2, time
from ultralytics import YOLO def model_fn(model_dir): print("Executing model_fn from inference.py ...") env = os.environ model = YOLO("/opt/ml/model/code/" + env['YOLOV8_MODEL']) return model def input_fn(request_body, request_content_type): print("Executing input_fn from inference.py ...") if request_content_type: jpg_original = np.load(io.BytesIO(request_body), allow_pickle=True) jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8) img = cv2.imdecode(jpg_as_np, flags=-1) else: raise Exception("Unsupported content type: " + request_content_type) return img def predict_fn(input_data, model): print("Executing predict_fn from inference.py ...") device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) with torch.no_grad(): result = model(input_data) return result def output_fn(prediction_output, content_type): print("Executing output_fn from inference.py ...") infer = {} for result in prediction_output: if result.boxes: infer['boxes'] = result.boxes.numpy().data.tolist() if result.masks: infer['masks'] = result.masks.numpy().data.tolist() if result.probs: infer['probs'] = result.probs.numpy().data.tolist() return json.dumps(infer)
1.1.2. Innhold i code/requirements.txt
:
Når alt filinnholdet for model.tar.gz
er ferdig, kjør følgende kommando for å lage en tjæreball:
$ tar -czvf model.tar.gz code/ yolov8l.pt
1.2. Vert model.tar.gz
til SageMaker endepunkt:
Dette innebærer noen få trinn der model.tar.gz
er først lastet opp til S3-bøtten. Den opplastede artefakten brukes til å lage en SageMaker PyTorchModel. Og til slutt, denne PyTorchModel brukes til å distribuere modellen til et SageMaker-endepunkt.
1.2.1. Last opp modell og slutningskode til S3:
from sagemaker import s3 bucket = "s3://NAME_OF_BUCKET"
prefix = "yolov8/demo-custom-endpoint"
model_data = s3.S3Uploader.upload("model.tar.gz", bucket + "/" + prefix)
1.2.2. Lag SageMaker PyTorchModel:
from sagemaker.pytorch import PyTorchModel model_name = 'yolov8l.pt' model = PyTorchModel(entry_point='inference.py', model_data=model_data, framework_version='1.12', py_version='py38', role=role, env={'TS_MAX_RESPONSE_SIZE':'20000000', 'YOLOV8_MODEL': model_name}, sagemaker_session=sess)
1.2.3. Kompiler og vert modellen til et endepunkt:
from sagemaker.deserializers import JSONDeserializer INSTANCE_TYPE = 'ml.m5.4xlarge'
ENDPOINT_NAME = 'yolov8-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f')) predictor = model.deploy(initial_instance_count=1, instance_type=INSTANCE_TYPE, deserializer=JSONDeserializer(), endpoint_name=ENDPOINT_NAME)
2. Test SageMaker-endepunktet
Når endepunktet er vellykket vert, kan det brukes til å kjøre inferens. I dette trinnet vil vi først lese et bilde, konvertere det til byte og kjøre inferens ved å sende bytene som input til endepunktet. Resultatene som genereres vil ha enten avgrensningsbokser eller masker eller konfidenspoeng basert på typen YOLOv8-modell som brukes for hosting. Utgangen kan plottes tilsvarende.
2.1.1. Generer slutningsresultater og plott utdata:
import cv2, random
import numpy as np
import matplotlib.pyplot as plt orig_image = cv2.imread('bus.jpg') image_height, image_width, _ = orig_image.shape
model_height, model_width = 300, 300
x_ratio = image_width/model_width
y_ratio = image_height/model_height resized_image = cv2.resize(orig_image, (model_height, model_width))
payload = cv2.imencode('.jpg', resized_image)[1].tobytes()
result = predictor.predict(payload) if 'boxes' in result: for idx,(x1,y1,x2,y2,conf,lbl) in enumerate(result['boxes']): # Draw Bounding Boxes x1, x2 = int(x_ratio*x1), int(x_ratio*x2) y1, y2 = int(y_ratio*y1), int(y_ratio*y2) color = (random.randint(10,255), random.randint(10,255), random.randint(10,255)) cv2.rectangle(orig_image, (x1,y1), (x2,y2), color, 4) cv2.putText(orig_image, f"Class: {int(lbl)}", (x1,y1-40), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2, cv2.LINE_AA) cv2.putText(orig_image, f"Conf: {int(conf*100)}", (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2, cv2.LINE_AA) if 'masks' in result: # Draw Masks mask = cv2.resize(np.asarray(result['masks'][idx]), dsize=(image_width, image_height), interpolation=cv2.INTER_CUBIC) for c in range(3): orig_image[:,:,c] = np.where(mask>0.5, orig_image[:,:,c]*(0.5)+0.5*color[c], orig_image[:,:,c]) if 'probs' in result: # Find Class lbl = result['probs'].index(max(result['probs'])) color = (random.randint(10,255), random.randint(10,255), random.randint(10,255)) cv2.putText(orig_image, f"Class: {int(lbl)}", (20,20), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2, cv2.LINE_AA) plt.imshow(cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB))
plt.show()
2.1.2. Resultater:
Utdataene fra objektdeteksjon og segmentering YOLOv8-modeller vises i følgende bilder:
3. Rydde opp
Sletting av CloudFormation-stabelen ville fjerne alle ressursene som opprinnelig ble opprettet. CloudFormation er imidlertid for øyeblikket ikke konfigurert til å automatisk fjerne endepunktet, endepunktkonfigurasjonen og modellen. Hvis det vertsbaserte endepunktet ikke brukes, er det en god praksis å fjerne det for å spare kostnader. Det kan gjøres som følger:
import boto3 sm_client = boto3.client(service_name="sagemaker") response = sm_client.describe_endpoint_config(EndpointConfigName=endpoint_name)
print(response)
endpoint_config_name = response['EndpointConfigName'] # Delete Endpoint
sm_client.delete_endpoint(EndpointName=endpoint_name) # Delete Endpoint Configuration
sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name) # Delete Model
for prod_var in response['ProductionVariants']: model_name = prod_var['ModelName'] sm_client.delete_model(ModelName=model_name)
konklusjonen
I dette innlegget demonstrerte vi hvordan du kan være vert for en forhåndstrent YOLOv8 PyTorchModel
på et SageMaker-endepunkt og test slutningsresultatene ved å påkalle endepunktet. Den detaljerte koden er tilgjengelig på GitHub, og malen CloudFormation-stakken er også tilgjengelig på GitHub.
For å lære mer om SageMaker-endepunkter, sjekk ut Lag endepunktet ditt og distribuer modellen din og Bruk PyTorch med Amazon SageMaker, som fremhever å bruke PyTorchModel
på SageMaker. Prosessen kan automatiseres ved hjelp av CloudFormation-støtte for SageMaker.
Om forfatterne
Kevin Song er dataforsker ved AWS Professional Services. Han har en doktorgrad i biofysikk og har mer enn fem års bransjeerfaring med å bygge datasyn og maskinlæringsløsninger.
Romil Shah er en IoT Edge Data Scientist ved AWS Professional Services. Romil har mer enn seks års bransjeerfaring innen datasyn, maskinlæring og IoT-kantenheter. Han er involvert i å hjelpe kunder med å optimalisere og distribuere sine maskinlæringsmodeller for avanserte enheter i et industrielt oppsett.
- SEO-drevet innhold og PR-distribusjon. Bli forsterket i dag.
- Platoblokkkjede. Web3 Metaverse Intelligence. Kunnskap forsterket. Tilgang her.
- kilde: https://aws.amazon.com/blogs/machine-learning/hosting-yolov8-pytorch-model-on-amazon-sagemaker-endpoints/
- :er
- 1
- 10
- 100
- 7
- a
- Om oss
- adgang
- imøtekomme
- tilsvar
- Logg inn
- nøyaktighet
- tillegg
- adresse
- Alle
- tillater
- Amazon
- Amazon SageMaker
- og
- api
- ER
- Array
- AS
- At
- automatisere
- Automatisert
- automatisk
- tilgjengelig
- AWS
- AWS profesjonelle tjenester
- ball
- basert
- BE
- være
- biofysikk
- Blogg
- bokser
- Bygning
- buss
- by
- CAN
- evner
- sjekk
- klasse
- kode
- farge
- COM
- datamaskin
- Datamaskin syn
- selvtillit
- Konfigurasjon
- inneholder
- innhold
- innhold
- konvertere
- Kostnader
- skape
- opprettet
- skaper
- skaperverket
- I dag
- skikk
- Kunder
- dato
- dataforsker
- dato tid
- demonstrert
- demonstrerer
- avhengig
- utplassere
- utplasserings
- distribusjon
- detaljert
- detaljer
- Gjenkjenning
- enhet
- Enheter
- forskjellig
- direkte
- distribueres
- nedlasting
- nedlastinger
- tegne
- lett
- Edge
- effektivitet
- enten
- Endpoint
- Ingeniører
- utførende
- erfaring
- Noen få
- filet
- avsluttet
- Endelig
- Finn
- Først
- Fokus
- etter
- følger
- Til
- fra
- funksjoner
- videre
- generere
- generert
- GitHub
- god
- Ha
- hjelpe
- Uthev
- striper
- holder
- vert
- vert
- Hosting
- Vertskapet
- Hvordan
- Hvordan
- Men
- HTML
- HTTPS
- Identitet
- iDX
- bilde
- bilder
- importere
- in
- industriell
- industri
- inngang
- installere
- f.eks
- interesse
- interessert
- involvert
- IOT
- utstedelse
- IT
- DET ER
- jpg
- JSON
- kjent
- Siste
- LÆRE
- læring
- Bibliotek
- Tillatelse
- lasting
- Lot
- maskin
- maskinlæring
- Hoved
- ledelse
- mange
- maske
- masker
- matplotlib
- ML
- modell
- modeller
- modifisere
- mer
- flere
- Trenger
- bærbare
- følelsesløs
- objekt
- Objektdeteksjon
- of
- on
- Optimalisere
- rekkefølge
- opprinnelig
- OS
- skisserer
- produksjon
- utenfor
- Passerer
- rørledning
- plato
- Platon Data Intelligence
- PlatonData
- vær så snill
- Populær
- Post
- praksis
- Predictor
- presentere
- presentert
- prosess
- prosessering
- profesjonell
- gi
- gir
- Python
- pytorch
- heve
- tilfeldig
- Lese
- lesere
- nylig
- slipp
- utgitt
- fjerne
- Repository
- Krav
- Ressurser
- svar
- resultere
- Resultater
- retur
- Kjør
- rennende
- sagemaker
- Spar
- skalerbar
- Skala
- skalering
- Forsker
- forskere
- sjøfødt
- Seksjon
- segmentering
- Tjenester
- oppsett
- Form
- bør
- vist
- Enkelt
- enkelt
- SIX
- løsning
- Solutions
- stable
- Trinn
- Steps
- lagring
- lagret
- butikker
- struktur
- vellykket
- støtte
- Oppgave
- lag
- mal
- test
- Det
- De
- deres
- tid
- til
- sammen
- lommelykt
- Torchvision
- etter
- lastet opp
- us
- Bruker
- syn
- VI VIL
- hvilken
- vil
- med
- innenfor
- ville
- år
- Yolo
- Du
- Din
- zephyrnet