Anforderungen an den Trainingscode

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Führen Sie benutzerdefiniertes Training auf Vertex AI aus, um Ihren eigenen Trainingscode für maschinelles Lernen (ML) in der Cloud auszuführen, anstatt AutoML zu verwenden. In diesem Dokument werden die Anforderungen beschrieben, die beim Schreiben von Trainingscode zu berücksichtigen sind.

Trainingscodestruktur auswählen

Bestimmen Sie zuerst, welche Struktur Ihr ML-Trainingscode haben soll. Sie können Trainingscode für Vertex AI in einem der folgenden Formate bereitstellen:

  • Python-Trainingsanwendung zur Verwendung mit einem vordefinierten Container. Erstellen Sie eine Python-Quelldistribution mit Code, der ein ML-Modell trainiert und in Cloud Storage exportiert. Diese Trainingsanwendung kann alle Abhängigkeiten verwenden, die in dem vordefinierten Container enthalten sind, mit dem Sie sie verwenden möchten.

    Verwenden Sie diese Option, wenn einer der vordefinierten Vertex AI-Container für das Training alle Abhängigkeiten enthält, die Sie für das Training benötigen. Wenn Sie beispielsweise mit PyTorch, scikit-learn, TensorFlow oder XGBoost trainieren möchten, ist dies wahrscheinlich die bessere Option.

    Informationen zu den spezifischen Anforderungen für diese Option finden Sie im Leitfaden zum Erstellen einer Python-Trainingsanwendung.

  • Benutzerdefiniertes Container-Image. Erstellen Sie ein Docker-Container-Image mit Code, der ein ML-Modell trainiert und in Cloud Storage exportiert. Schließen Sie alle vom Code benötigten Abhängigkeiten in das Container-Image ein.

    Verwenden Sie diese Option, wenn Sie Abhängigkeiten verwenden möchten, die nicht in einem der vordefinierten Vertex AI-Container für das Training enthalten sind. Wenn Sie beispielsweise mit einem Python-ML-Framework trainieren möchten, das nicht in einem vordefinierten Container verfügbar ist, oder wenn Sie mit einer anderen Programmiersprache als Python trainieren möchten, ist dies die bessere Wahl.

    Informationen zu den spezifischen Anforderungen für diese Option finden Sie im Leitfaden zum Erstellen eines benutzerdefinierten Container-Images.

Der Rest dieses Dokuments beschreibt die Anforderungen, die für beide Codestrukturen relevant sind.

Anforderungen für den gesamten benutzerdefinierten Trainingscode

Beachten Sie beim Schreiben von benutzerdefiniertem Trainingscode für Vertex AI, dass der Code auf einer oder mehreren von Google Cloud verwalteten VM-Instanzen ausgeführt wird. In diesem Abschnitt werden die Anforderungen beschrieben, die für den gesamten benutzerdefinierten Trainingscode gelten.

Über den Code auf Google Cloud-Dienste zugreifen

In den folgenden Abschnitten wird der Zugriff auf andere Google Cloud-Dienste über Ihren Code beschrieben. Schreiben Sie Ihren Trainingscode zur Verwendung von Standardanmeldedaten für Anwendungen (ADC), um auf Google Cloud-Dienste zuzugreifen. Viele Google Cloud-Clientbibliotheken sind standardmäßig mit ADC authentifiziert. Sie müssen keine Umgebungsvariablen konfigurieren. Vertex AI konfiguriert ADC automatisch so, dass die Authentifizierung als Dienst-Agent für benutzerdefinierten Vertex AI-Code für Ihr Projekt (Standard) oder als benutzerdefiniertes Dienstkonto (falls Sie eines konfiguriert haben) erfolgt.

Wenn Sie aber in Ihrem Code eine Google Cloud-Clientbibliothek verwenden, stellt Vertex AI möglicherweise nicht immer standardmäßig eine Verbindung mit dem richtigen Google Cloud-Projekt her. Wenn Berechtigungsfehler auftreten, kann das an der Verbindung mit dem falschen Projekt liegen.

Dieses Problem tritt auf, weil Vertex AI den Code nicht direkt in Ihrem Google Cloud-Projekt ausführt. Stattdessen führt Vertex AI Ihren Code in einem von mehreren von Google verwalteten separaten Projekten aus. Vertex AI verwendet diese Projekte ausschließlich für Vorgänge im Zusammenhang mit Ihrem Projekt. Versuchen Sie daher nicht, eine Projekt-ID aus der Umgebung in Ihrem Trainings- oder Vorhersagecode abzuleiten. Geben Sie Projekt-IDs explizit an.

Wenn Sie eine Projekt-ID nicht im Trainingscode hartcodieren möchten, können Sie auf die Umgebungsvariable CLOUD_ML_PROJECT_ID verweisen: Vertex AI legt diese Umgebungsvariable in jedem benutzerdefinierten Trainingscontainer so fest, dass sie die Projektnummer des Projekts enthält, in dem Sie das benutzerdefinierte Training gestartet haben. Viele Google Cloud-Tools akzeptieren eine Projektnummer, wenn sie eine Projekt-ID verwenden.

Wenn Sie z. B. mit dem Python-Client für Google BigQuery auf eine BigQuery-Tabelle im selben Projekt zugreifen möchten, versuchen Sie nicht, in Ihrem Trainingscode das Projekt abzuleiten:

Implizite Projektauswahl

from google.cloud import bigquery

client = bigquery.Client()

Verwenden Sie stattdessen Code, der explizit ein Projekt auswählt:

Explizite Projektauswahl

import os

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

Wenn nach dem Konfigurieren des Codes auf diese Weise Berechtigungsfehler auftreten, lesen Sie den folgenden Abschnitt dazu, auf welche Ressourcen Ihr Code zugreifen kann, um die für Ihren Trainingscode verfügbaren Berechtigungen anzupassen.

Auf welche Ressourcen Ihr Code zugreifen kann

Standardmäßig hat der Trainingscode Zugriff auf alle Ressourcen, die für den Dienst-Agent für benutzerdefinierten Vertex AI-Code für Ihr Projekt verfügbar sind. Sie können Vertex AI auch so konfigurieren, dass Ihr Trainingscode auf mehr oder weniger Ressourcen zugreifen kann.

Betrachten Sie beispielsweise den Zugriff Ihres Trainingscodes auf Cloud Storage-Ressourcen:

Standardmäßig kann Vertex AI auf jeden Cloud Storage-Bucket in dem Google Cloud-Projekt zugreifen, in dem Sie benutzerdefiniertes Training durchführen. Sie können auch Vertex AI Zugriff auf Cloud Storage-Buckets in anderen Projekten gewähren oder genau anpassen, auf welche Buckets ein bestimmter Job zugreifen kann, indem Sie ein benutzerdefiniertes Dienstkonto verwenden.

Ähnliche Zugriffsregeln und -techniken gelten für BigQuery-Tabellen und andere Google Cloud-Ressourcen. Im Allgemeinen können Sie die für Ihren Trainingscode verfügbaren Ressourcen auf eine der folgenden Arten ändern:

Cloud Storage-Dateien mit Cloud Storage FUSE lesen und schreiben

Vertex AI stellt in allen benutzerdefinierten Trainingsjobs im Verzeichnis /gcs/ des Dateisystems jedes Trainingsknotens Cloud Storage-Buckets bereit, auf die Sie Zugriff haben. Als praktische Alternative zur Verwendung des Python-Clients für Cloud Storage oder einer anderen Bibliothek für den Zugriff auf Cloud Storage können Sie direkt aus dem lokalen Dateisystem lesen und darin schreiben, um Daten aus Cloud Storage zu lesen oder in Cloud Storage zu schreiben. Zum Laden von Daten aus gs://BUCKET/data.csv können Sie beispielsweise den folgenden Python-Code verwenden:

