Verwenden eigenen Inferenzcodes mit Hosting-Services - Amazon SageMaker

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.

Verwenden eigenen Inferenzcodes mit Hosting-Services

In diesem Abschnitt wird erklärt, wie Amazon mit einem Docker-Container SageMaker 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 läuft Ihr Inferenz-Image

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:

  • SageMaker Führt den Container für Modellinferenz wie folgt aus:

    docker run image serve

    SageMaker ü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 erwartet, dass alle Container mit Root-Benutzern ausgeführt werden. Erstellen Sie Ihren Container so, dass er nur Root-Benutzer verwendet. Wenn Ihr Container SageMaker ausgeführt wird, 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. Dies ermöglicht es ihm, Signale wie SIGTERM und SIGKILL von den SageMaker API-Operationen zu empfangen, was eine Voraussetzung ist.

     

    Wenn Sie beispielsweise die CreateEndpointAPI verwenden, um einen Endpunkt zu erstellen, stellt sie SageMaker die Anzahl der ML-Compute-Instanzen bereit, die für die Endpunktkonfiguration erforderlich sind, die Sie in der Anfrage angeben. SageMaker führt den Docker-Container auf diesen Instanzen aus.

     

    Wenn Sie die Anzahl der Instanzen reduzieren, die den Endpunkt unterstützen (durch Aufrufen der UpdateEndpointWeightsAndCapacitiesAPI), SageMaker wird ein Befehl ausgeführt, um den Docker-Container auf den Instanzen zu beenden, 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 die UpdateEndpointAPI aufrufen), SageMaker startet er 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 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 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 Einstiegspunkt in SageMaker Container verwenden, da er durch die Argumente train und serve verwirrt wird.

Wie werden Ihre SageMaker Modellartefakte geladen

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 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 SageMaker wird die Datei nicht heruntergeladen.

Wenn Sie Ihr Modell trainiert haben SageMaker, werden die Modellartefakte als eine einzige komprimierte TAR-Datei in Amazon S3 gespeichert. Wenn Sie Ihr Modell im Freien trainiert haben SageMaker, müssen Sie diese einzelne komprimierte TAR-Datei erstellen und an einem S3-Speicherort speichern. SageMaker 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 Endpunkt. SageMaker SageMaker übergibt die Anfrage an den Container 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 SageMaker Amazon-API-Referenz:

Anforderungen für Inferenzcontainer

Um auf Inferenzanfragen zu antworten, muss Ihr Container die folgenden Anforderungen erfüllen:

  • SageMaker entfernt alle POST Header außer denen, die von unterstützt werden. InvokeEndpoint SageMaker könnte zusätzliche Header hinzufügen. 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 Anfragen behandelt, die Client-Anwendungen mithilfe der InvokeEndpoint Aktion 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 invocations Funktion die Inferenzanforderung, die SageMaker an den /invocations Endpunkt gesendet wird.

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 an den SageMaker Endpunkt gesendet wird/invocations.

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 verarbeitet, 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

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 invocations Funktion die Inferenzanforderung, die SageMaker an den /invocations Endpunkt gesendet wird. 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 an den SageMaker Endpunkt gesendet wird/invocations. 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 startet in den folgenden Situationen neue Inferenzcontainer:

  • Reagieren auf die API-Aufrufe CreateEndpoint, UpdateEndpoint und UpdateEndpointWeightsAndCapacities

  • Ausführen von Sicherheits-Patching

  • Ersetzen fehlerhafter Instances

SageMaker Beginnt kurz nach dem Start des Containers, 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 bedeutet, SageMaker 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.