1. Übersicht
In diesem Lab verwenden Sie Vertex AI, um Vorhersagen aus einem vortrainierten Bildklassifizierungsmodell abzurufen.
Lerninhalte
Die folgenden Themen werden behandelt:
- TensorFlow-Modell in die Vertex AI Model Registry importieren
- Onlinevorhersagen abrufen
- TensorFlow-Bereitstellungsfunktion aktualisieren
Die Gesamtkosten für die Ausführung dieses Labs in Google Cloud betragen etwa 1$.
2. Einführung in Vertex AI
In diesem Lab wird das neueste KI-Produkt von Google Cloud verwendet. Vertex AI vereint die ML-Angebote von Google Cloud in einer nahtlosen Entwicklungsumgebung. Bisher musste auf mit AutoML trainierte und benutzerdefinierte Modelle über verschiedene Dienste zugegriffen werden. Das neue Angebot kombiniert diese und weitere, neue Produkte zu einer einzigen API. Sie können auch vorhandene Projekte zu Vertex AI migrieren.
Vertex AI umfasst viele verschiedene Produkte zur Unterstützung von End-to-End-ML-Workflows. In diesem Lab konzentrieren wir uns auf die unten hervorgehobenen Produkte: Vorhersagen und Workbench.

3. Übersicht über Anwendungsfälle
In diesem Lab erfahren Sie, wie Sie ein vortrainiertes Modell aus TensorFlow Hub übernehmen und in Vertex AI bereitstellen. TensorFlow Hub ist ein Repository mit trainierten Modellen für eine Vielzahl von Problembereichen, z. B. Einbettungen, Textgenerierung, Spracherkennung und Bildsegmentierung.
Das in diesem Lab verwendete Beispiel ist ein MobileNet V1-Bildklassifizierungsmodell, das mit dem ImageNet-Dataset vortrainiert wurde. Wenn Sie sofort einsatzbereite Modelle aus TensorFlow Hub oder anderen ähnlichen Deep-Learning-Repositories nutzen, können Sie hochwertige ML-Modelle für eine Reihe von Vorhersageaufgaben bereitstellen, ohne sich um das Modelltraining kümmern zu müssen.
4. Umgebung einrichten
Für dieses Codelab benötigen Sie ein Google Cloud Platform-Projekt mit aktivierter Abrechnung. Folgen Sie dieser Anleitung, um ein Projekt zu erstellen.
Schritt 1: Compute Engine API aktivieren
Rufen Sie Compute Engine auf und wählen Sie Aktivieren aus, falls die API noch nicht aktiviert ist.
Schritt 2: Vertex AI API aktivieren
Rufen Sie den Vertex AI-Bereich Ihrer Cloud Console auf und klicken Sie auf Vertex AI API aktivieren.

Schritt 3: Vertex AI Workbench-Instanz erstellen
Klicken Sie in der Cloud Console im Bereich „Vertex AI“ auf „Workbench“:

Aktivieren Sie die Notebooks API, falls sie noch nicht aktiviert ist.

Klicken Sie nach der Aktivierung auf VERWALTETE NOTEBOOKS:

Wählen Sie dann NEUES NOTEBOOK aus.

Geben Sie Ihrem Notebook einen Namen und wählen Sie unter Berechtigung die Option Dienstkonto aus.

Wählen Sie Erweiterte Einstellungen aus.
Wählen Sie unter Sicherheit die Option „Terminal aktivieren“ aus, falls sie noch nicht aktiviert ist.

Alle anderen erweiterten Einstellungen können Sie unverändert lassen.
Klicken Sie auf Erstellen. Die Bereitstellung der Instanz kann einige Minuten dauern.
Nachdem die Instanz erstellt wurde, klicken Sie auf JUPYTERLAB ÖFFNEN.

5. Modell registrieren
Schritt 1: Modell in Cloud Storage hochladen
Klicken Sie auf diesen Link, um zur TensorFlow Hub-Seite für das MobileNet V1-Modell zu gelangen, das mit dem ImageNet-Dataset trainiert wurde.
Klicken Sie auf Herunterladen, um die gespeicherten Modellartefakte herunterzuladen.