file = open('/gcs/BUCKET/data.csv', 'r')

Vertex AI verwendet Cloud Storage FUSE für die Bereitstellung der Storage-Buckets. Beachten Sie, dass von Cloud Storage FUSE bereitgestellte Verzeichnisse nicht POSIX-konform sind.

Die Anmeldedaten, die Sie für benutzerdefiniertes Training verwenden, bestimmen, auf welche Buckets Sie auf diese Weise zugreifen können. Im vorherigen Abschnitt dazu, auf welche Ressourcen Ihr Code zugreifen kann, wird genau beschrieben, auf welche Buckets Sie standardmäßig zugreifen können und wie Sie diesen Zugriff anpassen.

Eingabedaten laden

ML-Code arbeitet in der Regel mit Trainingsdaten, um ein Modell zu trainieren. Speichern Sie Trainingsdaten nicht zusammen mit Ihrem Code, unabhängig davon, ob Sie eine Python-Trainingsanwendung oder ein benutzerdefiniertes Container-Image erstellen. Das Speichern von Daten mit Code kann zu einem schlecht organisierten Projekt führen und eine Wiederverwendung des Codes für verschiedene Datasets erschweren und Fehler bei großen Datasets verursachen.

Wir empfehlen, die Daten aus einem von Vertex AI verwalteten Dataset zu laden. Alternativ können Sie auch Ihren eigenen Code schreiben, um Daten aus einer Quelle außerhalb von Vertex AI zu laden, z. B. aus BigQuery oder Cloud Storage.

Sie erzielen bessere Leistungen, während Sie Daten aus Cloud Storage laden, wenn Sie einen Bucket in der Region, in der Sie das benutzerdefinierte Training durchführen, verwenden. Informationen zum Speichern von Daten in Cloud Storage finden Sie unter Storage-Buckets erstellen und Objekte hochladen.

Informationen dazu, aus welchen Cloud Storage-Buckets Sie Daten laden können, finden Sie im vorherigen Abschnitt: Informationen dazu, auf welche Ressourcen Ihr Code zugreifen kann.

Verwenden Sie zum Laden von Daten aus Cloud Storage in Ihren Trainingscode das im vorherigen Abschnitt beschriebene Cloud Storage FUSE-Feature oder eine beliebige Bibliothek, die ADC unterstützt. Sie müssen die Anmeldedaten zur Authentifizierung nicht explizit in Ihrem Code angeben.

Beispielsweise können Sie eine der Clientbibliotheken verwenden, die im Cloud Storage-Leitfaden zum Herunterladen von Objekten beschrieben werden. Der Python-Client für Cloud Storage ist in vordefinierten Containern enthalten. Die Klasse tf.io.gfile.GFile von TensorFlow unterstützt auch ADC.

Großes Dataset laden

Abhängig davon, welche Maschinentypen Sie während des benutzerdefinierten Trainings verwenden möchten, können Ihre VMs ein großes Dataset möglicherweise nicht vollständig in den Arbeitsspeicher laden.

Wenn Sie Daten lesen müssen, die zu groß für den Arbeitsspeicher sind, streamen Sie die Daten oder lesen Sie sie schrittweise. Dabei gibt es verschiedene Best Practices für verschiedene ML-Frameworks. Mit der tf.data.Dataset-Klasse von TensorFlow können beispielsweise TFRecord- oder Textdaten aus Cloud Storage gestreamt werden.

Ein benutzerdefiniertes Training auf mehreren VMs mit Datenparallelität ist eine weitere Möglichkeit, die Datenmenge zu reduzieren, die jede VM in den Speicher lädt. Weitere Informationen finden Sie im Abschnitt Code für verteiltes Training schreiben in diesem Dokument.

Trainiertes ML-Modell exportieren

ML-Code exportiert üblicherweise ein trainiertes Modell am Ende des Trainings in Form von einem oder mehreren Modellartefakten. Mit den Modellartefakten können Sie Vorhersagen abrufen.

