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 finden Sie im zugehörigen Video:

.

Lerninhalte

Die folgenden Themen werden behandelt:

  • Verwaltetes Vertex AI Workbench-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 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 geht es um die unten hervorgehobenen Produkte: Training und Workbench.

Vertex-Produktübersicht

3. 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: Artifact Registry API aktivieren

Rufen Sie Artifact Registry auf und wählen Sie Aktivieren aus, falls die API noch nicht aktiviert ist. Damit erstellen Sie einen Container für Ihren benutzerdefinierten Trainingsjob.

Schritt 3: Vertex AI API aktivieren

Rufen Sie den Vertex AI-Bereich Ihrer Cloud Console auf und klicken Sie auf Vertex AI API aktivieren.

Vertex AI-Dashboard

Schritt 4: Vertex AI Workbench-Instanz erstellen

Klicken Sie in der Cloud Console im Bereich „Vertex AI“ 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 NOTEBOOK aus.

new_notebook

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

create_notebook

Wählen Sie 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 auf Erstellen. Die Bereitstellung der Instanz kann einige Minuten dauern.

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

open_jupyterlab

4. Trainingsanwendungscode containerisieren

Sie senden diesen Trainingsjob an Vertex AI, indem Sie den Code Ihrer Trainingsanwendung in einen Docker-Container einfügen und diesen Container in Google Artifact Registry übertragen. Mit diesem Ansatz können Sie ein Modell trainieren, das mit einem beliebigen Framework erstellt wurde.

Öffnen Sie zuerst über das Launcher-Menü ein Terminalfenster in Ihrer Notebook-Instanz:

Terminal in 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 Cloud Storage-Bucket kopieren

Wir müssen unser Blumendataset in Cloud Storage hochladen. Zu Demonstrationszwecken laden Sie das Dataset zuerst auf diese Workbench-Instanz herunter und kopieren es 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 sie dann in den gerade erstellten Bucket. Wir fügen „-r“ hinzu, weil wir das gesamte Verzeichnis kopieren möchten, und „-m“, um einen Multi-Processing-Kopiervorgang durchzuführen, der die Sache beschleunigt.

gsutil -m cp -r flower_photos $BUCKET

Schritt 3: Trainingscode schreiben

Erstellen Sie ein neues Verzeichnis mit dem Namen flowers und wechseln Sie dorthin:

mkdir flowers
cd flowers

Führen Sie den folgenden Code 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 Folgendes enthalten:

+ trainer/
    + task.py

Weitere Informationen zum Strukturieren des Codes Ihrer Trainingsanwendung

Öffnen Sie dann die gerade 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.

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 ein Verzeichnis /gcs, 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

Um Ihren Code zu containerisieren, müssen Sie ein Dockerfile erstellen. Das Dockerfile enthält alle Befehle, 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 Ihres Verzeichnisses „flowers“:

touch Dockerfile

Ihr flowers/-Verzeichnis sollte jetzt Folgendes enthalten:

+ 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 an.

Mit dem Befehl FROM wird das Basis-Image angegeben, also 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 Trainer-Code in das Docker-Image kopiert. In diesem Beispiel haben wir nur eine Python-Datei im Trainer-Verzeichnis. In einem realistischeren Beispiel hätten Sie wahrscheinlich zusätzliche Dateien. Vielleicht eine mit dem Namen data.py, die die Datenvorverarbeitung übernimmt, und eine mit dem Namen model.py, die nur den Modellcode enthält usw. Bei komplexerem Trainingscode finden Sie weitere Informationen in der Python-Dokumentation unter Python-Projekte verpacken.

Wenn Sie zusätzliche 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 ist jedoch nichts Zusätzliches erforderlich.

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 Schreiben 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 eine Variable mit dem URI Ihres Container-Images in Google Artifact Registry:

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 den folgenden Befehl im Stammverzeichnis Ihres flower-Verzeichnisses ausführen:

docker build ./ -t $IMAGE_URI

Übertragen Sie es schließlich per Push an Artifact Registry:

docker push $IMAGE_URI

Nachdem Sie den Container in Artifact Registry hochgeladen haben, können Sie jetzt den Trainingsjob starten.

5. Benutzerdefinierten Trainingsjob in Vertex AI ausführen

In diesem Lab wird 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 Abschnitt Training auf:

Menü „Train“

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 für Modellname flowers-model ein (oder einen beliebigen anderen Namen für Ihr Modell).
  • Klicken Sie auf Weiter.

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

Option für benutzerdefinierte Container

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

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

Schritt 2: Compute-Cluster konfigurieren

Konfigurieren Sie Worker-Pool 0 so:

worker_pool_0

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

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

Trainingjobs

🎉 Das wars! 🎉

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

  • 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 jedoch ein Modell, das mit einem beliebigen Framework erstellt wurde, 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 sehen Sie eine alternative Möglichkeit, den Trainingsjob mit dem Vertex AI Python SDK zu senden.

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. Sie müssen {PROJECT_ID} in container_uri durch den Namen Ihres Projekts und {BUCKET} in staging_bucket durch den zuvor erstellten Bucket ersetzen.

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 einer größeren Maschine als im vorherigen Abschnitt ausgeführt wird. Außerdem verwenden wir eine GPU. Wenn Sie machine-type, accelerator_type oder accelerator_count nicht angeben, wird der Job standardmäßig auf einer n1-standard-4 ausgeführt.

Im Bereich „Training“ Ihrer Konsole wird auf dem Tab BENUTZERDEFINIERTE JOBS Ihr Trainingsjob angezeigt.

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

Instanz beenden

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

Speicher löschen