1. Einführung
In diesem Lab lernen Sie, wie Sie mit benutzerdefinierten Vorhersageroutinen in Vertex AI benutzerdefinierte Vorverarbeitungs- und Nachbearbeitungslogik schreiben. In diesem Beispiel wird zwar Scikit-learn verwendet, benutzerdefinierte Vorhersageroutinen können aber auch mit anderen Python-ML-Frameworks wie XGBoost, PyTorch und TensorFlow funktionieren.
Aufgaben in diesem Lab
- Benutzerdefinierte Vorhersagelogik mit benutzerdefinierten Vorhersageroutinen schreiben
- Benutzerdefinierten Bereitstellungscontainer und Modell lokal testen
- Benutzerdefinierten Bereitstellungscontainer in Vertex AI Predictions testen
2. Einführung in Vertex AI
In diesem Lab wird das neueste KI-Produktangebot von Google Cloud verwendet. Vertex AI bindet die ML-Angebote in Google Cloud in eine nahtlose Entwicklungsumgebung ein. Zuvor waren mit AutoML trainierte und benutzerdefinierte Modelle über separate Dienste zugänglich. Das neue Angebot vereint beides in einer einzigen API sowie weitere neue Produkte. Sie können auch vorhandene Projekte zu Vertex AI migrieren.
Vertex AI enthält viele verschiedene Produkte zur Unterstützung von End-to-End-ML-Workflows. In diesem Lab liegt der Fokus auf Predictions und Workbench.
3. Anwendungsfall – Übersicht
In diesem Lab erstellen Sie ein zufälliges Regressionsmodell für den Wald, um den Preis eines Diamanten anhand von Attributen wie Schliff, Klarheit und Größe vorherzusagen.
Sie schreiben eine benutzerdefinierte Vorverarbeitungslogik, um zu überprüfen, ob die Daten zum Zeitpunkt der Bereitstellung in dem Format vorliegen, das vom Modell erwartet wird. Außerdem schreiben Sie eine benutzerdefinierte Nachverarbeitungslogik, um die Vorhersagen zu runden und in Strings zu konvertieren. Zum Schreiben dieser Logik verwenden Sie benutzerdefinierte Vorhersageroutinen.
Einführung in benutzerdefinierte Vorhersageroutinen
Die vordefinierten Vertex AI-Container verarbeiten Vorhersageanfragen, indem sie die Vorhersagevorgänge des Frameworks für maschinelles Lernen ausführen. Wenn Sie vor benutzerdefinierten Vorhersageroutinen die Eingabe vorverarbeiten oder die Vorhersage des Modells nachbearbeiten wollten, bevor das Ergebnis zurückgegeben wird, mussten Sie einen benutzerdefinierten Container erstellen.
Zum Erstellen eines benutzerdefinierten Bereitstellungscontainers muss ein HTTP-Server geschrieben werden, der das trainierte Modell umschließt, HTTP-Anfragen in Modelleingaben übersetzt und Modellausgaben in Antworten umwandelt.
Mit benutzerdefinierten Vorhersageroutinen stellt Vertex AI Ihnen die bereitstellungsbezogenen Komponenten bereit, damit Sie sich auf Ihre Modell- und Datentransformationen konzentrieren können.
Inhalt
Sie richten ein VPC-Netzwerk mit dem Namen Ziell-vpc ein, das aus einem Workbench-Subnetz besteht, das zum Bereitstellen eines vom Nutzer verwalteten Notebooks und zum Zugriff auf den in us-central1 bereitgestellten Onlinevorhersage- und Modellendpunkt (siehe Abbildung 1 unten) verwendet wird.
Figure1
4. Anleitungs-APIs aktivieren
Schritt 1: Compute Engine API aktivieren
Gehen Sie zu Compute Engine und wählen Sie „Aktivieren“ aus, falls dies noch nicht geschehen ist. Sie benötigen dies zum Erstellen Ihrer Notebookinstanz.
Schritt 2: Artifact Registry API aktivieren
Gehen Sie zu Artifact Registry und wählen Sie „Aktivieren“ aus, falls noch nicht geschehen. Damit erstellen Sie einen benutzerdefinierten Bereitstellungscontainer.
Schritt 3: Vertex AI API aktivieren
Rufen Sie in der Cloud Console den Bereich Vertex AI auf und klicken Sie auf „Vertex AI API aktivieren“.
Schritt 4: Vertex AI Workbench-Instanz erstellen
Aktivieren Sie die Notebooks API, falls noch nicht geschehen.
5. targetl-vpc erstellen
In dieser Anleitung wird mithilfe von $variables die Implementierung der gcloud-Konfiguration in Cloud Shell unterstützt.
Führen Sie in Cloud Shell die folgenden Schritte aus:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
targetl-vpc erstellen
Führen Sie in Cloud Shell die folgenden Schritte aus:
gcloud compute networks create aiml-vpc --project=$projectid --subnet-mode=custom
Nutzerverwaltetes Notebook-Subnetz erstellen
Erstellen Sie in Cloud Shell das Workbench-Subnetz.
gcloud compute networks subnets create workbench-subnet --project=$projectid --range=172.16.10.0/28 --network=aiml-vpc --region=us-central1 --enable-private-ip-google-access
Cloud Router und NAT-Konfiguration
In der Anleitung wird Cloud NAT zum Herunterladen von Softwarepaketen verwendet, da das vom Nutzer verwaltete Notebook keine externe IP-Adresse hat. Cloud NAT bietet NAT-Funktionen für ausgehenden Traffic, was bedeutet, dass Internethosts keine Kommunikation mit einem nutzerverwalteten Notebook initiieren dürfen, was die Sicherheit erhöht.
Erstellen Sie in Cloud Shell den regionalen Cloud Router „us-central1“.
gcloud compute routers create cloud-router-us-central1-aiml-nat --network aiml-vpc --region us-central1
Erstellen Sie in Cloud Shell das regionale Cloud-nat-Gateway „us-central1“.
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1-aiml-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
6. Nutzerverwaltetes Notebook erstellen
Nutzerverwaltetes Dienstkonto erstellen (Notebook)
Im folgenden Abschnitt erstellen Sie ein vom Nutzer verwaltetes Dienstkonto, das mit dem in der Anleitung verwendeten Vertex Workbench (Notebook) verknüpft wird.
In der Anleitung werden die folgenden Regeln auf das Dienstkonto angewendet:
Erstellen Sie das Dienstkonto in Cloud Shell.
gcloud iam service-accounts create user-managed-notebook-sa \
--display-name="user-managed-notebook-sa"
Aktualisieren Sie in Cloud Shell das Dienstkonto mit der Rolle „Storage Admin“.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
Aktualisieren Sie in Cloud Shell das Dienstkonto mit der Rolle „Vertex AI User“.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
Aktualisieren Sie in Cloud Shell das Dienstkonto mit der Rolle „Artifact Registry-Administrator“.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
Listen Sie in Cloud Shell das Dienstkonto auf und notieren Sie sich die E-Mail-Adresse, die beim Erstellen des nutzerverwalteten Notebooks verwendet wird.
gcloud iam service-accounts list
Nutzerverwaltetes Notebook erstellen
Erstellen Sie im folgenden Abschnitt ein nutzerverwaltetes Notebook, das das zuvor erstellte Dienstkonto „user-managed-notebook-sa“ enthält.
Erstellen Sie in Cloud Shell die Instanz des privaten Clients.
gcloud notebooks instances create workbench-tutorial \
--vm-image-project=deeplearning-platform-release \
--vm-image-family=common-cpu-notebooks \
--machine-type=n1-standard-4 \
--location=us-central1-a \
--shielded-secure-boot \
--subnet-region=us-central1 \
--subnet=workbench-subnet \
--no-public-ip --service-account=user-managed-notebook-sa@$projectid.iam.gserviceaccount.com
7. Trainingscode schreiben
Schritt 1: Cloud Storage-Bucket erstellen
Sie speichern das Modell und die Vorverarbeitungsartefakte in einem Cloud Storage-Bucket. Wenn das gewünschte Projekt bereits einen Bucket enthält, können Sie diesen Schritt überspringen.
Öffnen Sie im Launcher eine neue Terminalsitzung.
Führen Sie in Ihrem Terminal den folgenden Befehl aus, um eine Umgebungsvariable für Ihr Projekt zu definieren. Ersetzen Sie dabei „your-cloud-project“ durch die ID Ihres Projekts:
PROJECT_ID='your-cloud-project'
Führen Sie als Nächstes den folgenden Befehl in Ihrem Terminal aus, um einen neuen Bucket in Ihrem Projekt zu erstellen.
BUCKET="gs://${PROJECT_ID}-cpr-bucket"
gsutil mb -l us-central1 $BUCKET
Schritt 2: Modell trainieren
Erstellen Sie im Terminal ein neues Verzeichnis mit dem Namen cpr-codelab und fügen Sie es mit cd ein.
mkdir cpr-codelab
cd cpr-codelab
Gehen Sie im Dateibrowser zum neuen Verzeichnis „cpr-codelab“ und erstellen Sie mit dem Launcher ein neues Python 3-Notebook namens „task.ipynb“.
Das cpr-codelab-Verzeichnis sollte jetzt so aussehen:
+ cpr-codelab/
+ task.ipynb
Fügen Sie den folgenden Code in das Notebook ein.
Schreiben Sie zuerst eine „requirements.txt“-Datei.
%%writefile requirements.txt
fastapi
uvicorn==0.17.6
joblib~=1.1.1
numpy>=1.17.3, <1.24.0
scikit-learn~=1.0.0
pandas
google-cloud-storage>=2.2.1,<3.0.0dev
google-cloud-aiplatform[prediction]>=1.18.2
In dem von Ihnen bereitgestellten Modell sind andere Abhängigkeiten vorinstalliert als in Ihrer Notebookumgebung. Aus diesem Grund sollten Sie alle Abhängigkeiten für das Modell in „requirements.txt“ auflisten und dann mit PIP genau dieselben Abhängigkeiten im Notebook installieren. Später testen Sie das Modell lokal, bevor Sie es in Vertex AI bereitstellen, um zu prüfen, ob die Umgebungen übereinstimmen.
Pip installiert die Abhängigkeiten im Notebook.
!pip install -U --user -r requirements.txt
Beachten Sie, dass Sie den Kernel nach Abschluss der pip-Installation neu starten müssen.
Erstellen Sie als Nächstes die Verzeichnisse, in denen Sie das Modell und die Vorverarbeitungsartefakte speichern.
USER_SRC_DIR = "src_dir"
!mkdir $USER_SRC_DIR
!mkdir model_artifacts
# copy the requirements to the source dir
!cp requirements.txt $USER_SRC_DIR/requirements.txt
Das cpr-codelab-Verzeichnis sollte jetzt so aussehen:
+ cpr-codelab/
+ model_artifacts/
+ scr_dir/
+ requirements.txt
+ task.ipynb
+ requirements.txt
Nachdem Sie die Verzeichnisstruktur eingerichtet haben, können Sie nun ein Modell trainieren.
Importieren Sie zuerst die Bibliotheken.
import seaborn as sns
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer
import joblib
import logging
# set logging to see the docker container logs
logging.basicConfig(level=logging.INFO)
Definieren Sie dann die folgenden Variablen. Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID und BUCKET_NAME durch den Bucket, den Sie im vorherigen Schritt erstellt haben.
REGION = "us-central1"
MODEL_ARTIFACT_DIR = "sklearn-model-artifacts"
REPOSITORY = "diamonds"
IMAGE = "sklearn-image"
MODEL_DISPLAY_NAME = "diamonds-cpr"
# Replace with your project
PROJECT_ID = "{PROJECT_ID}"
# Replace with your bucket
BUCKET_NAME = "gs://{BUCKET_NAME}"
Laden Sie die Daten aus der Seaborn-Bibliothek und erstellen Sie dann zwei Dataframes, einen mit den Features und einen mit dem Label.
data = sns.load_dataset('diamonds', cache=True, data_home=None)
label = 'price'
y_train = data['price']
x_train = data.drop(columns=['price'])
Sehen wir uns die Trainingsdaten an. Wie Sie sehen, steht jede Zeile für eine Raute.
x_train.head()
Und die Labels, also die entsprechenden Preise.
y_train.head()
Definieren Sie nun eine sklearn-Spaltentransformation, um die kategorialen Merkmale mit einer Hot-Codierung zu versehen, und skalieren Sie die numerischen Merkmale.
column_transform = make_column_transformer(
(preprocessing.OneHotEncoder(sparse=False), [1,2,3]),
(preprocessing.StandardScaler(), [0,4,5,6,7,8]))
Random Forest-Modell definieren
regr = RandomForestRegressor(max_depth=10, random_state=0)
Als Nächstes erstellen Sie eine sklearn-Pipeline. Das bedeutet, dass die in diese Pipeline eingespeisten Daten zuerst codiert/skaliert und dann an das Modell übergeben werden.
my_pipeline = make_pipeline(column_transform, regr)
Pipeline an die Trainingsdaten anpassen
my_pipeline.fit(x_train, y_train)
Lassen Sie uns das Modell ausprobieren, um sicherzustellen, dass es wie erwartet funktioniert. Rufen Sie die Vorhersagemethode für das Modell auf und übergeben Sie dabei ein Testbeispiel.
my_pipeline.predict([[0.23, 'Ideal', 'E', 'SI2', 61.5, 55.0, 3.95, 3.98, 2.43]])
Jetzt können wir die Pipeline im Verzeichnis „model_artifacts“ speichern und in den Cloud Storage-Bucket kopieren
joblib.dump(my_pipeline, 'model_artifacts/model.joblib')
!gsutil cp model_artifacts/model.joblib {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/
Schritt 3: Vorverarbeitungsartefakt speichern
Als Nächstes erstellen Sie ein Vorverarbeitungsartefakt. Dieses Artefakt wird beim Start des Modellservers in den benutzerdefinierten Container geladen. Ihr Vorverarbeitungsartefakt kann in fast jeder Form vorliegen (z. B. eine Pickle-Datei). In diesem Fall schreiben Sie jedoch ein Wörterbuch in eine JSON-Datei.
clarity_dict={"Flawless": "FL",
"Internally Flawless": "IF",
"Very Very Slightly Included": "VVS1",
"Very Slightly Included": "VS2",
"Slightly Included": "S12",
"Included": "I3"}
Die Funktion zur Verdeutlichung in unseren Trainingsdaten war immer in der Abkürzung (d. h. „FL“ statt „Flawless“). Bei der Auslieferung möchten wir überprüfen, ob die Daten für diese Funktion ebenfalls abgekürzt sind. Das liegt daran, dass unser Modell weiß, aber nicht „Flawless“. Diese benutzerdefinierte Vorverarbeitungslogik schreiben Sie später. Speichern Sie diese Suchtabelle vorerst in einer JSON-Datei und schreiben Sie sie dann in den Cloud Storage-Bucket.
import json
with open("model_artifacts/preprocessor.json", "w") as f:
json.dump(clarity_dict, f)
!gsutil cp model_artifacts/preprocessor.json {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/
Ihr lokales cpr-codelab-Verzeichnis sollte jetzt so aussehen:
+ cpr-codelab/
+ model_artifacts/
+ model.joblib
+ preprocessor.json
+ scr_dir/
+ requirements.txt
+ task.ipynb
+ requirements.txt
8. Benutzerdefinierten Bereitstellungscontainer mit dem Server für das CPR-Modell erstellen
Nachdem das Modell trainiert und das Vorverarbeitungsartefakt gespeichert wurde, können Sie den benutzerdefinierten Bereitstellungscontainer erstellen. Zum Erstellen eines Bereitstellungscontainers muss in der Regel der Modellservercode geschrieben werden. Mit benutzerdefinierten Vorhersageroutinen generiert Vertex AI Predictions jedoch einen Modellserver und erstellt ein benutzerdefiniertes Container-Image für Sie.
Ein benutzerdefinierter Bereitstellungscontainer enthält die folgenden drei Code-Snippets:
- Modellserver (wird automatisch vom SDK generiert und in „scr_dir/“ gespeichert)
- HTTP-Server, auf dem das Modell gehostet wird
- Verantwortlich für das Einrichten von Routen/Ports usw.
- Verantwortlich für Webserveraspekte bei der Verarbeitung einer Anfrage, z. B. die Deserialisierung des Anfragetexts, die Serialisierung der Antwort, das Festlegen von Antwortheadern usw.
- In diesem Beispiel verwenden Sie den im SDK bereitgestellten Standard-Handler google.cloud.aiplatform.forecast.handler.PredictionHandler.
- Verantwortlich für die ML-Logik für die Verarbeitung einer Vorhersageanfrage.
Jede dieser Komponenten kann an die Anforderungen Ihres Anwendungsfalls angepasst werden. In diesem Beispiel implementieren Sie nur den Predictor.
Der Predictor ist für die ML-Logik für die Verarbeitung einer Vorhersageanfrage verantwortlich, z. B. für die benutzerdefinierte Vorverarbeitung und Nachbearbeitung. Zum Schreiben benutzerdefinierter Vorhersagelogik erstellen Sie eine Unterklasse der Vertex AI Predictor-Schnittstelle.
Diese Version benutzerdefinierter Vorhersageroutinen enthält wiederverwendbare XGBoost- und Sklearn-Prädiktoren. Wenn Sie jedoch ein anderes Framework verwenden müssen, können Sie Ihr eigenes erstellen, indem Sie den Basis-Predictor ableiten.
Unten sehen Sie ein Beispiel für den Sklearn-Predictor. Diesen Code müssen Sie nicht mehr schreiben, um diesen benutzerdefinierten Modellserver zu erstellen.
Fügen Sie den folgenden Code in Ihr Notebook ein, um den SklearnPredictor als abgeleitete Klasse zu definieren und in eine Python-Datei im src_dir/ zu schreiben. Beachten Sie, dass wir in diesem Beispiel nur die Methoden zum Laden, Vorverarbeiten und Nachbereiten anpassen, nicht aber die Vorhersagemethode.
%%writefile $USER_SRC_DIR/predictor.py
import joblib
import numpy as np
import json
from google.cloud import storage
from google.cloud.aiplatform.prediction.sklearn.predictor import SklearnPredictor
class CprPredictor(SklearnPredictor):
def __init__(self):
return
def load(self, artifacts_uri: str) -> None:
"""Loads the sklearn pipeline and preprocessing artifact."""
super().load(artifacts_uri)
# open preprocessing artifact
with open("preprocessor.json", "rb") as f:
self._preprocessor = json.load(f)
def preprocess(self, prediction_input: np.ndarray) -> np.ndarray:
"""Performs preprocessing by checking if clarity feature is in abbreviated form."""
inputs = super().preprocess(prediction_input)
for sample in inputs:
if sample[3] not in self._preprocessor.values():
sample[3] = self._preprocessor[sample[3]]
return inputs
def postprocess(self, prediction_results: np.ndarray) -> dict:
"""Performs postprocessing by rounding predictions and converting to str."""
return {"predictions": [f"${value}" for value in np.round(prediction_results)]}
Sehen wir uns diese Methoden einmal genauer an.
- Die Lademethode lädt in das Vorverarbeitungsartefakt, bei dem es sich in diesem Fall um ein Wörterbuch handelt, das die Diamant-Klarheitswerte ihren Abkürzungen zuordnet.
- Bei der Vorverarbeitungsmethode wird dieses Artefakt verwendet, um sicherzustellen, dass das Klarheitsfeature zum Zeitpunkt der Bereitstellung in seinem abgekürzten Format vorliegt. Andernfalls wird der vollständige String in die Abkürzung konvertiert.
- Die Postprocess-Methode gibt den vorhergesagten Wert als Zeichenfolge mit einem $-Zeichen zurück und rundet den Wert.
Verwenden Sie als Nächstes das Vertex AI Python SDK, um das Image zu erstellen. Mit benutzerdefinierten Vorhersageroutinen wird das Dockerfile generiert und ein Image wird für Sie erstellt.
from google.cloud import aiplatform
aiplatform.init(project=PROJECT_ID, location=REGION)
import os
from google.cloud.aiplatform.prediction import LocalModel
from src_dir.predictor import CprPredictor # Should be path of variable $USER_SRC_DIR
local_model = LocalModel.build_cpr_model(
USER_SRC_DIR,
f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
predictor=CprPredictor,
requirements_path=os.path.join(USER_SRC_DIR, "requirements.txt"),
)
Schreiben Sie eine Testdatei mit zwei Stichproben für die Vorhersage. Eine der Instanzen hat den abgekürzten Klarnamen, aber die andere muss zuerst konvertiert werden.
import json
sample = {"instances": [
[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
[0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}
with open('instances.json', 'w') as fp:
json.dump(sample, fp)
Testen Sie den Container lokal, indem Sie ein lokales Modell bereitstellen.
with local_model.deploy_to_local_endpoint(
artifact_uri = 'model_artifacts/', # local path to artifacts
) as local_endpoint:
predict_response = local_endpoint.predict(
request_file='instances.json',
headers={"Content-Type": "application/json"},
)
health_check_response = local_endpoint.run_health_check()
Sie können sich die Vorhersageergebnisse so ansehen:
predict_response.content
9. Modell in Vertex AI bereitstellen
Nachdem Sie den Container nun lokal getestet haben, können Sie das Image per Push an Artifact Registry übertragen und das Modell in Vertex AI Model Registry hochladen.
Konfigurieren Sie zuerst Docker für den Zugriff auf Artifact Registry.
!gcloud artifacts repositories create {REPOSITORY} --repository-format=docker \
--location=us-central1 --description="Docker repository"
!gcloud auth configure-docker {REGION}-docker.pkg.dev --quiet
Übertragen Sie dann das Bild.
local_model.push_image()
Laden Sie das Modell hoch.
model = aiplatform.Model.upload(local_model = local_model,
display_name=MODEL_DISPLAY_NAME,
artifact_uri=f"{BUCKET_NAME}/{MODEL_ARTIFACT_DIR}",)
Wenn das Modell hochgeladen wurde, sollten Sie es in der Konsole sehen:
Stellen Sie als Nächstes das Modell bereit, damit Sie es für Onlinevorhersagen verwenden können. Benutzerdefinierte Vorhersageroutinen funktionieren auch mit Batchvorhersagen. Wenn Ihr Anwendungsfall also keine Onlinevorhersagen erfordert, müssen Sie das Modell nicht bereitstellen.
Übertragen Sie dann das Bild.
endpoint = model.deploy(machine_type="n1-standard-2")
Testen Sie zuletzt das bereitgestellte Modell, indem Sie eine Vorhersage abrufen.
endpoint.predict(instances=[[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43]])
🎉 Glückwunsch! 🎉
Sie haben gelernt, wie Sie mit Vertex AI Folgendes tun können:
- Benutzerdefinierte Vorverarbeitungs- und Nachbearbeitungslogik mit benutzerdefinierten Vorhersageroutinen schreiben
Cosmopup findet Codelabs super!!
Was liegt als Nächstes an?
Weitere Informationen und Videos
- Was ist Vertex AI?
- Erste Schritte mit Vertex AI
- Welche KI-/ML-Lösung in Vertex AI ist die richtige für mich?
- Mit Vertex AI ein Frage-Antwort-System erstellen