Nach Abschluss des benutzerdefinierten Trainings können Sie nicht mehr auf die VMs zugreifen, auf denen der Trainingscode ausgeführt wurde. Daher muss der Trainingscode Modellartefakte an einen Speicherort außerhalb von Vertex AI exportieren.

Wir empfehlen, Modellartefakte in einen Cloud Storage-Bucket zu exportieren. Wie im vorherigen Abschnitt beschrieben, auf welche Ressourcen Ihre Code zugreifen kann, kann Vertex AI auf jeden Cloud Storage-Bucket in dem Google Cloud-Projekt zugreifen, in dem Sie ein benutzerdefiniertes Training durchführen. Verwenden Sie eine Bibliothek, die ADC unterstützt, um Ihre Modellartefakte zu exportieren. APIs von TensorFlow zum Speichern von Keras-Modellen können beispielsweise Artefakte direkt in einen Cloud Storage-Pfad exportieren.

Wenn Sie Ihr trainiertes Modell zum Bereitstellen von Vorhersagen in Vertex AI verwenden möchten, muss der Code Modellartefakte in einem Format exportieren, das mit einem der vordefinierten Container für Vorhersagen kompatibel ist. Weitere Informationen finden Sie im Leitfaden zum Exportieren von Modellartefakten für Vorhersagen.

Umgebungsvariablen für spezielle Cloud Storage-Verzeichnisse

Wenn Sie das API-Feld baseOutputDirectory angeben, legt Vertex AI die folgenden Umgebungsvariablen fest, wenn Ihr Trainingscode ausgeführt wird:

Die Werte dieser Umgebungsvariablen unterscheiden sich geringfügig, je nachdem, ob Sie die Hyperparameter-Abstimmung verwenden oder nicht. Weitere Informationen finden Sie in der API-Referenz zu baseOutputDirectory.

Die Verwendung dieser Umgebungsvariablen macht es einfacher, denselben Trainingscode mehrfach zu verwenden (z. B. mit anderen Daten oder Konfigurationsoptionen) und die Modellartefakte und Prüfpunkte an verschiedenen Orten zu speichern, indem Sie einfach das API-Feld baseOutputDirectory ändern. Allerdings müssen Sie die Umgebungsvariablen im Code nicht verwenden, wenn Sie dies nicht möchten. Sie können zum Beispiel Speicherorte für das Speichern von Prüfpunkten und zum Exportieren von Modellartefakten auch hartcodieren.

Wenn Sie außerdem eine TrainingPipeline für benutzerdefiniertes Training verwenden und dabei das Feld modelToUpload.artifactUri nicht angeben, verwendet Vertex AI den Wert der Umgebungsvariablen AIP_MODEL_DIR für modelToUpload.artifactUri. (Zur Hyperparameter-Abstimmung verwendet Vertex AI den Wert der Umgebungsvariablen AIP_MODEL_DIR aus dem besten Test.)

Beständigkeit bei Neustarts gewährleisten

Die VMs, auf denen Ihr Trainingscode ausgeführt wird, werden gelegentlich neu gestartet. Unter Umständen muss Google Cloud eine VM zur Wartung neu starten. Wenn eine VM neu gestartet wird, beginnt Vertex AI noch einmal von vorn, den Code auszuführen.

Wenn die Ausführung des Trainingscodes voraussichtlich länger als vier Stunden dauert, fügen Sie dem Code mehrere Verhaltensweisen hinzu, um ihn für Neustarts stabil zu machen:

  • Exportieren Sie Ihren Trainingsfortschritt mindestens einmal alle vier Stunden nach Cloud Storage, damit der Fortschritt bei einem Neustart der VMs nicht verloren geht.

  • Prüfen Sie zu Beginn des Trainingscodes, ob der Trainingsfortschritt bereits an Ihrem Exportspeicherort vorhanden ist. Wenn dies der Fall ist, laden Sie den gespeicherten Trainingsstatus, anstatt das Training von Grund auf neu zu starten.

