Benutzerdefinierte Vorhersageroutinen

Mit benutzerdefinierten Vorhersageroutinen (CPR) können Sie ganz einfach benutzerdefinierte Container mit Vor-/Nachverarbeitungscode erstellen, ohne sich mit den Details der Einrichtung eines HTTP-Servers oder der von Grund auf neuen Erstellung eines Containers befassen zu müssen. Mithilfe der Vorverarbeitung können Sie die Eingaben normalisieren/transformieren oder Aufrufe an externe Dienste senden, um zusätzliche Daten abzurufen. Mit der Nachbearbeitung können Sie die Modellvorhersage formatieren oder Geschäftslogik ausführen.

Im folgenden Diagramm wird der Nutzerworkflow sowohl mit als auch ohne benutzerdefinierte Vorhersageroutinen dargestellt.

Die Hauptunterschiede sind:

  • Sie müssen keinen Modellserver und kein Dockerfile schreiben. Der Modellserver, also der HTTP-Server, der das Modell hostet, wird für Sie bereitgestellt.

  • Sie können das Modell lokal bereitstellen und lokal Fehler beheben, um den Iterationszyklus während der Entwicklung zu beschleunigen.

Benutzerdefinierten Container erstellen und bereitstellen

In diesem Abschnitt wird beschrieben, wie Sie mit CPR einen benutzerdefinierten Container mit Vor-/Nachverarbeitungslogik erstellen und sowohl auf einem lokalen als auch auf einem Online-Endpunkt bereitstellen.

Einrichtung

In Ihrer Umgebung müssen das Vertex AI SDK und Docker installiert sein.

Benutzerdefinierten Predictor schreiben

Predictor-Schnittstelle implementieren.

class Predictor(ABC):
    """Interface of the Predictor class for Custom Prediction Routines.
    The Predictor is responsible for the ML logic for processing a prediction request.
    Specifically, the Predictor must define:
    (1) How to load all model artifacts used during prediction into memory.
    (2) The logic that should be executed at predict time.
    When using the default PredictionHandler, the Predictor will be invoked as follows:
      predictor.postprocess(predictor.predict(predictor.preprocess(prediction_input)))
    """

    @abstractmethod
    def load(self, artifacts_uri: str) -> None:
        """Loads the model artifact.
        Args:
            artifacts_uri (str):
                Required. The value of the environment variable AIP_STORAGE_URI.
        """
        pass

    def preprocess(self, prediction_input: Any) -> Any:
        """Preprocesses the prediction input before doing the prediction.
        Args:
            prediction_input (Any):
                Required. The prediction input that needs to be preprocessed.
        Returns:
            The preprocessed prediction input.
        """
        return prediction_input

    @abstractmethod
    def predict(self, instances: Any) -> Any:
        """Performs prediction.
        Args:
            instances (Any):
                Required. The instance(s) used for performing prediction.
        Returns:
            Prediction results.
        """
        pass

    def postprocess(self, prediction_results: Any) -> Any:
        """Postprocesses the prediction results.
        Args:
            prediction_results (Any):
                Required. The prediction results.
        Returns:
            The postprocessed prediction results.
        """
        return prediction_results

Weitere Informationen finden Sie zum Beispiel in der Predictor-Implementierung von Sklearn.

Benutzerdefinierten Handler schreiben (optional)

Benutzerdefinierte Handler haben Zugriff auf das Rohanfrageobjekt und sind daher in seltenen Fällen nützlich, in denen Sie die Webserverlogik anpassen müssen, z. B. für die Unterstützung zusätzlicher Anfrage-/Antwortheader oder für die Deserialisierung von nicht JSON-formatierten Vorhersageanfragen.

Hier ist ein Beispielnotebook, das sowohl Predictor als auch Handler implementiert.

Obwohl dies nicht erforderlich ist, empfehlen wir für eine bessere Codeorganisation und -wiederverwendbarkeit, die Webserverlogik im Handler und die ML-Logik im Predictor zu implementieren, wie im Standard-Handler gezeigt.

Benutzerdefinierten Container erstellen

Legen Sie Ihren benutzerdefinierten Code und eine zusätzliche requirements.txt-Datei fest, wenn Sie Pakete in Ihren Images in einem Verzeichnis installieren müssen.

Verwenden Sie das Vertex SDK, um benutzerdefinierte Container wie unten gezeigt zu erstellen:

from google.cloud.aiplatform.prediction import LocalModel

# {import your predictor and handler}

local_model = LocalModel.build_cpr_model(
    {PATH_TO_THE_SOURCE_DIR},
    f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
    predictor={PREDICTOR_CLASS},
    handler={HANDLER_CLASS},
    requirements_path={PATH_TO_REQUIREMENTS_TXT},
)

In der Spezifikation des Containers finden Sie nützliche Informationen wie den Image-URI und Umgebungsvariablen.

local_model.get_serving_container_spec()

Container lokal ausführen (optional)

Dieser Schritt ist nur erforderlich, wenn Sie den Container lokal ausführen und testen möchten. Dies ist für eine schnellere Iteration hilfreich. Im folgenden Beispiel wird die Bereitstellung auf einem lokalen Endpunkt ausgeführt und eine Vorhersageanfrage gesendet (Format für Anfragetext).

with local_model.deploy_to_local_endpoint(
    artifact_uri={GCS_PATH_TO_MODEL_ARTIFACTS},
    credential_path={PATH_TO_CREDENTIALS},
) as local_endpoint:
    health_check_response = local_endpoint.run_health_check()
    predict_response = local_endpoint.predict(
        request_file={PATH_TO_INPUT_FILE},
        headers={ANY_NEEDED_HEADERS},
    )

Geben Sie die Systemdiagnose- und Vorhersageantwort aus.

print(health_check_response, health_check_response.content)
print(predict_response, predict_response.content)

Geben Sie alle Containerlogs aus.

local_endpoint.print_container_logs(show_all=True)

In Vertex AI Model Registry hochladen

Ihr Modell muss auf Ihre Modellartefakte zugreifen können (die Dateien aus dem Training). Stellen Sie daher sicher, dass Sie sie in Google Cloud Storage hochgeladen haben.

Laden Sie das Image per Push in die Artifact Registry:

local_model.push_image()

Laden Sie es dann in Model Registry hoch.

from google.cloud import aiplatform

model = aiplatform.Model.upload(
    local_model=local_model,
    display_name={MODEL_DISPLAY_NAME},
    artifact_uri={GCS_PATH_TO_MODEL_ARTIFACTS},
)

Sobald Ihr Modell in Vertex AI Model Registry hochgeladen wurde, kann es zum Abrufen von Batchvorhersagen verwendet oder auf einem Vertex AI-Endpunkt bereitgestellt werden, um Onlinevorhersagen zu erhalten.

Auf Vertex AI-Endpunkt bereitstellen

endpoint = model.deploy(machine_type="n1-standard-4")

Nach der Bereitstellung können Sie Onlinevorhersagen abrufen.

Notebook-Beispiele

Die Beispiele zeigen die verschiedenen Möglichkeiten, wie Sie ein Modell mit benutzerdefinierter Vor-/Nachverarbeitung in Vertex AI Prediction bereitstellen können.