Benutzerdefinierter Inferenzcode mit Hosting-Services - Amazon SageMaker AI

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.

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 run image serve

    SageMaker AI überschreibt die standardmäßigen CMD-Anweisungen in einem Container, indem er das Argument serve hinter dem Image-Namen angibt. Das serve-Argument überschreibt Argumente, die Sie mit dem CMD-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 der ENTRYPOINT-Anleitung zu verwenden:

    ENTRYPOINT ["executable", "param1", "param2"]

    Zum Beispiel:

    ENTRYPOINT ["python", "k_means_inference.py"]

    Das exec-Formular der ENTRYPOINT-Anweisung startet die ausführbare Datei direkt, nicht als untergeordnetes Element von /bin/sh. Dadurch kann er Signale wie SIGTERM und SIGKILL vom 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 das SIGTERM-Signal und dann dreißig Sekunden später das SIGKILL-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 Signal SIGTERM und 30 Sekunden später das Signal SIGKILL.

     

  • 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.Environment fest.

    • Es legt den DNS-Hostnamen mithilfe von ContainerDefinition.ContainerHostname fest.

       

  • 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 Container nvidia-docker-kompatibel sind. Bündeln Sie NVIDIA-Treiber nicht mit dem Abbild. Mehr Informationen über nvidia-docker finden Sie unter NVIDIA/nvidia-docker.

     

  • Sie können den tini-Initialisierer nicht als Eintrittspunkt in SageMaker-AI-Containern verwenden, da er durch die Argumente train und serve verwirrt 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 von InvokeEndpoint unterstü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 /invocations und /ping akzeptieren.

  • 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 /invocations antwortet. 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.

FastAPI

FastAPI ist ein Web-Framework zum Erstellen von APIs mit Python.

from fastapi import FastAPI, status, Request, Response . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # model() is a hypothetical function that gets the inference output: model_resp = await model(Request) response = Response( content=model_resp, status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

In diesem Beispiel verarbeitet die Funktion invocations die Inferenzanforderung, die SageMaker AI an den Endpunkt /invocations sendet.

Flask

Flask ist ein Framework für die Entwicklung von Webanwendungen mit Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invoke(request): # model() is a hypothetical function that gets the inference output: resp_body = model(request) return flask.Response(resp_body, mimetype='text/plain')

In diesem Beispiel verarbeitet die Funktion invoke die Inferenzanforderung, die SageMaker AI an den Endpunkt /invocations sendet.

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.

FastAPI

FastAPI ist ein Web-Framework zum Erstellen von APIs mit Python.

from starlette.responses import StreamingResponse from fastapi import FastAPI, status, Request . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # Streams inference response using HTTP chunked encoding async def generate(): # model() is a hypothetical function that gets the inference output: yield await model(Request) yield "\n" response = StreamingResponse( content=generate(), status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

In diesem Beispiel verarbeitet die Funktion invocations die Inferenzanforderung, die SageMaker AI an den Endpunkt /invocations sendet. Um die Antwort zu streamen, verwendet das Beispiel die Klasse StreamingResponse aus dem Starlette-Framework.

Flask

Flask ist ein Framework für die Entwicklung von Webanwendungen mit Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invocations(request): # Streams inference response using HTTP chunked encoding def generate(): # model() is a hypothetical function that gets the inference output: yield model(request) yield "\n" return flask.Response( flask.stream_with_context(generate()), mimetype='text/plain') . . .

In diesem Beispiel verarbeitet die Funktion invocations die Inferenzanforderung, die SageMaker AI an den Endpunkt /invocations sendet. Um die Antwort zu streamen, verwendet das Beispiel die Funktion flask.stream_with_context aus dem Flask-Framework.

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, UpdateEndpoint und UpdateEndpointWeightsAndCapacities

  • 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.