Wählen Sie im Cloud Storage-Bereich der Google Cloud Console die Option ERSTELLEN aus.

Geben Sie Ihrem Bucket einen Namen und wählen Sie „us-central1“ als Region aus. Klicken Sie dann auf ERSTELLEN.

Laden Sie das heruntergeladene TensorFlow Hub-Modell in den Bucket hoch. Entpacken Sie die Datei zuerst.

Der Bucket sollte in etwa so aussehen:
imagenet_mobilenet_v1_050_128_classification_5/
saved_model.pb
variables/
variables.data-00000-of-00001
variables.index
Schritt 2: Modell in die Registry importieren
Rufen Sie in der Cloud Console den Bereich Vertex AI Model Registry auf.

Wählen Sie IMPORT aus.
Wählen Sie Als neues Modell importieren aus und geben Sie einen Namen für Ihr Modell ein.

Geben Sie unter Modelleinstellungen den neuesten vordefinierten TensorFlow-Container an. Wählen Sie dann den Pfad in Cloud Storage aus, in dem Sie die Modellartefakte gespeichert haben.

Sie können den Abschnitt Erklärbarkeit überspringen.
Wählen Sie dann IMPORT aus.
Nach dem Import wird das Modell in der Modell-Registry angezeigt.

6. Modell bereitstellen
Wählen Sie in der Modellregistrierung das Dreipunkt-Menü auf der rechten Seite des Modells aus und klicken Sie auf Auf Endpunkt bereitstellen.

Wählen Sie unter Endpunkt definieren die Option Neuen Endpunkt erstellen aus und geben Sie dann einen Namen für den Endpunkt ein.
Legen Sie unter Modelleinstellungen die maximale Anzahl von Rechenknoten auf 1 und den Maschinentyp auf n1-standard-2 fest und belassen Sie alle anderen Einstellungen unverändert. Klicken Sie dann auf DEPLOY (Bereitstellen).

Nach der Bereitstellung ändert sich der Bereitstellungsstatus in Auf Vertex AI bereitgestellt.

7. Vorhersagen abrufen
Öffnen Sie das Workbench-Notebook, das Sie in den Einrichtungsschritten erstellt haben. Erstellen Sie über den Launcher ein neues TensorFlow 2-Notebook.

Führen Sie die folgende Zelle aus, um die erforderlichen Bibliotheken zu importieren.
from google.cloud import aiplatform
import tensorflow as tf
import numpy as np
from PIL import Image
Das MobileNet-Modell, das Sie von TensorFlow Hub heruntergeladen haben, wurde mit dem ImageNet-Dataset trainiert. Die Ausgabe des MobileNet-Modells ist eine Zahl, die einem Klassenlabel im ImageNet-Dataset entspricht. Um diese Zahl in ein String-Label zu übersetzen, müssen Sie die Bildlabels herunterladen.
# Download image labels
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Damit Sie den Endpunkt erreichen können, müssen Sie die Endpunktressource definieren. Ersetzen Sie {PROJECT_NUMBER} und {ENDPOINT_ID}.
PROJECT_NUMBER = "{PROJECT_NUMBER}"
ENDPOINT_ID = "{ENDPOINT_ID}"
endpoint = aiplatform.Endpoint(
endpoint_name=f"projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")
Sie finden Ihre Projektnummer auf der Startseite der Console.

Die Endpunkt-ID finden Sie im Abschnitt Endpunkte von Vertex AI.

Als Nächstes testen Sie den Endpunkt.
Laden Sie zuerst das folgende Bild herunter und dann in Ihre Instanz hoch.

