Implementering af modeller i stor skala kan være en besværlig opgave for mange datavidenskabsmænd og maskinlæringsingeniører. Amazon SageMaker-endepunkter giver dog en enkel løsning til implementering og skalering af dine maskinlæringsmodeller (ML). Vores sidste blogindlæg , GitHub repo på at være vært for en YOLOv5 TensorFlowModel
on Amazon SageMaker Endpoints vakte stor interesse fra vores læsere. Mange læsere var også interesserede i at lære, hvordan man hoster YOLOv5-modellen ved hjælp af PyTorch
. For at løse dette problem og med den nylige udgivelse af YOLOv8 model fra Ultralytika, præsenterer vi dette indlæg om, hvordan man er vært for en YOLOv8 PyTorchModel
på SageMaker-endepunkter. YOLOv8-modellen, distribueret under GNU GPL3-licensen, er en populær objektdetekteringsmodel kendt for sin runtime-effektivitet samt detektionsnøjagtighed. Amazon SageMaker-endepunkter giver en let skalerbar og omkostningsoptimeret løsning til modelimplementering.
Løsningsoversigt
Følgende billede skitserer de AWS-tjenester, der bruges til at hoste YOLOv8-modellen ved hjælp af et SageMaker-slutpunkt og kalde slutpunktet som bruger. Løsningen bruger AWS CloudFormation at automatisere oprettelsen af en SageMaker-instans og klone vores GitHub repository til instansen. SageMaker-notebooken får adgang til og downloader en YOLOv8 PyTorch-model og gemmer den tilpassede slutningskode sammen med modellen i en Amazon Simple Storage Service (Amazon S3) spand. Trinnene i notesbogen fremhæver oprettelsen af SageMaker-slutpunktet, der er vært for YOLOv8 PyTorch-modellen og den tilpassede slutningskode. Notesbogen viser også, hvordan man tester slutpunktet og plotter resultaterne. Løsningen består af følgende trin:
- Vi har oprettet et GitHub-lager med to notesbøger
1_DeployEndpoint.ipynb
,2_TestEndpoint.ipynb
Undersm-notebook/
mappe. - AWS CloudFormation-skabelon kører, opretter en SageMaker Notebook-instans og kloner derefter GitHub-lageret.
- Notesbogen
1_DeployEndpoint.ipynb
bruges til at downloade YOLOv8-modellen. - YOLOv8-modellen og slutningskoden gemmes som
model.tar.gz
i Amazon S3. - Et SageMaker-slutpunkt oprettes ved at være vært for
model.tar.gz
. - Notesbogen
2_TestEndpoint.ipynb
bruges til at teste endepunktet og indsamle resultater.
Forudsætninger
AWS-konto med AWS Identity and Access Management (IAM) roller der giver adgang til:
- AWS CloudFormation
- Amazon SageMaker
- Amazon S3
1. Host YOLOv8 på et SageMaker-slutpunkt
Ultralytics har flere YOLOv8-modeller med forskellige muligheder. De er opdelt i følgende:
- Objektdetektion (
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
) - Klassifikation (
yolov8l-cls.pt, yolov8m-cls.pt, yolov8n-cls.pt, yolov8s-cls.pt, yolov8x-cls.pt
)
I denne blog fokuserer vi på objektdetektion vha yolov8l.pt
PyTorch model. For at være vært for YOLOv8-modellen og den tilpassede slutningskode på SageMaker-slutpunktet, skal de komprimeres sammen til en enkelt model.tar.gz
med følgende struktur:
model.tar.gz ├─ code/ │ ├── inference.py │ └── requirements.txt └── yolov8l.pt
Modellens vægte yolov8l.pt
fil skal være uden for code/
mappe og hovedinferens python-scriptet inference.py
, som indeholder de funktioner, der er nødvendige for at indlæse modellen, parse input, køre inferensen og efterbehandle outputtet, bør ligge under code/
vejviser. Yderligere detaljer vedr inference.py
præsenteres i det følgende afsnit.
1.1. Brugerdefineret slutningskode
Afhængigt af din pipeline og kodeworkflow kan input til og output fra SageMaker-endepunkter variere. I dette indlæg præsenterer vi en arbejdsgang til at bestå en numpy
array til slutpunktet og behandling. Indgangene til endepunktet kan dog være json
eller også tekst. Afhængigt af din arbejdsgang skal du ændre funktionerne i inference.py
til at rumme forskellige input og output. Derudover udgav Ultralytics-teamet med den nylige udgivelse af YOLOv8 deres Python API, som giver os mulighed for at installere YOLO-biblioteket direkte gennem requirements.txt
og importer modellen ind inference.py
.
1.1.1. Indhold af 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. Indhold af code/requirements.txt
:
Når alt filens indhold til model.tar.gz
er afsluttet, skal du køre følgende kommando for at oprette en tjærebold:
$ tar -czvf model.tar.gz code/ yolov8l.pt
1.2. vært model.tar.gz
til SageMaker-slutpunktet:
Dette involverer et par trin, hvori model.tar.gz
uploades først til S3-bøtten. Den uploadede artefakt bruges til at skabe en SageMaker PyTorchModel. Og endelig bruges denne PyTorchModel til at implementere modellen til et SageMaker-endepunkt.
1.2.1. Upload model 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. Opret 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 host modellen til et slutpunkt:
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-slutpunktet
Når slutpunktet er hostet, kan det bruges til at køre inferens. I dette trin vil vi først læse et billede, konvertere det til bytes og køre inferens ved at sende bytes som input til slutpunktet. De genererede resultater ville have enten afgrænsningsfelter eller masker eller konfidensscore baseret på typen af YOLOv8-model, der bruges til hosting. Outputtet kan plottes i overensstemmelse hermed.
2.1.1. Generer slutningsresultater og plot output:
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:
Outputtet af objektdetektering og segmentering YOLOv8-modeller er vist på følgende billeder:
3. Ryd op
Sletning af CloudFormation-stakken ville fjerne alle de ressourcer, der oprindeligt blev oprettet. CloudFormation er dog i øjeblikket ikke konfigureret til automatisk at fjerne slutpunktet, slutpunktskonfigurationen og modellen. Hvis det hostede slutpunkt ikke bruges, er det en god praksis at fjerne det for at spare omkostninger. Det kan gø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)
Konklusion
I dette indlæg demonstrerede vi, hvordan man er vært for en fortrænet YOLOv8 PyTorchModel
på et SageMaker-endepunkt og test slutningsresultaterne ved at påkalde slutpunktet. Den detaljerede kode er tilgængelig på GitHub, og skabelonen CloudFormation-stakken er også tilgængelig på GitHub.
For at lære mere om SageMaker-endepunkter, tjek venligst ud Opret dit slutpunkt og implementer din model , Brug PyTorch med Amazon SageMaker, som fremhæver at bruge PyTorchModel
på SageMaker. Processen kan automatiseres vha CloudFormation-understøttelse af SageMaker.
Om forfatterne
Kevin sang er Data Scientist hos AWS Professional Services. Han har en ph.d. i biofysik og har mere end fem års brancheerfaring med at bygge computervision og maskinlæringsløsninger.
Romil Shah er IoT Edge Data Scientist hos AWS Professional Services. Romil har mere end seks års brancheerfaring inden for computervision, machine learning og IoT edge-enheder. Han er involveret i at hjælpe kunder med at optimere og implementere deres maskinlæringsmodeller til edge-enheder i et industrielt setup.
- SEO Powered Content & PR Distribution. Bliv forstærket i dag.
- Platoblokkæde. Web3 Metaverse Intelligence. Viden forstærket. Adgang her.
- Kilde: https://aws.amazon.com/blogs/machine-learning/hosting-yolov8-pytorch-model-on-amazon-sagemaker-endpoints/
- :er
- 1
- 10
- 100
- 7
- a
- Om
- adgang
- imødekomme
- derfor
- Konto
- nøjagtighed
- Desuden
- adresse
- Alle
- tillader
- Amazon
- Amazon SageMaker
- ,
- api
- ER
- Array
- AS
- At
- automatisere
- Automatiseret
- automatisk
- til rådighed
- AWS
- AWS Professional Services
- bold
- baseret
- BE
- være
- Biofysik
- Blog
- kasser
- Bygning
- bus
- by
- CAN
- kapaciteter
- kontrollere
- klasse
- kode
- farve
- KOM
- computer
- Computer Vision
- tillid
- Konfiguration
- indeholder
- indhold
- indhold
- konvertere
- Omkostninger
- skabe
- oprettet
- skaber
- skabelse
- For øjeblikket
- skik
- Kunder
- data
- dataforsker
- dato tid
- demonstreret
- demonstrerer
- Afhængigt
- indsætte
- implementering
- implementering
- detaljeret
- detaljer
- Detektion
- enhed
- Enheder
- forskellige
- direkte
- distribueret
- downloade
- downloads
- tegne
- nemt
- Edge
- effektivitet
- enten
- Endpoint
- Ingeniører
- udførelse
- erfaring
- få
- File (Felt)
- færdiggjort
- Endelig
- Finde
- Fornavn
- Fokus
- efter
- følger
- Til
- fra
- funktioner
- yderligere
- generere
- genereret
- GitHub
- godt
- Have
- hjælpe
- Fremhæv
- højdepunkter
- besidder
- host
- hostede
- Hosting
- værter
- Hvordan
- How To
- Men
- HTML
- HTTPS
- Identity
- IDX
- billede
- billeder
- importere
- in
- industrielle
- industrien
- indgang
- installere
- instans
- interesse
- interesseret
- involverede
- tingenes internet
- spørgsmål
- IT
- ITS
- jpg
- json
- kendt
- Efternavn
- LÆR
- læring
- Bibliotek
- Licens
- lastning
- Lot
- maskine
- machine learning
- Main
- ledelse
- mange
- maske
- Masker
- matplotlib
- ML
- model
- modeller
- ændre
- mere
- flere
- Behov
- notesbog
- bedøvet
- objekt
- Objektdetektion
- of
- on
- Optimer
- ordrer
- oprindeligt
- OS
- konturer
- output
- uden for
- Passing
- pipeline
- plato
- Platon Data Intelligence
- PlatoData
- Vær venlig
- Populær
- Indlæg
- praksis
- Predictor
- præsentere
- forelagt
- behandle
- forarbejdning
- professionel
- give
- giver
- Python
- pytorch
- rejse
- tilfældig
- Læs
- læsere
- nylige
- frigive
- frigivet
- Fjern
- Repository
- Krav
- Ressourcer
- svar
- resultere
- Resultater
- afkast
- Kør
- kører
- sagemaker
- Gem
- skalerbar
- Scale
- skalering
- Videnskabsmand
- forskere
- søfødt
- Sektion
- segmentering
- Tjenester
- setup
- Shape
- bør
- vist
- Simpelt
- enkelt
- SIX
- løsninger
- Løsninger
- stable
- Trin
- Steps
- opbevaring
- opbevaret
- forhandler
- struktur
- Succesfuld
- support
- Opgaver
- hold
- skabelon
- prøve
- at
- deres
- tid
- til
- sammen
- fakkel
- Torchvision
- under
- uploadet
- us
- Bruger
- vision
- GODT
- som
- vilje
- med
- inden for
- ville
- år
- YOLO
- Du
- Din
- zephyrnet