Die Bereitstellung von Modellen im großen Maßstab kann für viele Datenwissenschaftler und Ingenieure für maschinelles Lernen eine mühselige Aufgabe sein. Amazon SageMaker-Endpunkte bieten jedoch eine einfache Lösung zum Bereitstellen und Skalieren Ihrer Machine Learning (ML)-Modellrückschlüsse. Unser letztes Blog-Post und GitHub Repo beim Hosten von a YOlov5 TensorFlowModel
on Amazon Sage Maker Endpunkte stieß bei unseren Lesern auf großes Interesse. Viele Leser waren auch daran interessiert zu erfahren, wie man das YOLOv5-Modell hostet PyTorch
. Um dieses Problem anzugehen und mit der jüngsten Veröffentlichung von YOlov8 Modell aus Ultralytika, präsentieren wir diesen Beitrag zum Hosten eines YOLOv8 PyTorchModel
auf SageMaker-Endpunkten. Das YOLOv8-Modell, das unter der GNU GPL3-Lizenz vertrieben wird, ist ein beliebtes Objekterkennungsmodell, das für seine Laufzeiteffizienz und Erkennungsgenauigkeit bekannt ist. Amazon SageMaker-Endpunkte bieten eine einfach skalierbare und kostenoptimierte Lösung für die Modellbereitstellung.
Lösungsüberblick
Das folgende Bild skizziert die AWS-Services, die verwendet werden, um das YOLOv8-Modell mit einem SageMaker-Endpunkt zu hosten und den Endpunkt als Benutzer aufzurufen. Die Lösung verwendet AWS CloudFormation um die Erstellung einer SageMaker-Instanz zu automatisieren und unsere zu klonen GitHub Repository zur Instanz. Das SageMaker-Notebook greift auf ein YOLOv8-PyTorch-Modell zu und lädt es herunter und speichert den benutzerdefinierten Inferenzcode zusammen mit dem Modell in einer Amazon Simple Storage-Service (Amazon S3) Eimer. Die Schritte im Notebook heben die Erstellung des SageMaker-Endpunkts hervor, der das YOLOv8-PyTorch-Modell und den benutzerdefinierten Inferenzcode hostet. Das Notebook zeigt auch, wie der Endpunkt getestet und die Ergebnisse grafisch dargestellt werden. Die Lösung besteht aus folgenden Schritten:
- Wir haben ein GitHub-Repository mit zwei Notebooks erstellt
1_DeployEndpoint.ipynb
und2_TestEndpoint.ipynb
, Unter dersm-notebook/
Verzeichnis. - Die AWS CloudFormation-Vorlage wird ausgeführt, erstellt eine SageMaker Notebook-Instance und klont dann das GitHub-Repository.
- Das Notebook
1_DeployEndpoint.ipynb
wird verwendet, um das YOLOv8-Modell herunterzuladen. - Das YOLOv8-Modell und der Inferenzcode werden gespeichert als
model.tar.gz
bei Amazon S3. - Ein SageMaker-Endpunkt wird durch das Hosten von erstellt
model.tar.gz
. - Das Notebook
2_TestEndpoint.ipynb
wird verwendet, um den Endpunkt zu testen und Ergebnisse zu sammeln.
Voraussetzungen:
AWS-Konto mit AWS Identity and Access Management (IAM)-Rollen das bietet Zugriff auf:
- AWS CloudFormation
- Amazon Sage Maker
- Amazon S3
1. Hosten Sie YOLOv8 auf einem SageMaker-Endpunkt
Ultralytics hat mehrere YOLOv8-Modelle mit unterschiedlichen Fähigkeiten. Sie sind wie folgt unterteilt:
- Objekterkennung (
yolov8l.pt, yolov8m.pt, yolov8n.pt, yolov8s.pt, yolov8x.pt, yolov8x6.pt
) - Segmentierung (
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
)
In diesem Blog konzentrieren wir uns auf die Objekterkennung mit yolov8l.pt
PyTorch-Modell. Um das YOLOv8-Modell und den benutzerdefinierten Inferenzcode auf dem SageMaker-Endpunkt zu hosten, müssen sie zu einer einzigen komprimiert werden model.tar.gz
mit folgendem Aufbau:
model.tar.gz ├─ code/ │ ├── inference.py │ └── requirements.txt └── yolov8l.pt
Die Modellgewichte yolov8l.pt
Datei muss außerhalb der sein code/
Verzeichnis und das Hauptinferenz-Python-Skript inference.py
, das die Funktionen enthält, die zum Laden des Modells, zum Analysieren der Eingabe, zum Ausführen der Inferenz und zum Nachbearbeiten der Ausgabe erforderlich sind, sollte sich unter befinden code/
Verzeichnis. Weitere Details auf inference.py
werden im folgenden Abschnitt vorgestellt.
1.1. Benutzerdefinierter Rückschlusscode
Abhängig von Ihrer Pipeline und Ihrem Code-Workflow können Ein- und Ausgaben von SageMaker-Endpunkten variieren. In diesem Beitrag stellen wir einen Workflow zum Bestehen einer numpy
Array zum Endpunkt und Verarbeitung. Die Eingänge zum Endpunkt können jedoch sein json
oder auch Text. Abhängig von Ihrem Arbeitsablauf müssen Sie die Funktionen in anpassen inference.py
um unterschiedliche Ein- und Ausgänge unterzubringen. Darüber hinaus hat das Ultralytics-Team mit der jüngsten Veröffentlichung von YOLOv8 seine Python-API veröffentlicht, die es uns ermöglicht, die YOLO-Bibliothek direkt darüber zu installieren requirements.txt
und importiere das Modell in inference.py
.
1.1.1. Inhalt von 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. Inhalt von code/requirements.txt
:
Einmal alle Dateiinhalte für model.tar.gz
abgeschlossen sind, führen Sie den folgenden Befehl aus, um eine Tar-Kugel zu erstellen:
$ tar -czvf model.tar.gz code/ yolov8l.pt
1.2. Gastgeber model.tar.gz
zum SageMaker-Endpunkt:
Dies beinhaltet einige Schritte, wobei die model.tar.gz
wird zuerst in den S3-Bucket hochgeladen. Das hochgeladene Artefakt wird verwendet, um ein SageMaker-PyTorchModel zu erstellen. Und schließlich wird dieses PyTorchModel verwendet, um das Modell auf einem SageMaker-Endpunkt bereitzustellen.
1.2.1. Laden Sie Modell- und Inferenzcode in S3 hoch:
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. SageMaker PyTorchModel erstellen:
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. Kompilieren und hosten Sie das Modell auf einem Endpunkt:
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. Testen Sie den SageMaker-Endpunkt
Sobald der Endpunkt erfolgreich gehostet wurde, kann er zum Ausführen von Inferenzen verwendet werden. In diesem Schritt lesen wir zuerst ein Bild, konvertieren es in Bytes und führen eine Inferenz durch, indem wir die Bytes als Eingabe an den Endpunkt übergeben. Die generierten Ergebnisse hätten entweder Begrenzungsrahmen oder Masken oder Konfidenzwerte basierend auf dem Typ des YOLOv8-Modells, das für das Hosting verwendet wird. Die Ausgabe kann entsprechend geplottet werden.
2.1.1. Inferenzergebnisse generieren und Ausgabe plotten:
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. Ergebnisse:
Die Ausgabe der YOLOv8-Modelle zur Objekterkennung und -segmentierung ist in den folgenden Bildern dargestellt:
3 Aufräumen
Löschen des CloudFormation-Stacks würde alle ursprünglich erstellten Ressourcen entfernen. Allerdings ist CloudFormation derzeit nicht so konfiguriert, dass der Endpunkt, die Endpunktkonfiguration und das Modell automatisch entfernt werden. Wenn der gehostete Endpunkt nicht verwendet wird, empfiehlt es sich, ihn zu entfernen, um Kosten zu sparen. Es kann wie folgt durchgeführt werden:
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)
Zusammenfassung
In diesem Beitrag haben wir gezeigt, wie man ein vortrainiertes YOLOv8 hostet PyTorchModel
auf einem SageMaker-Endpunkt und testen Sie die Inferenzergebnisse durch Aufrufen des Endpunkts. Den detaillierten Code finden Sie unter GitHub, und der Vorlagen-CloudFormation-Stack ist auch auf GitHub verfügbar.
Weitere Informationen zu SageMaker-Endpunkten finden Sie unter Erstellen Sie Ihren Endpunkt und stellen Sie Ihr Modell bereit und Verwenden Sie PyTorch mit Amazon SageMaker, das die Verwendung hervorhebt PyTorchModel
auf SageMaker. Der Prozess kann mit automatisiert werden CloudFormation-Unterstützung für SageMaker.
Über die Autoren
Kevin Lied ist Data Scientist bei AWS Professional Services. Er hat einen Doktortitel in Biophysik und verfügt über mehr als fünf Jahre Branchenerfahrung in der Entwicklung von Lösungen für Computer Vision und maschinelles Lernen.
Romil Schah ist IoT Edge Data Scientist bei AWS Professional Services. Romil verfügt über mehr als sechs Jahre Branchenerfahrung in den Bereichen Computer Vision, maschinelles Lernen und IoT-Edge-Geräte. Er ist daran beteiligt, Kunden bei der Optimierung und Bereitstellung ihrer maschinellen Lernmodelle für Edge-Geräte in einem industriellen Setup zu unterstützen.
- SEO-gestützte Content- und PR-Distribution. Holen Sie sich noch heute Verstärkung.
- Platoblockkette. Web3-Metaverse-Intelligenz. Wissen verstärkt. Hier zugreifen.
- Quelle: https://aws.amazon.com/blogs/machine-learning/hosting-yolov8-pytorch-model-on-amazon-sagemaker-endpoints/
- :Ist
- 1
- 10
- 100
- 7
- a
- Über Uns
- Zugang
- unterbringen
- entsprechend
- Konto
- Genauigkeit
- Zusatz
- Adresse
- Alle
- erlaubt
- Amazon
- Amazon Sage Maker
- und
- Bienen
- SIND
- Feld
- AS
- At
- automatisieren
- Automatisiert
- Im Prinzip so, wie Sie es von Google Maps kennen.
- verfügbar
- AWS
- Professionelle AWS-Services
- Ball
- basierend
- BE
- Sein
- Biophysik
- Blog
- Boxen
- Building
- Bus
- by
- CAN
- Fähigkeiten
- aus der Ferne überprüfen
- Klasse
- Code
- Farbe
- COM
- Computer
- Computer Vision
- Vertrauen
- Konfiguration
- enthält
- Inhalt
- Inhalt
- verkaufen
- Kosten
- erstellen
- erstellt
- schafft
- Schaffung
- Zur Zeit
- Original
- Kunden
- technische Daten
- Datenwissenschaftler
- datetime
- Synergie
- zeigt
- Abhängig
- einsetzen
- Bereitstellen
- Einsatz
- detailliert
- Details
- Entdeckung
- Gerät
- Geräte
- anders
- Direkt
- verteilt
- herunterladen
- Downloads
- zeichnen
- leicht
- Edge
- Effizienz
- entweder
- Endpunkt
- Ingenieure
- Ausführung
- ERFAHRUNGEN
- wenige
- Reichen Sie das
- abgeschlossen
- Endlich
- Finden Sie
- Vorname
- Setzen Sie mit Achtsamkeit
- Folgende
- folgt
- Aussichten für
- für
- Funktionen
- weiter
- erzeugen
- erzeugt
- GitHub
- gut
- Haben
- Unternehmen
- Hervorheben
- Highlights
- hält
- Gastgeber
- gehostet
- Hosting
- Gastgeber
- Ultraschall
- Hilfe
- aber
- HTML
- HTTPS
- Identitätsschutz
- IDX
- Image
- Bilder
- importieren
- in
- industriell
- Energiegewinnung
- Varianten des Eingangssignals:
- installieren
- Instanz
- Interesse
- interessiert
- beteiligt
- iot
- Problem
- IT
- SEINE
- jpg
- JSON
- bekannt
- Nachname
- LERNEN
- lernen
- Bibliothek
- Lizenz
- Laden
- Los
- Maschine
- Maschinelles Lernen
- Main
- Management
- viele
- Maske"
- Masken
- Matplotlib
- ML
- Modell
- für
- ändern
- mehr
- mehrere
- Need
- Notizbuch
- numpig
- Objekt
- Objekterkennung
- of
- on
- Optimieren
- Auftrag
- ursprünglich
- OS
- Umrissen
- Möglichkeiten für das Ausgangssignal:
- aussen
- Bestehen
- Pipeline
- Plato
- Datenintelligenz von Plato
- PlatoData
- Bitte
- Beliebt
- Post
- Praxis
- Predictor
- Gegenwart
- vorgeführt
- Prozessdefinierung
- Verarbeitung
- Professionell
- die
- bietet
- Python
- Pytorch
- erhöhen
- zufällig
- Lesen Sie mehr
- Leser
- kürzlich
- Release
- freigegeben
- entfernen
- Quelle
- Voraussetzungen:
- Downloads
- Antwort
- Folge
- Die Ergebnisse
- Rückkehr
- Führen Sie
- Laufen
- sagemaker
- Speichern
- skalierbaren
- Skalieren
- Skalierung
- Wissenschaftler
- Wissenschaftler
- Seeschneur
- Abschnitt
- Segmentierung
- Lösungen
- Setup
- Form
- sollte
- gezeigt
- Einfacher
- Single
- SIX
- Lösung
- Lösungen
- Stapel
- Schritt
- Shritte
- Lagerung
- gelagert
- Läden
- Struktur
- Erfolgreich
- Support
- Aufgabe
- Team
- Vorlage
- Test
- zur Verbesserung der Gesundheitsgerechtigkeit
- Das
- ihr
- Zeit
- zu
- gemeinsam
- Fackel
- Fackelvision
- für
- hochgeladen
- us
- Mitglied
- Seh-
- GUT
- welche
- werden wir
- mit
- .
- würde
- Jahr
- Yolo
- Du
- Ihr
- Zephyrnet