La distribuzione di modelli su larga scala può essere un'attività ingombrante per molti data scientist e ingegneri di machine learning. Tuttavia, gli endpoint Amazon SageMaker forniscono una soluzione semplice per la distribuzione e il ridimensionamento delle inferenze del modello di machine learning (ML). Il nostro ultimo post sul blog ed Repository GitHub sull'hosting a YOLOv5 TensorFlowModel
on Amazon Sage Maker endpoint ha suscitato molto interesse da parte dei nostri lettori. Molti lettori erano anche interessati a imparare come ospitare il modello YOLOv5 utilizzando PyTorch
. Per risolvere questo problema e con il recente rilascio di YOLOv8 modello da Ultralitici, presentiamo questo post su come ospitare un file YOLOv8 PyTorchModel
sugli endpoint SageMaker. Il modello YOLOv8, distribuito con licenza GNU GPL3, è un popolare modello di rilevamento degli oggetti noto per la sua efficienza di runtime e per la precisione del rilevamento. Gli endpoint Amazon SageMaker forniscono una soluzione facilmente scalabile e a costi ottimizzati per la distribuzione del modello.
Panoramica della soluzione
L'immagine seguente delinea i servizi AWS utilizzati per ospitare il modello YOLOv8 utilizzando un endpoint SageMaker e richiamare l'endpoint come utente. La soluzione utilizza AWS CloudFormazione per automatizzare la creazione di un'istanza SageMaker e clonare il nostro GitHub repository all'istanza. Il notebook SageMaker accede e scarica un modello PyTorch YOLOv8 e memorizza il codice di inferenza personalizzato insieme al modello in un Servizio di archiviazione semplice Amazon (Amazon S3) secchio. I passaggi all'interno del notebook evidenziano la creazione dell'endpoint SageMaker che ospita il modello PyTorch YOLOv8 e il codice di inferenza personalizzato. Il notebook mostra anche come testare l'endpoint e tracciare i risultati. La soluzione consiste nei seguenti passaggi:
- Abbiamo creato un repository GitHub con due notebook
1_DeployEndpoint.ipynb
ed2_TestEndpoint.ipynb
, sotto ilsm-notebook/
directory. - Il modello AWS CloudFormation viene eseguito, crea un'istanza SageMaker Notebook e quindi clona il repository GitHub.
- Il notebook
1_DeployEndpoint.ipynb
viene utilizzato per scaricare il modello YOLOv8. - Il modello YOLOv8 e il codice di inferenza vengono archiviati come
model.tar.gz
nell'Amazon S3. - Un endpoint SageMaker viene creato ospitando il file
model.tar.gz
. - Il notebook
2_TestEndpoint.ipynb
viene utilizzato per testare l'endpoint e raccogliere i risultati.
Prerequisiti
Account AWS con Ruoli AWS Identity and Access Management (IAM). che fornisce l'accesso a:
- AWS CloudFormazione
- Amazon Sage Maker
- Amazon S3
1. Ospita YOLOv8 su un endpoint SageMaker
Ultralytics ha più modelli YOLOv8 con capacità diverse. Si suddividono in:
- Rilevazione dell'oggetto (
yolov8l.pt, yolov8m.pt, yolov8n.pt, yolov8s.pt, yolov8x.pt, yolov8x6.pt
) - Segmentazione (
yolov8l-seg.pt, yolov8m-seg.pt, yolov8n-seg.pt, yolov8s-seg.pt, yolov8x-seg.pt
) - Classificazione (
yolov8l-cls.pt, yolov8m-cls.pt, yolov8n-cls.pt, yolov8s-cls.pt, yolov8x-cls.pt
)
In questo blog, ci concentriamo sul rilevamento degli oggetti utilizzando yolov8l.pt
Modello PyTorch. Per ospitare il modello YOLOv8 e il codice di inferenza personalizzato sull'endpoint SageMaker, devono essere compressi insieme in un unico model.tar.gz
con la seguente struttura:
model.tar.gz ├─ code/ │ ├── inference.py │ └── requirements.txt └── yolov8l.pt
Il modello pesa yolov8l.pt
il file deve essere al di fuori del file code/
directory e lo script python di inferenza principale inference.py
, che contiene le funzioni necessarie per caricare il modello, analizzare l'input, eseguire l'inferenza e post-elaborare l'output, dovrebbe risiedere in code/
directory. Ulteriori dettagli su inference.py
sono presentati nella sezione seguente.
1.1. Codice di inferenza personalizzato
A seconda della pipeline e del flusso di lavoro del codice, gli input e gli output dagli endpoint SageMaker possono variare. In questo post, presentiamo un flusso di lavoro per passare a numpy
array all'endpoint e all'elaborazione. Tuttavia, gli input per l'endpoint possono essere json
o anche il testo. A seconda del flusso di lavoro, è necessario modificare le funzioni in inference.py
per accogliere diversi ingressi e uscite. Inoltre, con il recente rilascio di YOLOv8, il team di Ultralytics ha rilasciato la propria API Python, che ci consente di installare la libreria YOLO direttamente tramite requirements.txt
e importare il modello in inference.py
.
1.1.1. Contenuti di 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. Contenuti di code/requirements.txt
:
Una volta che tutto il contenuto del file per model.tar.gz
sono finalizzati, esegui il seguente comando per creare un tar ball:
$ tar -czvf model.tar.gz code/ yolov8l.pt
1.2. Ospite model.tar.gz
all'endpoint SageMaker:
Ciò comporta alcuni passaggi in cui il model.tar.gz
viene prima caricato nel bucket S3. L'artefatto caricato viene utilizzato per creare un SageMaker PyTorchModel. Infine, questo PyTorchModel viene utilizzato per distribuire il modello a un endpoint SageMaker.
1.2.1. Carica modello e codice di inferenza su 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. Crea il modello PyTorch di SageMaker:
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. Compilare e ospitare il modello su un endpoint:
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. Testare l'endpoint SageMaker
Una volta ospitato correttamente, l'endpoint può essere utilizzato per eseguire l'inferenza. In questo passaggio, prima leggeremo un'immagine, la convertiremo in byte ed eseguiremo l'inferenza passando i byte come input all'endpoint. I risultati generati avrebbero riquadri di delimitazione o maschere o punteggi di confidenza basati sul tipo di modello YOLOv8 utilizzato per l'hosting. L'output può essere tracciato di conseguenza.
2.1.1. Genera i risultati dell'inferenza e traccia l'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. Risultati:
L'output dei modelli YOLOv8 di rilevamento e segmentazione degli oggetti è mostrato nelle seguenti immagini:
3. Pulire
Eliminazione dello stack CloudFormation rimuoverà tutte le risorse originariamente create. Tuttavia, CloudFormation non è attualmente configurato per rimuovere automaticamente l'endpoint, la configurazione dell'endpoint e il modello. Se l'endpoint ospitato non viene utilizzato, è consigliabile rimuoverlo per risparmiare sui costi. Può essere fatto come segue:
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)
Conclusione
In questo post, abbiamo dimostrato come ospitare un YOLOv8 pre-addestrato PyTorchModel
su un endpoint SageMaker e testare i risultati dell'inferenza richiamando l'endpoint. Il codice dettagliato è disponibile su GitHube lo stack CloudFormation del modello è disponibile anche su GitHub.
Per ulteriori informazioni sugli endpoint SageMaker, dai un'occhiata Crea il tuo endpoint e distribuisci il tuo modello ed Usa PyTorch con Amazon SageMaker, che evidenzia l'utilizzo PyTorchModel
su SageMaker. Il processo può essere automatizzato utilizzando Supporto CloudFormation per SageMaker.
Circa gli autori
Kevin canzone è un Data Scientist presso AWS Professional Services. Ha conseguito un dottorato di ricerca in biofisica e ha più di cinque anni di esperienza nel settore nella creazione di soluzioni di computer vision e machine learning.
Romil Scià è IoT Edge Data Scientist presso AWS Professional Services. Romil ha più di sei anni di esperienza nel settore della visione artificiale, dell'apprendimento automatico e dei dispositivi perimetrali IoT. È coinvolto nell'aiutare i clienti a ottimizzare e implementare i loro modelli di machine learning per dispositivi edge in una configurazione industriale.
- Distribuzione di contenuti basati su SEO e PR. Ricevi amplificazione oggi.
- Platoblockchain. Web3 Metaverse Intelligence. Conoscenza amplificata. Accedi qui.
- Fonte: https://aws.amazon.com/blogs/machine-learning/hosting-yolov8-pytorch-model-on-amazon-sagemaker-endpoints/
- :È
- 1
- 10
- 100
- 7
- a
- WRI
- accesso
- ospitare
- di conseguenza
- Il mio account
- precisione
- aggiunta
- indirizzo
- Tutti
- consente
- Amazon
- Amazon Sage Maker
- ed
- api
- SONO
- Italia
- AS
- At
- automatizzare
- Automatizzata
- automaticamente
- disponibile
- AWS
- Servizi professionali AWS
- palla
- basato
- BE
- essendo
- Biofisica
- Blog
- scatole
- Costruzione
- autobus
- by
- Materiale
- funzionalità
- dai un'occhiata
- classe
- codice
- colore
- COM
- computer
- Visione computerizzata
- fiducia
- Configurazione
- contiene
- contenuto
- testuali
- convertire
- Costi
- creare
- creato
- crea
- creazione
- Attualmente
- costume
- Clienti
- dati
- scienziato di dati
- datetime
- dimostrato
- dimostra
- Dipendente
- schierare
- distribuzione
- deployment
- dettagliati
- dettagli
- rivelazione
- dispositivo
- dispositivi
- diverso
- direttamente
- distribuito
- scaricare
- download
- disegnare
- facilmente
- bordo
- efficienza
- o
- endpoint
- Ingegneri
- esecuzione
- esperienza
- pochi
- Compila il
- finalizzato
- Infine
- Trovate
- Nome
- Focus
- i seguenti
- segue
- Nel
- da
- funzioni
- ulteriormente
- generare
- generato
- GitHub
- buono
- Avere
- aiutare
- Highlight
- evidenzia
- detiene
- host
- ospitato
- di hosting
- padroni di casa
- Come
- Tutorial
- Tuttavia
- HTML
- HTTPS
- Identità
- IDX
- Immagine
- immagini
- importare
- in
- industriale
- industria
- ingresso
- install
- esempio
- interesse
- interessato
- coinvolto
- IoT
- problema
- IT
- SUO
- jpg
- json
- conosciuto
- Cognome
- IMPARARE
- apprendimento
- Biblioteca
- Licenza
- Caricamento in corso
- lotto
- macchina
- machine learning
- Principale
- gestione
- molti
- mask
- Mascherine
- matplotlib
- ML
- modello
- modelli
- modificare
- Scopri di più
- multiplo
- Bisogno
- taccuino
- numpy
- oggetto
- Rilevazione dell'oggetto
- of
- on
- OTTIMIZZA
- minimo
- originariamente
- OS
- lineamenti
- produzione
- al di fuori
- Di passaggio
- conduttura
- Platone
- Platone Data Intelligence
- PlatoneDati
- per favore
- Popolare
- Post
- pratica
- Predictor
- presenti
- presentata
- processi
- lavorazione
- professionale
- fornire
- fornisce
- Python
- pytorch
- aumentare
- casuale
- Leggi
- lettori
- recente
- rilasciare
- rilasciato
- rimuovere
- deposito
- Requisiti
- Risorse
- risposta
- colpevole
- Risultati
- ritorno
- Correre
- running
- sagemaker
- Risparmi
- scalabile
- Scala
- scala
- Scienziato
- scienziati
- Seaborn
- Sezione
- segmentazione
- Servizi
- flessibile.
- Forma
- dovrebbero
- mostrato
- Un'espansione
- singolo
- SIX
- soluzione
- Soluzioni
- pila
- step
- Passi
- conservazione
- memorizzati
- negozi
- La struttura
- Con successo
- supporto
- Task
- team
- modello
- test
- che
- Il
- loro
- tempo
- a
- insieme
- torcia
- Torciavisione
- per
- caricato
- us
- Utente
- visione
- WELL
- quale
- volere
- con
- entro
- sarebbe
- anni
- Yolo
- Tu
- Trasferimento da aeroporto a Sharm
- zefiro