1. Übersicht
In diesem Lab verwenden Sie Vertex AI, um Vorhersagen mithilfe eines vortrainierten Bildklassifizierungsmodells zu treffen.
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 belaufen sich auf etwa 1$.
2. Einführung in Vertex AI
In diesem Lab wird das neueste KI-Produktangebot von Google Cloud verwendet. Vertex AI integriert die ML-Angebote in Google Cloud für eine nahtlose Entwicklung. Bisher konnten auf mit AutoML trainierte Modelle und benutzerdefinierte Modelle über separate Dienste zugegriffen werden. Das neue Angebot kombiniert beide zusammen mit anderen neuen Produkten in 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 liegt der Schwerpunkt auf den unten aufgeführten Produkten: Vorhersagen und Workbench.
3. Anwendungsfall – Übersicht
In diesem Lab lernen Sie, wie Sie ein vortrainiertes Modell von TensorFlow Hub in Vertex AI bereitstellen. TensorFlow Hub ist ein Repository mit trainierten Modellen für eine Vielzahl von Problembereichen wie Einbettungen, Textgenerierung, Spracherkennung, Bildsegmentierung und mehr.
Das in diesem Lab verwendete Beispiel ist ein MobileNet V1-Bildklassifizierungsmodell, das mit dem ImageNet-Dataset vortrainiert wurde. Mithilfe von vorgefertigten Modellen aus TensorFlow Hub oder anderen ähnlichen Deep-Learning-Repositories 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
Sie benötigen ein Google Cloud-Projekt mit aktivierter Abrechnung, um dieses Codelab ausführen zu können. Eine Anleitung zum Erstellen eines Projekts finden Sie hier.
Schritt 1: Compute Engine API aktivieren
Rufen Sie Compute Engine auf und wählen Sie Aktivieren aus, falls die Option noch nicht aktiviert ist.
Schritt 2: Vertex AI API aktivieren
Rufen Sie den Bereich „Vertex AI“ der 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 noch nicht geschehen.
Klicken Sie nach der Aktivierung auf VERWALTETE NOTEBOOKS:
Wählen Sie dann NEUES NOTIZBUCH aus.
Geben Sie dem Notebook einen Namen und wählen Sie unter Berechtigung die Option Dienstkonto aus.
Wähle 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 dann auf Erstellen. Die Bereitstellung der Instanz dauert einige Minuten.
Wählen Sie nach dem Erstellen der Instanz JUPYTERLAB ÖFFNEN aus.
5. Modell registrieren
Schritt 1: Modell in Cloud Storage hochladen
Klicken Sie auf diesen Link, um die TensorFlow Hub-Seite für das MobileNet V1-Modell aufzurufen, das mit dem ImageNet-Dataset trainiert wurde.
Wählen Sie Herunterladen aus, um die gespeicherten Modellartefakte herunterzuladen.
Wählen Sie in der Google Cloud Console im Bereich „Cloud Storage“ die Option ERSTELLEN aus.
Geben Sie dem 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.
Ihr 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 Model Registry von Vertex AI auf.
Wählen Sie IMPORTIEREN 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, unter dem Sie die Modellartefakte gespeichert haben.
Sie können den Abschnitt Erklärbarkeit überspringen.
Wählen Sie dann IMPORTIEREN aus.
Nach dem Import wird Ihr Modell in der Modell-Registry angezeigt
6. Modell bereitstellen
Klicken Sie in der Modellregistrierung auf das Dreipunkt-Menü rechts neben dem Modell und dann auf Am Endpunkt bereitstellen.
Wählen Sie unter Endpunkt definieren die Option Neuen Endpunkt erstellen aus und geben Sie dem Endpunkt einen Namen.
Legen Sie unter Modelleinstellungen die Maximale Anzahl von Rechenknoten auf 1 und den Maschinentyp auf n1-standard-2
fest. Lassen Sie alle anderen Einstellungen unverändert. Klicken Sie dann auf 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. Wenn Sie diese Zahl in ein Stringlabel umwandeln möchten, 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 der Endpunkt aufgerufen werden kann, 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.
Und die Endpunkt-ID im Abschnitt Endpunkte von Vertex AI.
Als Nächstes testen Sie den Endpunkt.
Laden Sie zuerst das folgende Bild herunter und laden Sie es dann in Ihre Instanz hoch.
Öffnen Sie das Bild mit PIL. Ändern Sie dann die Größe und skalieren Sie um 255. 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
Konvertieren Sie als Nächstes die NumPy-Daten in eine Liste, damit sie im Hauptteil der HTTP-Anfrage gesendet werden können.
x_test = im.astype(np.float32).tolist()
Rufen Sie abschließend einen Vorhersageaufruf an den Endpunkt auf und suchen Sie dann nach dem entsprechenden Stringlabel.
# 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 empfiehlt es sich, das Bild selbst direkt an den Endpunkt zu 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 umzuwandeln, das Ihr Modell erwartet.
Schritt 1: Auslieferungsfunktion ä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 diesmal mit hub.KerasLayer
in TensorFlow. Dabei wird ein TensorFlow SavedModel als Keras-Ebene eingebunden. Zum Erstellen des Modells können Sie die Keras Sequential API mit dem heruntergeladenen TF Hub-Modell als Schicht 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 zuvor erstellten Bucket.
BUCKET_URI = "gs://{YOUR_BUCKET}"
MODEL_DIR = BUCKET_URI + "/bytes_model"
Wenn Sie eine Anfrage an einen Online-Vorhersageserver 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 Auslieferungsfunktion weitergeleitet. Für die vordefinierten Vorhersagecontainer in Vertex AI wird der Anfrageinhalt als tf.string
an die Bereitstellungsfunktion übergeben.
Um Bilder an den Vorhersagedienst zu übergeben, müssen Sie die komprimierten Bildbyte in Base 64 codieren. Dadurch wird der Inhalt vor Änderungen geschützt, während Binärdaten über das Netzwerk übertragen werden.
Da das bereitgestellte Modell Eingabedaten als Rohdaten (unkomprimierte Bytes) erwartet, müssen Sie dafür sorgen, dass die Base64-codierten Daten wieder in Rohbytes (z. B. JPEG) umgewandelt und dann so vorverarbeitet werden, dass sie den Modelleingabeanforderungen 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 dem Modell als Vorverarbeitungsschritt an. Sie fügen einen @tf.function
-Decorator hinzu, damit die Bereitstellungsfunktion mit dem zugrunde liegenden Modell zusammengeführt wird (statt Upstream 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 nimmt jedoch numpy-Eingabe an. Die Bereitstellungsfunktion führt die Umwandlung von Base64 in ein Numpy-Array durch.
Wenn Sie eine Vorhersageanfrage stellen, müssen Sie die Anfrage an die Bereitstellungsfunktion und nicht an das Modell weiterleiten. Sie müssen also den Namen der Eingabeebene der Bereitstellungsfunktion kennen. Diesen Namen können wir aus der Signatur der Auslieferungsfunktion 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 Registry 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 stattdessen 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 mit dem SDK statt über die UI 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 diesmal direkt (Base64-codiert) in der Anfrage senden, anstatt es zuerst in NumPy zu laden. Außerdem können Sie größere Bilder senden, ohne das Größenlimit für Vertex AI-Vorhersagen zu erreichen.
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 dabei den Namen der Eingabeebene 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}")
🎉 Glückwunsch! 🎉
Sie haben gelernt, wie Sie Vertex AI für Folgendes verwenden:
- Vortrainiertes Modell hosten und bereitstellen
Weitere Informationen zu den verschiedenen Bereichen von Vertex finden Sie in der Dokumentation.
9. Bereinigen
Da verwaltete Notebooks in Vertex AI Workbench eine Funktion 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 in der Console im Bereich „Vertex AI Workbench“ auf die Schaltfläche „Beenden“. Wenn Sie das Notizbuch vollständig löschen möchten, klicken Sie auf Löschen.
Wenn Sie den Speicher-Bucket löschen möchten, klicken Sie in der Cloud Console im Navigationsmenü auf „Speicher“, wählen Sie den Bucket aus und klicken Sie auf „Löschen“: