Benutzerdefinierter Inferenzcode mit Hosting-Diensten - Amazon SageMaker KI

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-Diensten

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.

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

    SageMaker AI überschreibt CMD Standardanweisungen in einem Container, indem das serve Argument hinter dem Bildnamen angegeben wird. Das serve-Argument überschreibt Argumente, die Sie mit dem CMD-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 der ENTRYPOINT-Anleitung zu verwenden:

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

    Beispielsweise:

    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 es Signale wie SIGTERM und SIGKILL von den SageMaker API Vorgängen empfangen, was eine Voraussetzung ist.

     

    Wenn Sie beispielsweise den verwenden, um einen Endpunkt CreateEndpointAPIzu 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 den aufrufen UpdateEndpointWeightsAndCapacitiesAPI), führt SageMaker AI einen Befehl aus, um den Docker-Container auf den Instanzen 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 (indem Sie den aufrufen UpdateEndpointAPI), 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 Signal SIGTERM und 30 Sekunden später das Signal SIGKILL.

     

  • SageMaker AI verwendet die Containerdefinition, 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.Environment string-to-string Map fest.

    • Es legt den DNS Hostnamen mit dem ContainerDefinition.ContainerHostname fest.

       

  • Wenn Sie GPU Geräte für Modellinferenzen verwenden möchten (indem Sie in Ihrer CreateEndpointConfig Anfrage GPU basierte ML-Compute-Instanzen angeben), stellen Sie sicher, dass Ihre Container kompatibel sindnvidia-docker. Bündeln Sie keine NVIDIA Treiber mit dem Image. Weitere Informationen zu finden Sie unter nvidia-docker NVIDIA/nvidia-docker.

     

  • Sie können den tini Initialisierer nicht als Einstiegspunkt in SageMaker AI-Containern verwenden, da er durch die Argumente und verwirrt wird. train serve

Wie SageMaker KI Ihre Modellartefakte lädt

In Ihrer CreateModelAPIAnfrage 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 dieses into /opt/ml/model Tar-Dateiverzeichnis, 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 API AI-Referenz:

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 unterstützt werden. InvokeEndpoint SageMaker 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 /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 eine Verarbeitungszeit von 50 bis 60 Sekunden benötigt, sollte das SDK Socket-Timeout auf 70 Sekunden eingestellt werden.

Beispiel Aufruf-Funktionen

Die folgenden Beispiele zeigen, wie der Code in Ihrem Container Inferenzanfragen verarbeiten kann. Diese Beispiele behandeln Anfragen, die Client-Anwendungen mithilfe der InvokeEndpoint Aktion senden.

FastAPI

Fast API ist ein Web-Framework zum Bauen 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 invocations Funktion die Inferenzanforderung, die SageMaker KI an den /invocations Endpunkt 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 invoke Funktion die Inferenzanforderung, die SageMaker KI an den /invocations Endpunkt sendet.

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.

FastAPI

Fast API ist ein Web-Framework zum Bauen 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 invocations Funktion die Inferenzanforderung, die SageMaker KI an den /invocations Endpunkt 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 invocations Funktion die Inferenzanforderung, die SageMaker KI an den /invocations Endpunkt 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 KI startet in den folgenden Situationen neue Inferenzcontainer:

  • Beantworten von CreateEndpointUpdateEndpoint, und Anrufen UpdateEndpointWeightsAndCapacities API

  • Ausführen von Sicherheits-Patching

  • Ersetzen fehlerhafter Instances

Kurz nach dem Start des Containers beginnt SageMaker KI, regelmäßig GET Anfragen an den /ping Endpunkt zu senden.

Die einfachste Anforderung an den Container besteht darin, mit einem Statuscode HTTP 200 und einem leeren Text zu antworten. Dies zeigt SageMaker AI an, dass der Container bereit ist, Inferenzanfragen am /invocations Endpunkt anzunehmen.

Wenn der Container die Integritätsprüfungen nicht zu bestehen beginnt, indem er in den 8 Minuten nach dem Start durchweg mit 200 Sekunden antwortet, schlägt der Start der neuen Instance fehl. Dies führt CreateEndpoint zu einem Fehlschlag und der Endpunkt befindet sich in einem ausgefallenen Zustand. Das von angeforderte Update UpdateEndpoint ist nicht abgeschlossen, Sicherheitspatches wurden nicht angewendet und fehlerhafte Instanzen wurden 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.