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 Von Prototyp zur Produktion. Sie erstellen ein Bildklassifikationsmodell mit dem Flowers-Dataset. Weitere Informationen findest du im Video:

.

Lerninhalte

Die folgenden Themen werden behandelt:

  • Von Vertex AI Workbench verwaltetes Notebook erstellen
  • Benutzerdefinierten Trainingsjob über die Vertex AI-Benutzeroberfläche konfigurieren und starten
  • Benutzerdefinierten Trainingsjob mit dem Vertex AI Python SDK konfigurieren und starten

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-Angebot 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: Training und Workbench.

Vertex-Produktübersicht

3. Umgebung einrichten

Sie benötigen ein Google Cloud-Projekt mit aktivierter Abrechnung, um dieses Codelab ausführen zu können. 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 Option noch nicht aktiviert ist.

Schritt 2: Artifact Registry API aktivieren

Rufen Sie Artifact Registry auf und wählen Sie Aktivieren aus, falls dies noch nicht geschehen ist. Sie verwenden es, um einen Container für Ihren benutzerdefinierten Trainingsjob zu erstellen.

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.

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 sie noch nicht aktiviert ist.

Notebook_api

Klicken Sie nach der Aktivierung auf VERWALTETE NOTEBOOKS:

Notebooks_UI

Wählen Sie dann NEUES NOTIZBUCH 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 sie 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.

Wählen Sie nach dem Erstellen der Instanz JUPYTERLAB ÖFFNEN aus.

open_jupyterlab

4. Code der Trainingsanwendung containerisieren

Sie reichen diesen Trainingsjob bei Vertex AI ein, indem Sie den Code Ihrer Trainingsanwendung in einen Docker-Container einfügen und diesen Container in die Google Artifact Registry hochladen. 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. Sie speichern die Daten für das Training auch 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 im 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 unseren Blumendatensatz in Cloud Storage hochladen. Zu Demonstrationszwecken laden Sie den Datensatz zuerst in diese Workbench-Instanz herunter und kopieren ihn dann in einen Bucket.

Laden Sie die Daten herunter und entpacken Sie sie.

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 Multi-Processing-Kopie auszuführen, was den Vorgang beschleunigt.

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

Ihr flowers/-Verzeichnis sollte jetzt so aussehen:

+ trainer/
    + task.py

Weitere Informationen zum Strukturieren des Codes Ihrer Trainingsanwendung finden Sie in der Dokumentation.

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

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

Über das 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, wird dem Job das Verzeichnis /gcs angezeigt, das alle Ihre Cloud Storage-Buckets als Unterverzeichnisse enthält. Deshalb 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. Im Dockerfile geben Sie alle Befehle an, die zum Ausführen des Images erforderlich sind. Dadurch werden alle erforderlichen Bibliotheken installiert und der Einstiegspunkt für den Trainingscode eingerichtet.

Erstellen Sie über Ihr Terminal ein leeres Dockerfile im Stammverzeichnis des Verzeichnisses „flowers“:

touch Dockerfile

Ihr flowers/-Verzeichnis sollte jetzt so aussehen:

+ 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 Deep Learning Container TensorFlow Enterprise 2.8 GPU Docker-Image. 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. In diesem Beispiel befindet sich nur eine Python-Datei im Verzeichnis „trainer“. In einem realistischeren Beispiel würden Sie wahrscheinlich zusätzliche Dateien haben. Vielleicht einen mit dem Namen data.py, der die Datenvorverarbeitung übernimmt, und einen mit dem Namen model.py, der nur den Modellcode enthält. Bei komplexeren Trainingscodes finden Sie in der Python-Dokumentation Informationen zum Paketieren von Python-Projekten.

Wenn Sie weitere Bibliotheken hinzufügen möchten, können Sie den Befehl RUN verwenden, um sie mit Pip zu installieren (z. B. RUN pip install -r requirements.txt). Für unser Beispiel benötigen wir jedoch nichts weiter.

Mit dem Befehl ENTRYPOINT wird der Einstiegspunkt zum Aufrufen des Trainers festgelegt. Das wird ausgeführt, wenn wir unseren Trainingsjob starten. In unserem Fall ist das die Ausführung der Datei task.py.

Weitere Informationen zum Erstellen von Dockerfiles für Vertex AI Training

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

Übertragen Sie es dann per Push in die Artifact Registry:

docker push $IMAGE_URI

Nachdem der Container in Artifact Registry gepusht wurde, können Sie den Trainingsjob starten.

5. Benutzerdefinierten Trainingsjob in Vertex AI ausführen

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

Rufen Sie zuerst in der Cloud Console im Bereich „Vertex“ den Bereich Training auf:

Menü „Zug“

Schritt 1: Trainingsjob konfigurieren

Klicken Sie auf Erstellen, um die Parameter für den 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:

Option „Benutzerdefinierter Container“

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

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

Schritt 2: Rechencluster konfigurieren

Konfigurieren Sie Worker-Pool 0 so:

worker_pool_0

Sie überspringen Schritt 6 und konfigurieren den Prognosecontainer im nächsten Lab dieser Reihe.

Klicken Sie auf TRAINING STARTEN, um den Trainingsjob zu starten. Im Bereich „Training“ der Console wird auf dem Tab TRAININGSPIPELINES der neu gestartete Job angezeigt:

Trainingjobs

🎉 Glückwunsch! 🎉

Sie haben gelernt, wie Sie Vertex AI für Folgendes verwenden:

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

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

6. [Optional] Vertex AI Python SDK verwenden

Im vorherigen Abschnitt wurde gezeigt, wie Sie den Trainingsjob über die Benutzeroberfläche starten. In diesem Abschnitt erfahren Sie, wie Sie den Trainingsjob mit dem Vertex AI Python SDK einreichen können.

Kehren Sie zu Ihrer Notebook-Instanz zurück und erstellen Sie über den Launcher ein TensorFlow 2-Notebook:

new_notebook

Importieren Sie das Vertex AI SDK.

from google.cloud import aiplatform

Erstellen Sie dann eine CustomContainerTrainingJob. Ersetzen Sie {PROJECT_ID} in container_uri durch den Namen Ihres Projekts und {BUCKET} in staging_bucket durch den zuvor erstellten Bucket.

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)

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

Im Bereich „Training“ der Console sehen Sie auf dem Tab BENUTZERDEFINIERTE JOBS Ihren Trainingsjob.

7. 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 die Schaltfläche „Löschen“.

Instanz beenden

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“:

Speicher löschen