Von Prototyp zur Produktion: Benutzerdefinierte Modelle mit Vertex AI trainieren

1. Übersicht

In diesem Lab verwenden Sie Vertex AI, um einen benutzerdefinierten Trainingsjob auszuführen.

Dieses Lab ist Teil der Videoreihe Prototyping to Production. Sie erstellen mithilfe des Datasets „Blumen“ ein Bildklassifizierungsmodell. Weitere Informationen erhalten Sie im zugehörigen Video:

.

Lerninhalte

Die folgenden Themen werden behandelt:

  • Ein verwaltetes Vertex AI Workbench-Notebook erstellen
  • Benutzerdefinierten Trainingsjob über die Vertex AI-UI konfigurieren und starten
  • Benutzerdefinierten Trainingsjob mit dem Vertex AI Python SDK konfigurieren und starten

Die Gesamtkosten für das Lab in Google Cloud belaufen sich auf 1$.

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 Schwerpunkt auf den unten aufgeführten Produkten: Training und Workbench.

Vertex-Produktübersicht

3. Umgebung einrichten

Sie benötigen ein Google Cloud Platform-Projekt mit aktivierter Abrechnung, um dieses Codelab auszuführen. Folgen Sie dieser Anleitung, um ein Projekt zu erstellen.

Schritt 1: Compute Engine API aktivieren

Gehen Sie zu Compute Engine und wählen Sie Aktivieren aus, falls dies noch nicht geschehen ist.

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 Container für Ihren benutzerdefinierten Trainingsjob.

Schritt 3: Vertex AI API aktivieren

Rufen Sie den Bereich Vertex AI in der Cloud Console auf und klicken Sie auf Vertex AI API aktivieren.

Vertex AI-Dashboard

Schritt 4: Vertex AI Workbench-Instanz erstellen

Klicken Sie im Bereich Vertex AI der Cloud Console auf Workbench:

Vertex AI-Menü

Aktivieren Sie die Notebooks API, falls noch nicht geschehen.

Notebook_api

Klicken Sie nach der Aktivierung auf VERWALTETE NOTEBOOKS:

Notebooks_UI

Wählen Sie dann NEUES NOTEBOOK aus.

new_notebook

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

create_notebook

Wähle Erweiterte Einstellungen aus.

Wählen Sie unter Sicherheit die Option „Terminal aktivieren“ aus. falls es noch nicht aktiviert ist.

enable_terminal

Alle anderen erweiterten Einstellungen können Sie unverändert lassen.

Klicken Sie dann auf Erstellen. Die Bereitstellung der Instanz kann einige Minuten dauern.

Nachdem die Instanz erstellt wurde, wählen Sie OPEN JUPYTERLAB (JUPYTERLAB ÖFFNEN) aus.

open_jupyterlab

4. Trainingsanwendungscode containerisieren

Zum Senden dieses Trainingsjobs an Vertex AI fügen Sie Ihren Trainingsanwendungscode in einen Docker-Container ein und übertragen diesen Container per Push in Google Artifact Registry. Mit diesem Ansatz können Sie ein Modell trainieren, das mit einem beliebigen Framework erstellt wurde.

Öffnen Sie dazu im Launcher-Menü ein Terminalfenster in Ihrer Notebookinstanz:

Terminal im Notebook öffnen

Schritt 1: Cloud Storage-Bucket erstellen

In diesem Trainingsjob exportieren Sie das trainierte TensorFlow-Modell in einen Cloud Storage-Bucket. Außerdem speichern Sie die Daten für das Training in einem Cloud Storage-Bucket.

Führen Sie im 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}-bucket"
gsutil mb -l us-central1 $BUCKET

Schritt 2: Daten in den Cloud Storage-Bucket kopieren

Wir müssen das Blumen-Dataset in Cloud Storage laden. Zu Demonstrationszwecken laden Sie das Dataset zuerst in diese Workbench-Instanz herunter und kopieren es dann in einen Bucket.

Daten herunterladen und entpacken

wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
tar xvzf flower_photos.tgz

Kopieren Sie es dann in den Bucket, den Sie gerade erstellt haben. Wir fügen „-r“ hinzu, weil wir das gesamte Verzeichnis kopieren möchten, und „-m“, um eine Kopie mit mehreren Verarbeitungsvorgängen durchzuführen, um den Vorgang zu beschleunigen.

gsutil -m cp -r flower_photos $BUCKET

Schritt 3: Trainingscode schreiben

Erstellen Sie ein neues Verzeichnis mit dem Namen flowers und fügen Sie es mit cd ein:

mkdir flowers
cd flowers

Führen Sie den folgenden Befehl aus, um ein Verzeichnis für den Trainingscode und eine Python-Datei zu erstellen, in die Sie den Code einfügen.

mkdir trainer
touch trainer/task.py