Vier Stunden sind eine Richtlinie, keine feste Beschränkung. Wenn die Gewährleistung der Ausfallsicherheit Priorität hat, sollten Sie Ihrem Code dieses Verhaltensweisen auch dann hinzufügen, wenn Sie keine lange Ausführungszeit erwarten.

Wie Sie diese Verhaltensweisen erreichen, hängt davon ab, welches ML-Framework Sie verwenden. Wenn Sie beispielsweise TensorFlow Keras verwenden, erfahren Sie hier, wie Sie den ModelCheckpoint-Callback zu diesem Zweck verwenden.

Weitere Informationen dazu, wie Vertex AI VMs verwaltet, finden Sie unter Informationen zum benutzerdefinierten Trainingsdienst.

Voraussetzungen für optionale benutzerdefinierte Trainingsfeatures

Wenn Sie bestimmte optionale benutzerdefinierte Trainingsfeatures verwenden möchten, müssen Sie unter Umständen zusätzliche Änderungen an Ihrem Trainingscode vornehmen. In diesem Abschnitt werden Codeanforderungen für die Hyperparameter-Abstimmung, GPUs, verteiltes Training und Vertex AI TensorBoard beschrieben.

Code für die Hyperparameter-Abstimmung schreiben

Vertex AI kann die Hyperparameter-Abstimmung für Ihren ML-Trainingscode durchführen. Weitere Informationen finden Sie unter Funktionsweise der Hyperparameter-Abstimmung auf Vertex AI und Konfigurieren einer HyperparameterTuningJob-Ressource.

Wenn Sie die Hyperparameter-Abstimmung verwenden möchten, muss der Trainingscode Folgendes tun:

  • Parsen Sie die Befehlszeilenargumente, die die abzustimmenden Hyperparameter darstellen, und verwenden Sie die geparsten Werte, um die Hyperparameter für das Training festzulegen.

  • Melden Sie hin und wieder den Hyperparameter-Abstimmungsmesswert an Vertex AI.

Befehlszeilenargumente parsen

Zur Hyperparameter-Abstimmung führt Vertex AI Ihren Trainingscode mehrmals aus, wobei jedes Mal andere Befehlszeilenargumente angegeben werden. Der Trainingscode muss diese Befehlszeilenargumente parsen und als Hyperparameter für das Training verwenden. Wenn Sie beispielsweise die Lernrate des Optimierers abstimmen möchten, können Sie ein Befehlszeilenargument namens --learning_rate parsen. Informationen zur Konfiguration der von Vertex AI bereitgestellten Befehlszeilenargumente finden Sie hier.

Wir empfehlen die Verwendung der argparse-Bibliothek von Python, um Befehlszeilenargumente zu parsen.

Messwert für Hyperparameter-Abstimmung übergeben

Der Trainingscode muss hin und wieder den Hyperparameter-Messwert melden, den Sie für Vertex AI optimieren möchten. Wenn Sie beispielsweise die Genauigkeit Ihres Modells maximieren möchten, können Sie diesen Messwert am Ende jeder Trainingsphase melden. Vertex AI verwendet diese Informationen, um zu entscheiden, welche Hyperparameter für den nächsten Trainingstest verwendet werden sollen. Weitere Informationen zur Auswahl und Angabe eines Hyperparameter-Abstimmungsmesswerts

Verwenden Sie die Python-Bibliothek cloudml-hypertune, um den Messwert der Hyperparameter-Abstimmung zu melden. Diese Bibliothek ist in allen vorkonfigurierten Containern für das Training enthalten und Sie können pip für die Installation in einem benutzerdefinierten Container verwenden.

Informationen zum Installieren und Verwenden dieser Bibliothek finden Sie unter die cloudml-hypertune GitHub-Repository oder lesen Sie die Vertex AI: Codelab zur Hyperparameter-Abstimmung.

Code für GPUs schreiben

