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
ContainerDefinition.Environmentstring-to-string Map fest. -
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
tiniInitialisierer nicht als Einstiegspunkt in SageMaker KI-Container verwenden, da er durch die Argumentetrainundserveverwirrt wird.
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 opt/ml/model Verzeichnis/, 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 SageMaker AI-Endpunkt. 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 WebSockets standardmäßig Verbindungen auf Port 8080 bis/invocations-bidirectional-stream .
-
einen Webserver haben, der auf Port 8080 wartet und POST-Anfragen an die /ping-Endpunkte akzeptieren muss.
-
Zusätzlich zu den Integritätsprüfungen des Containers über HTTP muss der Container mit Pong Frame per (RFC6455
) antworten, damit der 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 InvokeEndpoint Aktion senden.
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 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. Das Anforderungstimeout bei /ping-Versuchen beträgt 2 Sekunden.
Darüber hinaus muss ein Container, der bidirektionale Streaming-Anfragen verarbeiten kann, mit einem Pong-Frame (pro WebSocket Protokoll RFC6455
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 X-Amzn-SageMaker-Model Aufrufen der API der Header -Invocation-Path ü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 Header -Query-String übergeben. X-Amzn-SageMaker-Model 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 als WebSocket Datenrahmen PayloadParts an den Modellcontainer (RFC6455-Abschnitt-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— Abschnitt-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-Sektion-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: 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-Abschnitt-5.4
: Fragmentierung definiert: -
Der anfängliche Datenrahmen mit FIN-Bit clear wird in ein With-Zeichen übersetzt. PayloadPart
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 verpackt SageMaker AI den Statuscode (RFC6455-Section-7.4) und die Fehlermeldungen in und streamt ihn zurück an den ModelStreamError Endbenutzer. -
Beim Empfang eines Ping-Frames (RFC6455-Section-5.5.2) vom Modellcontainer antwortet AI
mit Pong Frame. SageMaker -
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