Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Benutzerdefinierter Inferenzcode mit Hosting-Services
In diesem Abschnitt wird erklärt, wie Amazon SageMaker AI mit einem Docker-Container interagiert, der Ihren eigenen Inferenzcode für Hosting-Dienste ausführt. Verwenden Sie diese Informationen zum Schreiben von Inferenzcode und zum Erstellen eines Docker-Images.
Themen
Wie SageMaker KI Ihr Inferenz-Image ausführt
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 KI den Container wie folgt aus:
docker runimageserveSageMaker AI überschreibt
CMDStandardanweisungen in einem Container, indem dasserveArgument hinter dem Bildnamen angegeben wird. Dasserve-Argument überschreibt Argumente, die Sie mit demCMD-Befehl in der Dockerfile bereitstellen. -
SageMaker AI erwartet, dass alle Container mit Root-Benutzern ausgeführt werden. Erstellen Sie Ihren Container so, dass er nur Root-Benutzer verwendet. Wenn SageMaker KI Ihren Container ausführt, können Benutzer, die keinen Zugriff auf Root-Ebene haben, zu Berechtigungsproblemen führen.
-
Es wird empfohlen, das
exec-Formular derENTRYPOINT-Anleitung zu verwenden:ENTRYPOINT ["executable", "param1", "param2"]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 es Signale wieSIGTERMundSIGKILLvon den SageMaker API-Operationen empfangen, was eine Voraussetzung ist.Wenn Sie beispielsweise die
CreateEndpointAPI verwenden, um einen Endpunkt zu erstellen, stellt SageMaker KI die Anzahl der ML-Compute-Instanzen bereit, die für die Endpunktkonfiguration erforderlich sind, die Sie in der Anfrage angeben. SageMaker AI führt den Docker-Container auf diesen Instanzen aus.Wenn Sie die Anzahl der Instanzen reduzieren, die den Endpunkt unterstützen (indem Sie die
UpdateEndpointWeightsAndCapacitiesAPI aufrufen), führt SageMaker AI einen Befehl aus, um den Docker-Container auf den Instanzen zu stoppen, die beendet werden. Der Befehl sendet dasSIGTERM-Signal und dann dreißig Sekunden später dasSIGKILL-Signal.Wenn Sie den Endpunkt aktualisieren (indem Sie die
UpdateEndpointAPI aufrufen), startet SageMaker KI einen weiteren Satz von ML-Compute-Instances und führt die Docker-Container, die Ihren Inferenzcode enthalten, auf ihnen aus. 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 Container-Definition, die Sie in Ihrer
CreateModelAnfrage angegeben haben, um Umgebungsvariablen und den DNS-Hostnamen für den Container wie folgt festzulegen:-
Es legt Umgebungsvariablen mithilfe der Zeichenfolge-zu-Zeichenfolge-Zuweisung
ContainerDefinition.Environmentfest. -
Es legt den DNS-Hostnamen mithilfe von
ContainerDefinition.ContainerHostnamefest.
-
-
Wenn Sie GPU-Geräte für Modellinferenzen verwenden möchten (indem Sie in Ihrer
CreateEndpointConfigAnfrage GPU-based ML-Compute-Instances angeben), stellen Sie sicher, dass Ihre Container kompatibel sindnvidia-docker. Bündeln Sie NVIDIA-Treiber nicht mit dem Abbild. Mehr übernvidia-dockererfahren Sie unter NVIDIA/nvidia-docker. -
Sie können den
tiniInitialisierer nicht als Einstiegspunkt in SageMaker KI-Container verwenden, da er durch dietrainArgumente und verwirrt wird.serve
Wie SageMaker KI Ihre Modellartefakte lädt
In Ihrer CreateModelAPI-Anfrage können Sie entweder den S3DataSource Parameter ModelDataUrl oder 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, sodass sie von Ihrem Inferenzcode verwendet werden können. 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 KI trainiert haben, werden die Modellartefakte als eine einzige komprimierte TAR-Datei in Amazon S3 gespeichert. Wenn Sie Ihr Modell außerhalb von SageMaker KI 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 ziehen, sendet die Client-Anwendung eine POST-Anfrage an den AI-Endpunkt. SageMaker SageMaker AI leitet die Anfrage an den Container weiter und gibt das Inferenzergebnis vom Container an den Client zurück.
Weitere Informationen zu den Inferenzanfragen, die Ihr Container erhält, finden Sie in den folgenden Aktionen in der Amazon SageMaker AI API-Referenz:
Anforderungen für Inferenzcontainer
Um auf Inferenzanfragen zu antworten, muss Ihr Container die folgenden Anforderungen erfüllen:
-
SageMaker AI entfernt alle
POSTHeader außer denen, die von unterstützt werden.InvokeEndpointSageMaker KI 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. -
Der Modellcontainer eines Kunden, der bidirektionales Streaming unterstützt, muss:
-
unterstützt standardmäßig WebSockets Verbindungen über Port 8080 zu /invocations-bidirectional-stream.
-
einen Webserver haben, der auf Port 8080 wartet und POST-Anfragen an die /ping-Endpunkte akzeptieren muss.
-
Zusätzlich zu den Container-Integritätsprüfungen über HTTP muss der Container mit Pong Frame per (RFC6455
) antworten, wenn ein Ping-Frame gesendet wird. WebSocket
-
Beispiel Aufruf-Funktionen
Die folgenden Beispiele zeigen, wie der Code in Ihrem Container Inferenzanfragen verarbeiten kann. In diesen Beispielen werden Anfragen behandelt, die Client-Anwendungen mithilfe der Aktion senden. InvokeEndpoint
Beispiel Aufruffunktionen für Streaming-Anfragen
Die folgenden Beispiele zeigen, wie der Code in Ihrem Inferenzcontainer Streaming-Inferenzanfragen verarbeiten kann. Diese Beispiele behandeln Anfragen, die Client-Anwendungen mithilfe der InvokeEndpointWithResponseStream Aktion 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.
Beispiel Beispiel für Aufruffunktionen für bidirektionales Streaming
Die folgenden Beispiele zeigen, wie der Code in Ihrem Container Streaming-Inferenzanfragen und -antworten verarbeiten kann. In diesen Beispielen werden Streaming-Anfragen behandelt, die Client-Anwendungen mithilfe der InvokeEndpointWithBidirectionalStream Aktion senden.
Ein Container mit bidirektionaler Streaming-Funktion verarbeitet Streaming-Inferenzanforderungen, bei denen Teile inkrementell auf dem Client generiert und in den Container gestreamt werden. Er gibt die Inferenz des Modells in Form einer Reihe von Teilen an den Client zurück, sobald das Modell sie generiert. Client-Anwendungen erhalten sofort Antworten, wenn sie verfügbar sind. Sie müssen nicht auf die Anfrage warten, die vollständig auf dem Client generiert wurde, oder darauf, dass das Modell die gesamte Antwort generiert. Sie können bidirektionales Streaming implementieren, um schnelle interaktive Erlebnisse wie Chatbots, interaktive KI-Sprachassistenten und Übersetzungen in Echtzeit zu unterstützen und so ein Erlebnis in Echtzeit zu ermöglichen.
So sollte Ihr Container auf Zustandsprüfungsanforderungen (Ping-Anforderungen) reagieren
SageMaker KI startet in den folgenden Situationen neue Inferenzcontainer:
-
Reagieren auf die API-Aufrufe
CreateEndpoint,UpdateEndpointundUpdateEndpointWeightsAndCapacities -
Ausführen von Sicherheits-Patching
-
Ersetzen fehlerhafter Instances
Kurz nach dem Start des Containers beginnt SageMaker KI, regelmäßige GET-Anfragen 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. Der Container kann beispielsweise überprüfen, ob das Modell in den Speicher geladen ist, und Inferenzanfragen bearbeiten. Das Anforderungstimeout bei /ping-Versuchen beträgt 2 Sekunden.
Wir empfehlen dringend, aussagekräftige Integritätsprüfungen durchzuführen, anstatt statische 200 zurückzugeben. Der /ping Endpunkt ist das Hauptsignal, anhand dessen SageMaker KI bestimmt, ob eine Instanz fehlerfrei ist. Wenn Ihr Container immer 200 zurückgibt — auch wenn das Modell nicht geladen werden konnte, nicht mehr genügend Arbeitsspeicher zur Verfügung steht oder in einen fehlerhaften Zustand übergegangen ist — leitet SageMaker KI weiterhin Inferenzanfragen an diese Instanz weiter. Dies führt zu anhaltenden Aufruffehlern für Ihre Anwendung, bis die Instanz manuell ersetzt oder der Endpunkt aktualisiert wird.
Ein gut implementierter /ping Handler sollte Folgendes überprüfen:
-
Das Modellartefakt ist geladen und einsatzbereit
-
Kritische Ressourcen (Arbeitsspeicher, Festplatte, GPU, falls zutreffend) sind verfügbar
-
Der Inferenzcodepfad ist funktionsfähig (z. B. ist eine einfache Testvorhersage erfolgreich)
Wenn ein fehlerhafter Zustand /ping korrekt gemeldet wird, indem eine Antwort von weniger als 200 zurückgegeben wird, erkennt SageMaker KI den Fehler und ersetzt die Instanz automatisch (mit Ausnahme von Endpunkten, die Inferenzkomponenten verwenden), wodurch die Ausfallzeiten für Ihre Anwendung minimiert werden.
Darüber hinaus muss ein Container, der bidirektionale Streaming-Anfragen verarbeiten kann, mit einem Pong Frame (gemäß WebSocket Protokoll RFC6455) auf einen Ping-Frame antworten.
Container-Vertrag zur Support bidirektionaler Streaming-Funktionen
Wenn Sie Ihren Modellcontainer als SageMaker KI-Endpunkt hosten möchten, der bidirektionale Streaming-Funktionen unterstützt, muss der Modellcontainer den folgenden Vertrag unterstützen:
1. Bidirektionales Docker-Label
Der Modellcontainer sollte ein Docker-Label haben, das der SageMaker KI-Plattform mitteilt, dass die bidirektionale Streaming-Funktion auf diesem Container unterstützt wird.
com.amazonaws.sagemaker.capabilities.bidirectional-streaming=true
2. WebSocket Support-Verbindung für Aufrufe
Der Modellcontainer eines Kunden, der bidirektionales Streaming unterstützt, muss standardmäßig WebSockets Verbindungen über Port 8080 bis unterstützen. /invocations-bidirectional-stream
Dieser Pfad kann überschrieben werden, indem beim Aufruf der API ein X-Amzn-SageMaker-Model-Invocation-Path Header übergeben wird. InvokeEndpointWithBidirectionalStream Darüber hinaus können Benutzer eine Abfragezeichenfolge angeben, die an diesen Pfad angehängt werden soll, indem sie beim Aufrufen der API den X-Amzn-SageMaker-Model-Query-String Header übergeben. InvokeEndpointWithBidirectionalStream
3. Stream-Behandlung anfragen
<Blob>Die InvokeEndpointWithBidirectionalStream API-Eingabe-Payloads werden als eine Reihe von Dateien gestreamt PayloadParts, was nur ein Wrapper eines binären Chunks („Bytes“:) ist:
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE> "P": <String> } }
3.1. Datenrahmen
SageMaker AI übergibt die Eingabe PayloadParts als WebSocket Datenrahmen (RFC6455-Section-5.6
-
SageMaker KI untersucht den binären Chunk nicht.
-
Beim Empfang einer Eingabe PayloadPart
-
SageMaker KI erstellt genau einen WebSocket Datenrahmen aus
PayloadPart.Bytesund übergibt ihn dann an den Modellcontainer. -
Wenn
PayloadPart.DataType = UTF8, SageMaker KI einen Textdatenrahmen erstellt -
Wenn
PayloadPart.DataTypekein oder vorhanden istPayloadPart.DataType = BINARY, erstellt SageMaker AI einen binären Datenrahmen
-
-
Bei einer Sequenz aus „ PayloadParts mit
PayloadPart.CompletionState = PARTIAL“ und einer abschließend durch ein „ PayloadPart mitPayloadPart.CompletionState = COMPLETE“ übersetzt SageMaker KI sie in eine WebSocket fragmentierte Nachricht RFC6455-Section-5.4: Fragmentierung:-
Das erste PayloadPart mit
PayloadPart.CompletionState = PARTIALwird in einen WebSocket Datenrahmen übersetzt, wobei das FIN-Bit leer ist. -
Das darauffolgende PayloadParts mit
PayloadPart.CompletionState = PARTIALwird in WebSocket Continuation-Frames übersetzt, wobei das FIN-Bit leer ist. -
Das letzte PayloadPart mit
PayloadPart.CompletionState = COMPLETEwird in ein WebSocket Continuation Frame übersetzt, bei dem das FIN-Bit gesetzt ist.
-
-
SageMaker AI kodiert oder dekodiert den binären Chunk aus der Eingabe nicht PayloadPart, die Bytes werden unverändert an den Modellcontainer übergeben.
-
SageMaker KI kombiniert nicht mehrere Eingaben zu einer. PayloadParts BinaryDataFrame
-
SageMaker KI teilt eine Eingabe nicht PayloadPart in mehrere BinaryDataFrames auf.
Beispiel: Fragmentierter Nachrichtenfluss
Client sends: PayloadPart 1: {Bytes: "Hello ", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: "World", DataType: "UTF8", CompletionState: "COMPLETE"} Container receives: Frame 1: Text Data Frame with "Hello " (FIN=0) Frame 2: Continuation Frame with "World" (FIN=1)
3.2. Kontrollrahmen
Neben Datenrahmen sendet SageMaker KI auch Kontrollrahmen an den Modellcontainer (RFC6455-Section-5.5
-
Frame schließen: SageMaker KI kann Close Frame (RFC6455-Section-5.5.1
) an den Modellcontainer senden, falls die Verbindung aus irgendeinem Grund geschlossen wird. -
Ping-Frame: Die SageMaker KI sendet Ping Frame (RFC6455-Section-5.5.2
) einmal alle 60 Sekunden, der Modellcontainer muss mit Pong Frame antworten. Wenn für 5 aufeinanderfolgende Pings kein Pong Frame (RFC6455-Section-5.5.3 ) empfangen wird, wird die Verbindung von KI geschlossen. SageMaker -
Pong Frame: Die SageMaker KI reagiert auf Ping-Frames aus dem Modellcontainer mit Pong Frames.
4. Verarbeitung von Antwortstreams
Die Ausgabe wird als eine Reihe von PayloadParts ModelStreamErrors oder InternalStreamFailures gestreamt.
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE>, }, "ModelStreamError": { "ErrorCode": <String>, "Message": <String> }, "InternalStreamFailure": { "Message": <String> } }
4.1. Datenrahmen
SageMaker KI konvertiert vom Modellcontainer empfangene Datenrahmen in eine Ausgabe PayloadParts:
-
Beim Empfang eines WebSocket Textdatenrahmens aus dem Modellcontainer ruft SageMaker AI die Rohbytes aus dem Textdatenrahmen ab und verpackt sie in eine Antwort PayloadPart, die inzwischen eingestellt
PayloadPart.DataType = UTF8ist. -
Beim Empfang eines WebSocket binären Datenrahmens aus dem Modellcontainer verpackt SageMaker KI die Bytes aus dem Datenrahmen direkt in eine Antwort PayloadPart, die inzwischen gesetzt ist.
PayloadPart.DataType = BINARY -
Für fragmentierte Nachrichten, wie in RFC6455-Section-5.4: Fragmentierung definiert:
-
Der anfängliche Datenrahmen mit FIN-Bit Clear wird in ein PayloadPart With-Zeichen übersetzt.
PayloadPart.CompletionState = PARTIAL -
Die nachfolgenden Continuation-Frames, bei denen das FIN-Bit frei ist, werden in „ PayloadParts mit
PayloadPart.CompletionState = PARTIAL“ übersetzt. -
Der letzte Continuation-Frame mit gesetztem FIN-Bit wird in „ PayloadPart mit“ übersetzt
PayloadPart.CompletionState = COMPLETE.
-
-
SageMaker AI kodiert oder dekodiert die von Modellcontainern empfangenen Bytes nicht, die Bytes werden unverändert an den Modellcontainer übergeben.
-
SageMaker KI kombiniert nicht mehrere vom Modellcontainer empfangene Datenrahmen zu einer Antwort. PayloadPart
-
SageMaker KI teilt einen vom Modellcontainer empfangenen Datenrahmen nicht in mehrere Antworten auf PayloadParts.
Beispiel: Streaming-Antwortfluss
Container sends: Frame 1: Text Data Frame with "Generating" (FIN=0) Frame 2: Continuation Frame with " response..." (FIN=1) Client receives: PayloadPart 1: {Bytes: "Generating", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: " response...", DataType: "UTF8", CompletionState: "COMPLETE"}
4.2. Kontrollrahmen
SageMaker AI reagiert auf die folgenden Control Frames aus dem Modellcontainer:
-
Beim Empfang eines Close Frame (RFC6455-Section-5.5.1
) vom Modellcontainer SageMaker verpackt AI den Statuscode (RFC6455-Section-7.4 ) und die Fehlermeldungen in ModelStreamError und streamt ihn zurück an den Endbenutzer. -
Beim Empfang eines Ping-Frames (RFC6455-Section-5.5.2
) vom Modellcontainer antwortet die SageMaker KI mit Pong Frame. -
Pong Frame (RFC6455-Section-5.5.3
): Wenn für 5 aufeinanderfolgende Pings kein Pong Frame empfangen wird, wird die Verbindung von KI geschlossen. SageMaker