Sie können VMs mit Grafikprozessoren (Graphics Processing Units, GPUs) auswählen, um Ihren benutzerdefinierten Trainingscode auszuführen. Benutzerdefiniertes Training für die Verwendung von GPU-fähigen VMs konfigurieren

Wenn Sie mit GPUs trainieren möchten, achten Sie darauf, dass der Trainingscode sie nutzen kann. Je nachdem, welches ML-Framework Sie verwenden, müssen Sie möglicherweise Änderungen an Ihrem Code vornehmen. Wenn Sie beispielsweise TensorFlow Keras verwenden, müssen Sie Ihren Code nur anpassen, wenn Sie mehr als eine GPU verwenden möchten. Einige ML-Frameworks können GPUs überhaupt nicht verwenden.

Prüfen Sie außerdem, ob Ihr Container GPUs unterstützt: Wählen Sie einen vorkonfigurierten Trainingscontainer, der GPUs unterstützt, oder installieren Sie das NVIDIA CUDA Toolkit und NVIDIA cuDNN in Ihrem benutzerdefinierten Container. Eine Möglichkeit dazu ist die Verwendung des Basis-Images aus dem nvidia/cuda-Docker-Repository. Eine weitere Möglichkeit ist die Verwendung einer Deep Learning Container-Instanz als Basis-Image.

Code für verteiltes Training schreiben

Für das Training mit großen Datasets können Sie Ihren Code auf mehreren VMs in einem von Vertex AI verwalteten verteilten Cluster ausführen. Mehrere VMs für das Training konfigurieren

Einige ML-Frameworks wie TensorFlow und PyTorch ermöglichen die Ausführung von identischem Trainingscode auf mehreren Maschinen, die die Arbeit automatisch abhängig von Umgebungsvariablen aufteilen, die auf den einzelnen Maschinen festgelegt wurden. Prüfen Sie, ob Vertex AI Umgebungsvariablen festlegt, um dies für Ihr gewünschtes ML-Framework zu ermöglichen.

Alternativ können Sie für jeden von mehreren Worker-Pools jeweils einen anderen Container ausführen. Ein Worker-Pool ist eine Gruppe von VMs, die Sie für die Verwendung derselben Computing-Optionen und desselben Containers konfigurieren. In diesem Fall sollten Sie sich weiterhin auf die Umgebungsvariablen verlassen, die von Vertex AI festgelegt wurden, um die Kommunikation zwischen den VMs zu koordinieren. Sie können den Trainingscode der einzelnen Worker-Pools anpassen, um beliebige Aufgaben auszuführen. Wie Sie das tun, hängt von Ihrem Ziel und dem von Ihnen verwendeten ML-Framework ab.

Benutzerdefinierte Trainingstests mit Vertex AI TensorBoard verfolgen und visualisieren

Vertex AI TensorBoard ist eine verwaltete Version von TensorBoard, einem Open-Source-Projekt von Google zum Visualisieren von ML-Tests. Mit Vertex AI TensorBoard können Sie ML-Tests verfolgen, visualisieren, vergleichen und an Ihr Team weitergeben. Sie können auch TensorBoard Profiler verwenden, um Leistungsengpässe zu lokalisieren und zu beheben, um Modelle schneller und günstiger zu trainieren.

So verwenden Sie Vertex AI TensorBoard mit benutzerdefiniertem Training:

  • Erstellen Sie in Ihrem Projekt eine Vertex AI TensorBoard-Instanz, um Ihre Tests zu speichern.

  • Konfigurieren Sie ein Dienstkonto, um den benutzerdefinierten Trainingsjob mit den entsprechenden Berechtigungen auszuführen.

  • Passen Sie Ihren benutzerdefinierten Trainingscode an, um mit TensorBoard kompatible Logs in Cloud Storage zu schreiben.

Eine detaillierte Anleitung für die ersten Schritte mit diesen Anforderungen finden Sie unter Vertex AI TensorBoard mit benutzerdefiniertem Training verwenden.

Nächste Schritte