Öffnen Sie das Bild mit PIL. Anschließend wird die Größe angepasst und mit 255 skaliert. Die vom Modell erwartete Bildgröße finden Sie auf der TensorFlow Hub-Seite des Modells.
IMAGE_PATH = "test-image.jpg"
IMAGE_SIZE = (128, 128)
im = Image.open(IMAGE_PATH)
im = im.resize(IMAGE_SIZE
im = np.array(im)/255.0
Als Nächstes konvertieren Sie die NumPy-Daten in eine Liste, damit sie im Text der HTTP-Anfrage gesendet werden können.
x_test = im.astype(np.float32).tolist()
Rufen Sie schließlich eine Vorhersage für den Endpunkt auf und suchen Sie dann das entsprechende String-Label.
# make prediction request
result = endpoint.predict(instances=[x_test]).predictions
# post process result
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]
print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")
8. [Optional] TF Serving zur Optimierung von Vorhersagen verwenden
Für realistischere Beispiele sollten Sie das Bild wahrscheinlich direkt an den Endpunkt senden, anstatt es zuerst in NumPy zu laden. Das ist effizienter, aber Sie müssen die Bereitstellungsfunktion des TensorFlow-Modells ändern. Diese Änderung ist erforderlich, um die Eingabedaten in das Format zu konvertieren, das Ihr Modell erwartet.
Schritt 1: Bereitstellungsfunktion ändern
Öffnen Sie ein neues TensorFlow-Notebook und importieren Sie die erforderlichen Bibliotheken.
from google.cloud import aiplatform
import tensorflow as tf
Anstatt die gespeicherten Modellartefakte herunterzuladen, laden Sie das Modell dieses Mal mit hub.KerasLayer in TensorFlow. Dabei wird ein TensorFlow-SavedModel als Keras-Layer umschlossen. Um das Modell zu erstellen, können Sie die Keras Sequential API mit dem heruntergeladenen TF Hub-Modell als Ebene verwenden und die Eingabeform für das Modell angeben.
tfhub_model = tf.keras.Sequential(
[hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v1_050_128/classification/5")]
)
tfhub_model.build([None, 128, 128, 3])
Definieren Sie den URI für den Bucket, den Sie zuvor erstellt haben.
BUCKET_URI = "gs://{YOUR_BUCKET}"
MODEL_DIR = BUCKET_URI + "/bytes_model"
Wenn Sie eine Anfrage an einen Onlinevorhersageserver senden, wird die Anfrage von einem HTTP-Server empfangen. Der HTTP-Server extrahiert die Vorhersageanfrage aus dem Inhaltstext der HTTP-Anfrage. Die extrahierte Vorhersageanfrage wird an die Serving-Funktion weitergeleitet. Bei den vorgefertigten Vertex AI-Vorhersagecontainern wird der Anfrageinhalt als tf.string an die Bereitstellungsfunktion übergeben.
Wenn Sie Bilder an den Vorhersagedienst übergeben möchten, müssen Sie die komprimierten Bild-Bytes in Base64 codieren. Dadurch wird der Inhalt vor Änderungen geschützt, während Binärdaten über das Netzwerk übertragen werden.
Da das bereitgestellte Modell Eingabedaten als Rohbytes (nicht komprimiert) erwartet, müssen Sie dafür sorgen, dass die Base64-codierten Daten wieder in Rohbytes (z. B. JPEG) konvertiert und dann vorverarbeitet werden, um den Anforderungen an die Modelleingabe zu entsprechen, bevor sie als Eingabe an das bereitgestellte Modell übergeben werden.
Um dieses Problem zu beheben, definieren Sie eine Bereitstellungsfunktion (serving_fn) und hängen sie als Vorverarbeitungsschritt an das Modell an. Sie fügen einen @tf.function-Decorator hinzu, damit die Bereitstellungsfunktion mit dem zugrunde liegenden Modell zusammengeführt wird (anstatt vorgelagert auf einer CPU).
CONCRETE_INPUT = "numpy_inputs"
def _preprocess(bytes_input):
decoded = tf.io.decode_jpeg(bytes_input, channels=3)
decoded = tf.image.convert_image_dtype(decoded, tf.float32)
resized = tf.image.resize(decoded, size=(128, 128))
return resized
@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def preprocess_fn(bytes_inputs):
decoded_images = tf.map_fn(
_preprocess, bytes_inputs, dtype=tf.float32, back_prop=False
)
return {
CONCRETE_INPUT: decoded_images
} # User needs to make sure the key matches model's input
@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def serving_fn(bytes_inputs):
images = preprocess_fn(bytes_inputs)
prob = m_call(**images)
return prob
m_call = tf.function(tfhub_model.call).get_concrete_function(
[tf.TensorSpec(shape=[None, 128, 128, 3], dtype=tf.float32, name=CONCRETE_INPUT)]
)
tf.saved_model.save(tfhub_model, MODEL_DIR, signatures={"serving_default": serving_fn})
Wenn Sie Daten für die Vorhersage als HTTP-Anfragepaket senden, werden die Bilddaten base64-codiert, das TensorFlow-Modell akzeptiert jedoch NumPy-Eingaben. Ihre Serving-Funktion übernimmt die Konvertierung von Base64 in ein NumPy-Array.
Wenn Sie eine Vorhersageanfrage stellen, müssen Sie die Anfrage an die Bereitstellungsfunktion und nicht an das Modell weiterleiten. Dazu benötigen Sie den Namen der Eingabeschicht der Bereitstellungsfunktion. Wir können diesen Namen aus der Signatur der Serving-Funktion abrufen.
loaded = tf.saved_model.load(MODEL_DIR)
serving_input = list(
loaded.signatures["serving_default"].structured_input_signature[1].keys()
)[0]
print("Serving function input name:", serving_input)
Schritt 2: In die Registrierung importieren und bereitstellen
In den vorherigen Abschnitten haben Sie gesehen, wie Sie ein Modell über die Benutzeroberfläche in die Vertex AI Model Registry importieren. In diesem Abschnitt wird eine alternative Methode mit dem SDK beschrieben. Sie können hier auch die Benutzeroberfläche verwenden.
model = aiplatform.Model.upload(
display_name="optimized-model",
artifact_uri=MODEL_DIR,
serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest",
)
print(model)
Sie können das Modell auch über das SDK anstelle der Benutzeroberfläche bereitstellen.
endpoint = model.deploy(
deployed_model_display_name='my-bytes-endpoint',
traffic_split={"0": 100},
machine_type="n1-standard-4",
accelerator_count=0,
min_replica_count=1,
max_replica_count=1,
)
Schritt 3: Modell testen
Jetzt können Sie den Endpunkt testen. Da wir die Bereitstellungsfunktion geändert haben, können Sie das Bild dieses Mal direkt (base64-codiert) in der Anfrage senden, anstatt es zuerst in NumPy zu laden. So können Sie auch größere Bilder senden, ohne das Größenlimit für Vertex AI Predictions zu überschreiten.
Bildlabels noch einmal herunterladen
import numpy as np
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Codieren Sie das Bild mit Base64.
import base64
with open("test-image.jpg", "rb") as f:
data = f.read()
b64str = base64.b64encode(data).decode("utf-8")
Rufen Sie eine Vorhersage auf und geben Sie den Namen der Eingabeschicht der Bereitstellungsfunktion an, die wir zuvor in der Variablen serving_input definiert haben.
instances = [{serving_input: {"b64": b64str}}]
# Make request
result = endpoint.predict(instances=instances).predictions
# Convert image class to string label
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]
print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")
🎉 Das wars! 🎉
Sie haben gelernt, wie Sie Vertex AI für folgende Aufgaben verwenden:
- Vortrainiertes Modell hosten und bereitstellen
Weitere Informationen zu den verschiedenen Bereichen von Vertex finden Sie in der Dokumentation.
9. Bereinigen
Da verwaltete Vertex AI Workbench-Notebooks ein Feature zum Herunterfahren bei Inaktivität haben, müssen wir uns keine Gedanken über das Herunterfahren der Instanz machen. Wenn Sie die Instanz manuell herunterfahren möchten, klicken Sie im Bereich „Vertex AI Workbench“ der Console auf die Schaltfläche „Beenden“. Wenn Sie das Notebook vollständig löschen möchten, klicken Sie auf die Schaltfläche „Löschen“.

Wenn Sie den Storage-Bucket löschen möchten, rufen Sie in der Cloud Console über das Navigationsmenü „Storage“ auf, wählen Sie den Bucket aus und klicken Sie auf „Löschen“:
