Benutzerdefinierter Inferenzcode mit Hosting-Services
In diesem Abschnitt wird erläutert, wie Amazon SageMaker AI mit einem Docker-Container interagiert, in dem Ihr eigener Inferenzcode für Hosting-Dienste ausgeführt wird. Verwenden Sie diese Informationen zum Schreiben von Inferenzcode und zum Erstellen eines Docker-Images.
Themen
So führt SageMaker AI Ihr Inferenz-Image aus
Um einen Container so zu konfigurieren, dass er als ausführbare Datei ausgeführt wird, verwenden Sie eine ENTRYPOINT-Anweisung in einer Dockerfile. Beachten Sie Folgendes:
-
Für die Modellinferenz führt SageMaker AI den Container wie folgt aus:
docker runimageserveSageMaker AI überschreibt die standardmäßigen
CMD-Anweisungen in einem Container, indem er das Argumentservehinter dem Image-Namen angibt. Dasserve-Argument überschreibt Argumente, die Sie mit demCMD-Befehl in der Dockerfile bereitstellen. -
SageMaker AI geht davon aus, dass alle Container mit Root-Benutzern ausgeführt werden. Erstellen Sie Ihren Container so, dass er nur Root-Benutzer verwendet. Wenn SageMaker AI Ihren Container ausführt, können Benutzer, die keinen Zugriff auf die Stammebene haben, Berechtigungsprobleme verursachen.
-
Es wird empfohlen, das
exec-Formular derENTRYPOINT-Anleitung zu verwenden:ENTRYPOINT ["executable", "param1", "param2"]Zum Beispiel:
ENTRYPOINT ["python", "k_means_inference.py"]Das
exec-Formular derENTRYPOINT-Anweisung startet die ausführbare Datei direkt, nicht als untergeordnetes Element von/bin/sh. Dadurch kann er Signale wieSIGTERMundSIGKILLvom SageMaker-API-Betrieb empfangen, was eine Voraussetzung ist.Wenn Sie beispielsweise die
CreateEndpoint-API verwenden, um einen Endpunkt herzustellen, stellt SageMaker AI die für die Endpunktkonfiguration erforderliche Anzahl von ML-Compute-Instances bereit, die Sie in der Anforderung angeben. SageMaker AI führt den Docker-Container auf diesen Instances aus.Wenn Sie die Anzahl der Instances, die den Endpunkt unterstützen, reduzieren (durch Aufruf der
UpdateEndpointWeightsAndCapacities-API), führt SageMaker AI einen Befehl aus, um den Docker-Container auf den Instances zu stoppen, die beendet werden. Der Befehl sendet dasSIGTERM-Signal und dann dreißig Sekunden später dasSIGKILL-Signal.Wenn Sie den Endpunkt aktualisieren (durch Aufrufen der
UpdateEndpoint-API), startet SageMaker AI einen weiteren Satz von ML-Compute-Instances und führt die Docker-Container aus, die Ihren Inferenzcode enthalten. Anschließend wird ein Befehl zum Beenden der vorherigen Docker-Container ausgeführt. Um einen Docker-Container anzuhalten, sendet der Befehl das SignalSIGTERMund 30 Sekunden später das SignalSIGKILL. -
SageMaker AI verwendet die Containerdefinition, die Sie in Ihrer
CreateModel-Anfrage angegeben haben, um Umgebungsvariablen und den DNS-Hostnamen für den Container wie folgt zu setzen:-
Es legt Umgebungsvariablen mithilfe der Zeichenfolge-zu-Zeichenfolge-Zuweisung
ContainerDefinition.Environmentfest. -
Es legt den DNS-Hostnamen mithilfe von
ContainerDefinition.ContainerHostnamefest.
-
-
Wenn Sie planen, GPU-Geräte für Modellinferenzen zu verwenden (indem Sie GPU-basierte ML-Rechen-Instances in Ihrer
CreateEndpointConfig-Anforderung angeben), stellen Sie sicher, dass Ihre Containernvidia-docker-kompatibel sind. Bündeln Sie NVIDIA-Treiber nicht mit dem Abbild. Mehr Informationen übernvidia-dockerfinden Sie unter NVIDIA/nvidia-docker. -
Sie können den
tini-Initialisierer nicht als Eintrittspunkt in SageMaker-AI-Containern verwenden, da er durch die Argumentetrainundserveverwirrt wird.
So lädt SageMaker AI Ihre Modellartefakte
In Ihrer CreateModel-API-Anfrage können Sie entweder den Parameter ModelDataUrl oder S3DataSource verwenden, um den S3-Speicherort zu identifizieren, an dem Modellartefakte gespeichert sind. SageMaker AI kopiert Ihre Modellartefakte vom S3-Speicherort in das /opt/ml/model-Verzeichnis zur Verwendung durch Ihren Inferenzcode. Ihr Container hat schreibgeschützten Zugriff auf /opt/ml/model. Schreiben Sie nicht in dieses Verzeichnis.
Die ModelDataUrl muss auf eine TAR.GZ-Datei zeigen. Andernfalls wird SageMaker AI die Datei nicht herunterladen.
Wenn Sie Ihr Modell in SageMaker AI trainiert haben, werden die Modellartefakte als eine einzige komprimierte TAR-Datei in Amazon S3 gespeichert. Wenn Sie Ihr Modell außerhalb von SageMaker AI trainiert haben, müssen Sie diese einzelne komprimierte TAR-Datei erstellen und an einem S3-Speicherort speichern. SageMaker AI dekomprimiert diese TAR-Datei in das Verzeichnis /opt/ml/model, bevor Ihr Container gestartet wird.
Wir empfehlen, für die Bereitstellung großer Modelle Bereitstellung unkomprimierter Modelle zu befolgen.
So sollte Ihr Container auf Inferenzanforderungen reagieren
Um Rückschlüsse zu erhalten, sendet die Client-Anwendung eine POST-Anforderung an den SageMaker-AI-Endpunkt. SageMaker AI übergibt die Anfrage an den Container und gibt das Ergebnis der Inferenz vom Container an den Client zurück.
Mehr Informationen über Inferenzanfragen, die Ihr Container erhält, finden Sie in den folgenden Aktionen in der Referenz zur API von Amazon SageMaker AI:
Anforderungen für Inferenzcontainer
Um auf Inferenzanfragen zu antworten, muss Ihr Container die folgenden Anforderungen erfüllen:
-
SageMaker AI entfernt alle
POST-Header außer denen, die vonInvokeEndpointunterstützt werden. SageMaker AI fügt möglicherweise zusätzliche Header hinzu. Inferenzcontainer müssen diese zusätzlichen Header einfach ignorieren können. -
Um Inferenzanfragen zu erhalten, muss der Container über einen Webserver verfügen, der auf Port 8080 lauscht, und er muss
POST-Anfragen an die Endpunkte/invocationsund/pingakzeptieren. -
Ein Containermodell des Kunden muss Socket-Verbindungsanfragen innerhalb von 250 ms akzeptieren.
-
Die Modellcontainer eines Kunden müssen innerhalb von 60 Sekunden auf Anforderungen reagieren. Das Modell selbst kann eine maximale Bearbeitungszeit von 60 Sekunden haben, bevor es auf die
/invocationsantwortet. Wenn Ihr Modell 50 bis 60 Sekunden Verarbeitungszeit benötigt, legen Sie das SDK-Socket-Timeout auf 70 Sekunden fest.
Beispiel Aufruf-Funktionen
Die folgenden Beispiele zeigen, wie der Code in Ihrem Container Inferenzanfragen verarbeiten kann. In diesen Beispielen werden Anforderungen behandelt, die Clientanwendungen mithilfe der Aktion InvokeEndpoint senden.
Beispiel Aufruffunktionen für Streaming-Anfragen
Die folgenden Beispiele zeigen, wie der Code in Ihrem Inferenzcontainer Streaming-Inferenzanfragen verarbeiten kann. In diesen Beispielen werden Anfragen behandelt, die Clientanwendungen mithilfe der Aktion InvokeEndpointWithResponseStream senden.
Wenn ein Container eine Streaming-Inferenzanforderung verarbeitet, gibt er die Inferenz des Modells inkrementell als eine Reihe von Teilen zurück, während das Modell sie generiert. Client-Anwendungen erhalten sofort Antworten, wenn sie verfügbar sind. Sie müssen nicht warten, bis das Modell die gesamte Antwort generiert hat. Sie können Streaming implementieren, um schnelle interaktive Erlebnisse wie Chatbots, virtuelle Assistenten und Musikgeneratoren zu unterstützen.
So sollte Ihr Container auf Zustandsprüfungsanforderungen (Ping-Anforderungen) reagieren
SageMaker AI führt in folgenden Situationen neue Inferenzcontainer ein:
-
Reagieren auf die API-Aufrufe
CreateEndpoint,UpdateEndpointundUpdateEndpointWeightsAndCapacities -
Ausführen von Sicherheits-Patching
-
Ersetzen fehlerhafter Instances
Kurz nach dem Start des Containers beginnt SageMaker AI, regelmäßig GET-Anforderungen an den /ping-Endpunkt zu senden.
Die einfachste Anforderung für den Container besteht darin, mit einem HTTP 200-Statuscode ohne Text zu antworten. Dies zeigt SageMaker AI an, dass der Container bereit ist, Inferenzanfragen am /invocations-Endpunkt anzunehmen.
Wenn der Container in den ersten 8 Minuten nach dem Start nicht beginnt, die Zustandsprüfungen zu bestehen, in dem er durchweg mit 200s antwortet, schlägt der Start der neuen Instance fehl. Dies führt zu einem Fehlschlag von CreateEndpoint und der Endpunkt befindet sich in einem ausgefallenen Zustand. Die von UpdateEndpoint angeforderte Aktualisierung wird nicht abgeschlossen, die Sicherheitspatches werden nicht angewendet und fehlerhafte Instances werden nicht ersetzt.
Die Mindestgrenze besteht darin, dass der Container statische 200 zurückgibt, ein Containerentwickler kann diese Funktionalität jedoch nutzen, um umfassendere Prüfungen durchzuführen. Das Anforderungstimeout bei /ping-Versuchen beträgt 2 Sekunden.