In Ihrem flowers/-Verzeichnis sollte nun Folgendes vorhanden sein:

+ trainer/
    + task.py

Weitere Informationen zur Strukturierung des Codes Ihrer Trainingsanwendung finden Sie in der Dokumentation.

Öffnen Sie als Nächstes die soeben erstellte Datei task.py und kopieren Sie den unten stehenden Code.

Ersetzen Sie {your-gcs-bucket} durch den Namen des Cloud Storage-Buckets, den Sie gerade erstellt haben.

Mit dem Cloud Storage FUSE-Tool können Trainingsjobs in Vertex AI Training auf Daten in Cloud Storage als Dateien im lokalen Dateisystem zugreifen. Wenn Sie einen benutzerdefinierten Trainingsjob starten, sieht der Job das Verzeichnis /gcs, das alle Ihre Cloud Storage-Buckets als Unterverzeichnisse enthält. Aus diesem Grund beginnen die Datenpfade im Trainingscode mit /gcs.

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''
  
  train_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  validation_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
  validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

  return train_dataset, validation_dataset


def create_model():
  '''Creates model.'''

  model = tf.keras.Sequential([
    tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
    tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
    tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

# CREATE DATASETS
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

# CREATE/COMPILE MODEL
model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

# TRAIN MODEL
history = model.fit(
  train_dataset,
  validation_data=validation_dataset,
  epochs=EPOCHS
)

# SAVE MODEL
model.save(f'{BUCKET_ROOT}/model_output')

Schritt 4: Dockerfile erstellen

Zum Containerisieren Ihres Codes müssen Sie ein Dockerfile erstellen. In das Dockerfile geben Sie alle Befehle ein, die zum Ausführen des Images erforderlich sind. Damit werden alle erforderlichen Bibliotheken installiert und der Einstiegspunkt für den Trainingscode eingerichtet.

Erstellen Sie im Terminal im Stammverzeichnis Ihres Blumenverzeichnisses ein leeres Dockerfile:

touch Dockerfile

In Ihrem flowers/-Verzeichnis sollte nun Folgendes vorhanden sein:

+ Dockerfile
+ trainer/
    + task.py

Öffnen Sie das Dockerfile und kopieren Sie Folgendes hinein:

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.task"]

Sehen wir uns die Befehle in dieser Datei noch einmal an.

Der Befehl FROM gibt das Basis-Image an. Dies ist das übergeordnete Image, auf dem das von Ihnen erstellte Image basiert. Als Basis-Image verwenden Sie das GPU-Docker-Image „Deep Learning Container TensorFlow Enterprise 2.8“. In den Deep-Learning-Containern in Google Cloud sind viele gängige ML- und Data-Science-Frameworks vorinstalliert.

Mit dem Befehl WORKDIR wird das Verzeichnis im Image angegeben, in dem nachfolgende Anweisungen ausgeführt werden.

Mit dem Befehl COPY wird der Trainercode in das Docker-Image kopiert. Beachten Sie, dass sich in diesem Beispiel nur eine Python-Datei im Trainerverzeichnis befindet. Für ein realistischeres Beispiel würden Sie jedoch wahrscheinlich zusätzliche Dateien haben. Vielleicht eine mit dem Namen data.py, die die Datenvorverarbeitung übernimmt, und die andere mit dem Namen model.py, die nur den Modellcode usw. enthält. Komplexeren Trainingscode finden Sie in der Python-Dokumentation zum Verpacken von Python-Projekten.

Wenn Sie zusätzliche Bibliotheken hinzufügen möchten, können Sie den Befehl RUN für die pip-Installation verwenden (z. B. RUN pip install -r requirements.txt). Aber für unser Beispiel hier brauchen wir nichts weiter zu tun.

Abschließend richtet der Befehl ENTRYPOINT den Einstiegspunkt zum Aufrufen des Trainers ein. Sie wird ausgeführt, wenn wir den Trainingsjob starten. In unserem Fall wird die Datei task.py ausgeführt.

Weitere Informationen zum Schreiben von Dockerfiles für Vertex AI Training finden Sie hier.

Schritt 4: Container erstellen

Führen Sie im Terminal Ihres Workbench-Notebooks 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'

Repository in Artifact Registry erstellen

REPO_NAME='flower-app'

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=us-central1 --description="Docker repository"

Definieren Sie in Google Artifact Registry eine Variable mit dem URI Ihres Container-Images:

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image:latest

Docker konfigurieren

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

Erstellen Sie dann den Container, indem Sie im Stammverzeichnis Ihres flower-Verzeichnisses Folgendes ausführen:

docker build ./ -t $IMAGE_URI

Laden Sie es zuletzt in Artifact Registry hoch:

docker push $IMAGE_URI

Nachdem der Container an Artifact Registry übertragen wurde, können Sie den Trainingsjob starten.

5. Benutzerdefinierten Trainingsjob in Vertex AI ausführen

In diesem Lab wird das benutzerdefinierte Training über einen benutzerdefinierten Container in Google Artifact Registry verwendet. Sie können aber auch einen Trainingsjob mit vordefinierten Containern ausführen.

Gehen Sie zuerst im Vertex-Bereich der Cloud Console zum Abschnitt Training:

Zugfahrkarte

Schritt 1: Trainingsjob konfigurieren

Klicken Sie auf Erstellen, um die Parameter für Ihren Trainingsjob einzugeben.

create_training

  • Wählen Sie unter Dataset die Option Kein verwaltetes Dataset aus.
  • Wählen Sie dann Benutzerdefiniertes Training (erweitert) als Trainingsmethode aus und klicken Sie auf Weiter.
  • Wählen Sie Neues Modell trainieren aus und geben Sie dann flowers-model (bzw. den Namen Ihres Modells) als Modellname ein.
  • Klicken Sie auf Weiter.

Wählen Sie im Schritt „Containereinstellungen“ die Option Benutzerdefinierter Container aus:

Benutzerdefinierte Containeroption

Geben Sie im ersten Feld (Container-Image) den Wert der Variablen IMAGE_URI aus dem vorherigen Abschnitt ein. Sie sollte us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest mit Ihrer eigenen Projekt-ID lauten. Lassen Sie die restlichen Felder leer und klicken Sie auf Weiter.

Überspringen Sie den Schritt „Hyperparameter“, indem Sie noch einmal auf Weiter klicken.

Schritt 2: Compute-Cluster konfigurieren

Konfigurieren Sie den Worker-Pool 0 so:

worker_pool_0

Im nächsten Lab dieser Reihe überspringen Sie Schritt 6 und konfigurieren den Vorhersagecontainer.

Klicken Sie auf TRAINING STARTEN, um den Trainingsjob zu starten. Im Abschnitt "Training" der Konsole auf dem Tab TRAININGSPIPELINES sehen Sie den neu gestarteten Job:

Trainingjobs

🎉 Glückwunsch! 🎉

Sie haben gelernt, wie Sie mit Vertex AI Folgendes tun können:

  • Starten Sie einen benutzerdefinierten Trainingsjob für Trainingscode, der in einem benutzerdefinierten Container bereitgestellt wird. In diesem Beispiel haben Sie ein TensorFlow-Modell verwendet. Sie können aber ein mit einem beliebigen Framework erstelltes Modell mithilfe benutzerdefinierter oder integrierter Container trainieren.

Weitere Informationen zu den verschiedenen Teilen von Vertex finden Sie in der Dokumentation.

6. [Optional] Vertex AI Python SDK verwenden

Im vorherigen Abschnitt wurde gezeigt, wie der Trainingsjob über die Benutzeroberfläche gestartet wird. In diesem Abschnitt wird eine alternative Methode zum Senden des Trainingsjobs mit dem Vertex AI Python SDK beschrieben.

Kehren Sie zu Ihrer Notebookinstanz zurück und erstellen Sie im Launcher ein TensorFlow 2-Notebook:

new_notebook

Importieren Sie das Vertex AI SDK.

from google.cloud import aiplatform

Erstellen Sie dann ein CustomContainerTrainingJob. Dabei ersetzen Sie {PROJECT_ID} in container_uri durch den Namen Ihres Projekts und {BUCKET} in staging_bucket durch den Bucket, den Sie zuvor erstellt haben.

my_job = aiplatform.CustomContainerTrainingJob(display_name='flower-sdk-job',
                                               container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest',
                                               staging_bucket='gs://{BUCKET}')

Führen Sie dann den Job aus.

my_job.run(replica_count=1,
           machine_type='n1-standard-8',
           accelerator_type='NVIDIA_TESLA_V100',
           accelerator_count=1)

Zu Demonstrationszwecken wurde dieser Job so konfiguriert, dass er auf einem größeren Computer ausgeführt wird als im vorherigen Abschnitt. Außerdem wird eine GPU ausgeführt. Wenn Sie machine-type, accelerator_type oder accelerator_count nicht angeben, wird der Job standardmäßig für eine n1-standard-4 ausgeführt.

Im Abschnitt "Training" der Konsole auf dem Tab BENUTZERDEFINIERTE JOBS finden Sie Ihren Trainingsjob.

7. Bereinigen

Da von Vertex AI Workbench verwaltete Notebooks eine Funktion zum Herunterfahren haben, müssen wir uns nicht um das Herunterfahren der Instanz kümmern. Wenn Sie die Instanz manuell herunterfahren möchten, klicken Sie in der Console im Abschnitt Vertex AI Workbench auf die Schaltfläche „Stop“. Wenn Sie das Notizbuch vollständig löschen möchten, klicken Sie auf Löschen.

Instanz beenden

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

Speicher löschen