Benutzerdefinierte Trainingsjobs erstellen

Benutzerdefinierte Trainingsjobs stellen den grundlegenden Weg dar, um benutzerdefinierten Trainingscode für maschinelles Lernen (ML) in Vertex AI auszuführen.

Bevor Sie einen Job senden

Bevor Sie einen benutzerdefinierten Trainingsjob an Vertex AI senden, müssen Sie eine Python-Trainingsanwendung oder einen benutzerdefinierten Container erstellen, um den Trainingscode und die Abhängigkeiten festzulegen, die Sie auf Vertex AI ausführen möchten. Wenn Sie eine Python-Trainingsanwendung erstellen, können Sie einen Code mit unseren vordefinierten Containern ausführen. Weitere Informationen zur Auswahl dieser Optionen finden Sie in den Anforderungen an den Trainingscode.

Was ein benutzerdefinierter Job umfasst

Beim Erstellen eines benutzerdefinierten Jobs legen Sie Einstellungen fest, die Vertex AI zum Ausführen des Trainingscodes ausführen muss. Dazu gehören:

Innerhalb der Worker-Pools können Sie die folgenden Einstellungen festlegen:

Verteiltes Training konfigurieren

Sie können einen benutzerdefinierten Trainingsjob für das verteilte Training konfigurieren, indem Sie mehrere Worker-Pools angeben.

In den meisten Beispielen auf dieser Seite werden Trainingsjobs mit einem Replikat und einem Worker-Pool aufgeführt. So ändern Sie diese für verteiltes Training:

  • Verwenden Sie Ihren ersten Worker-Pool für die Konfiguration des primären Replikats und setzen Sie die Anzahl der Replikate auf 1.
  • Fügen Sie weitere Worker-Pools hinzu, um Worker-Replikate, Parameterserver-Replikate oder Evaluator-Replikate zu konfigurieren, wenn Ihr Framework für maschinelles Lernen diese zusätzlichen Clusteraufgaben für verteiltes Training unterstützt.

Verteiltes Training verwenden

Einen benutzerdefinierten Job erstellen

So erstellen Sie einen benutzerdefinierten Job:

Console

In der Google Cloud Console können Sie keine CustomJob-Ressource direkt erstellen. Sie können jedoch eine TrainingPipeline-Ressource erstellen, mit der ein CustomJob erstellt wird.

In der folgenden Anleitung wird beschrieben, wie Sie eine TrainingPipeline erstellen, mit der einfach nur ein CustomJob erstellt wird. Wenn Sie zusätzliche TrainingPipeline-Features verwenden möchten, z. B. das Training mit einem verwalteten Dataset oder das Erstellen einer Model-Ressource am Ende des Trainings, lesen Sie Trainingspipelines erstellen.

  1. Wechseln Sie in der Cloud Console unter „Vertex AI“ zur Seite Trainingspipelines.

    Zur Trainingspipeline

  2. Klicken Sie auf Erstellen, um den Bereich Neues Modell trainieren zu öffnen.

  3. Legen Sie im Schritt Trainingsmethode auswählen die folgenden Einstellungen fest:

    1. Wählen Sie in der Drop-down-Liste Dataset die Option Kein verwaltetes Dataset aus.

    2. Wählen Sie Benutzerdefiniertes Training (erweitert) aus.

    Klicken Sie auf Weiter.

  4. Geben Sie im Schritt Modell definieren einen Namen Ihrer Wahl ein, MODEL_NAME für Ihr Modell. Klicken Sie auf Weiter.

  5. Legen Sie im Schritt Trainingscontainer die folgenden Einstellungen fest:

    1. Wählen Sie, ob einVorgefertigter Container oderBenutzerdefinierter Container für Schulungen verwendet werden soll.

    2. Führen Sie je nach Auswahl einen der folgenden Schritte aus:

    3. Im Feld Modellausgabeverzeichnis können Sie den Cloud Storage-URI eines Verzeichnisses in einem Bucket angeben, auf den Sie Zugriff haben. Das Verzeichnis muss noch nicht vorhanden sein.

      Dieser Wert wird Vertex AI im API-Feld baseOutputDirectory übergeben. Dadurch werden mehrere Umgebungsvariablen festgelegt, auf die Ihre Trainingsanwendung zugreifen kann, wenn sie ausgeführt wird.

    4. Im Feld Argumente können Sie optional Argumente für Vertex AI angeben, die beim Ausführen des Trainingscodes verwendet werden. Das Verhalten dieser Argumente hängt davon ab, welchen Containertyp Sie verwenden:

    Klicken Sie auf Weiter.

  6. Achten Sie darauf, dass im Schritt Hyperparameter-Abstimmung das Kästchen Hyperparameter-Abstimmung aktivieren nicht angeklickt ist. Klicken Sie auf Weiter.

  7. Legen Sie im Schritt Computing und Preise die folgenden Einstellungen fest:

    1. Wählen Sie in der Drop-down-Liste Region eine Region aus, die benutzerdefiniertes Training unterstützt.

    2. Geben Sie im Abschnitt Worker-Pool 0 die Computing-Ressourcen für das Training an.

      Wenn Sie Beschleuniger angeben, muss der von Ihnen ausgewählte Beschleuniger in der ausgewählten Region verfügbar sein.

      Wenn Sie ein verteiltes Training durchführen möchten, klicken Sie auf Weitere Worker-Pools hinzufügen und geben Sie für jeden zusätzlichen Worker-Pool, den Sie wollen, weitere Compute-Ressourcen an.

    Klicken Sie auf Weiter.

  8. Wählen Sie im Schritt Vorhersagecontainer die Option Kein Vorhersagecontainer aus.

  9. Klicken Sie auf Training starten, um die benutzerdefinierte Trainingspipeline zu starten.

gcloud

In den folgenden Beispielen wird der Befehl gcloud beta ai custom-jobs create verwendet.

Je nachdem, ob Sie eine Python-Trainingsanwendung zur Verwendung mit einem vordefinierten Container erstellt haben oder einen benutzerdefinierten Container verwenden, führen Sie einen der folgenden Befehle aus:

Vordefinierter Container

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --python-package-uris=PYTHON_PACKAGE_URIS \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE

Dabei gilt:

  • LOCATION: Die Region, in der der Container oder das Python-Paket ausgeführt wird.
  • JOB_NAME: erforderlich. Ein Anzeigename für CustomJob.
  • PYTHON_PACKAGE_URIS: Durch Kommas getrennte Liste der Cloud Storage-URIs, die die Python-Paketdateien angeben, wobei es sich um das Trainingsprogramm und die abhängigen Pakete handelt. Die maximale Anzahl der Paket-URIs beträgt 100.
  • MACHINE_TYPE: Der Maschinentyp. Hier finden Sie die verfügbaren Maschinentypen für das Training.
  • REPLICA_COUNT: Die Anzahl der zu verwendenden Worker-Replikate. In den meisten Fällen ist dies auf 1 für den ersten Worker-Pool festgelegt.
  • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: Der URI des Container-Images, das das bereitgestellte Python-Paket ausführt. Siehe Verfügbare vordefinierte Container für das Training.
  • PYTHON_MODULE: Der Name des Python-Moduls, der nach der Installation der Pakete ausgeführt werden soll.

Benutzerdefinierter Container

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI

Dabei gilt:

  • LOCATION: Die Region, in der der Container oder das Python-Paket ausgeführt wird.
  • JOB_NAME: erforderlich. Ein Anzeigename für CustomJob.
  • MACHINE_TYPE: Der Maschinentyp. Hier finden Sie die verfügbaren Maschinentypen für das Training.
  • REPLICA_COUNT: Die Anzahl der zu verwendenden Worker-Replikate. In den meisten Fällen ist dies auf 1 für den ersten Worker-Pool festgelegt.
  • CUSTOM_CONTAINER_IMAGE_URI: Der URI eines Container-Images in Artifact Registry, Container Registry oder Docker Hub, der auf jedem Worker-Replikat ausgeführt werden soll.

Benutzerdefinierter Container, basierend auf lokalem Code

Wenn Sie Trainingscode auf Ihrem lokalen Computer haben, können Sie mit einem einzigen Befehl folgendes tun:

  • Erstellen eines benutzerdefinierten Docker-Image auf Basis Ihres Codes.
  • Laden Sie das Image in Container Registry hoch.
  • Starten Sie einen CustomJob auf der Basis des Images.

Das Ergebnis ähnelt dem Erstellen eines CustomJob mit jedem anderen benutzerdefinierten Container. Sie können diese Version des Befehls verwenden, wenn sie für Ihren Workflow geeignet ist.

Hinweis

Da mit dieser Version des Befehls ein Docker-Image erstellt und hochgeladen wird, müssen Sie auf Ihrem lokalen Computer die folgende Konfiguration ausführen:

  1. Installieren Sie Docker Engine.

  2. Wenn Sie Linux verwenden, konfigurieren Sie Docker so, dass es ohne sudo ausgeführt werden kann.

  3. Aktivieren Sie die Container Registry API.

    Aktivieren Sie die API

  4. Konfigurieren Sie die Authentifizierung für Docker, damit Sie Docker-Images in Container Registry hochladen können:

    gcloud auth configure-docker
    

Docker-Image erstellen und hochladen sowie CustomJob erstellen

Der folgende Befehl erstellt ein Docker-Image basierend auf einem vordefinierten Trainings-Container-Image und Ihrem lokalen Python-Code, lädt das Image in Container Registry hoch und erstellt einen CustomJob.

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,local-package-path=WORKING_DIRECTORY,script=SCRIPT_PATH

Dabei gilt:

  • LOCATION: Die Region, in der der Container oder das Python-Paket ausgeführt wird.

  • JOB_NAME: erforderlich. Ein Anzeigename für CustomJob.

  • MACHINE_TYPE: Der Maschinentyp. Hier finden Sie die verfügbaren Maschinentypen für das Training.

  • REPLICA_COUNT: Die Anzahl der zu verwendenden Worker-Replikate. In den meisten Fällen ist dies auf 1 für den ersten Worker-Pool festgelegt.

  • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: Der URI des Container-Images, das das bereitgestellte Python-Paket ausführt. Siehe Verfügbare vordefinierte Container für das Training.

    Dieses Image dient als Basis-Image für das neue Docker-Image, das Sie mit diesem Befehl erstellen.

  • WORKING_DIRECTORY: Ein Verzeichnis in Ihrem lokalen Dateisystem, das das Einstiegspunktskript enthält, das Ihren Trainingscode ausführt (siehe folgendes Listenelement).

    Sie können das übergeordnete Verzeichnis des Skripts oder ein Verzeichnis auf höherer Ebene verwenden. Sie können ein Verzeichnis auf höherer Ebene verwenden, um einen voll qualifizierten Python-Modulnamen anzugeben. Weitere Informationen finden Sie im folgenden Listenelement. Ein Verzeichnis auf höherer Ebene kann auch verwendet werden, um zusätzliche Abhängigkeiten im Container zu installieren, wenn es eine Datei requirements.txt oder eine Datei setup.py enthält. Diese Funktionalität ist vergleichbar mit der entsprechenden Funktionalität des Befehls gcloud beta ai custom-jobs local-run. Auch wenn Sie ein Verzeichnis auf höherer Ebene angeben, kopiert dieser Befehl nur das übergeordnete Verzeichnis Ihres Einstiegspunktskripts in das Docker-Image.

  • SCRIPT_PATH: Der Pfad, relativ zu WORKING_DIRECTORY in Ihrem lokalen Dateisystem, zu dem Skript, das der Einstiegspunkt für Ihren Trainingscode ist. Dies kann ein Python-Skript (mit der Endung .py) oder ein Bash-Skript sein.

    Wenn Sie beispielsweise /hello-world/trainer/task.py ausführen möchten und WORKING_DIRECTORY auf /hello-world gesetzt ist, verwenden Sie trainer/task.py für diesen Wert.

    python-module anstelle von script verwenden

    Sie können script=SCRIPT_PATH optional durch python-module=PYTHON_MODULE ersetzen, um den Namen eines Python-Moduls in WORKING_DIRECTORY anzugeben, das als Einstiegspunkt für das Training ausgeführt werden soll. Anstelle von script=trainer/task.py können Sie beispielsweise python-module=trainer.task angeben.

    Der resultierende Docker-Container lädt in diesem Fall Ihren Code als Modul und nicht als Skript. Sie sollten diese Option vermutlich verwenden, wenn über Ihr Einstiegspunktskript andere Python-Module in WORKING_DIRECTORY importiert werden.

Verteiltes Training konfigurieren

Wenn Sie ein verteiltes Training durchführen möchten, können Sie das Flag --worker-pool-spec mehrmals angeben, einmal für jeden Worker-Pool. In den folgenden Beispielen werden die vorherigen Beispiele so angepasst, dass ein zweiter Worker-Pool verwendet wird:

Vordefinierter Container

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --python-package-uris=PYTHON_PACKAGE_URIS \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE \
  --worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,executor-image-uri=SECOND_POOL_PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=SECOND_POOL_PYTHON_MODULE

Benutzerdefinierter Container

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
  --worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,container-image-uri=SECOND_POOL_CUSTOM_CONTAINER_IMAGE_URI

Benutzerdefinierter Container, basierend auf lokalem Code

Wenn Sie local-package-path=WORKING_DIRECTORY im Befehl verwenden, können Sie nur einen einzelnen Worker-Pool konfigurieren. Verteiltes Training ist nicht verfügbar.

Erweiterte Konfiguration

Wenn Sie Konfigurationsoptionen angeben möchten, die in den vorhergehenden Beispielen nicht verfügbar sind, können Sie mit dem Flag --config den Pfad zu einer config.yaml-Datei in Ihrer lokalen Umgebung angeben, die die Felder von CustomJobSpecenthält. Beispiel:

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --config=config.yaml

Beispiel für eine config.yaml-Datei

REST UND BEFEHLSZEILE

Ersetzen Sie dabei folgende Werte für die Anfragedaten:

  • LOCATION: Die Region, in der der Container oder das Python-Paket ausgeführt wird.
  • PROJECT_ID: Ihre Projekt-ID oder Projektnummer
  • JOB_NAME: erforderlich. Ein Anzeigename für CustomJob.
  • Definieren Sie den benutzerdefinierten Trainingsjob:
    • MACHINE_TYPE: Der Maschinentyp. Hier finden Sie die verfügbaren Maschinentypen für das Training.
    • ACCELERATOR_TYPE: (Optional) Der Typ des Beschleunigers, der dem Job hinzugefügt werden soll.
    • ACCELERATOR_COUNT: (Optional) Die Anzahl der Beschleuniger, die an den Job angehängt werden sollen.
    • DISK_TYPE: (Optional) Der Typ des Bootlaufwerks, das für den Job verwendet werden soll, entweder pd-standard (Standardeinstellung) oder pd-ssd. Weitere Informationen zu Laufwerkstypen
    • DISK_SIZE: (Optional) Die Größe des Bootlaufwerks in GB, das für den Job verwendet werden soll. Der Standardwert ist 100.
    • REPLICA_COUNT: Die Anzahl der zu verwendenden Worker-Replikate. In den meisten Fällen ist dies auf 1 für den ersten Worker-Pool festgelegt.
    • Wenn Ihre Trainingsanwendung in einem benutzerdefinierten Container ausgeführt wird, geben Sie Folgendes an:
      • CUSTOM_CONTAINER_IMAGE_URI: Der URI eines Container-Images in Artifact Registry, Container Registry oder Docker Hub, der auf jedem Worker-Replikat ausgeführt werden soll.
      • CUSTOM_CONTAINER_COMMAND: (Optional) Der Befehl, der beim Start des Containers aufgerufen werden soll. Mit diesem Befehl wird der Standardeinstiegspunkt des Containers überschrieben.
      • CUSTOM_CONTAINER_ARGS: (Optional) Die Argumente, die beim Starten des Containers übergeben werden.
    • Wenn Ihre Trainingsanwendung ein Python-Paket ist, das in einem vordefinierten Container ausgeführt wird, geben Sie Folgendes an:
      • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: Der URI des Container-Images, das das bereitgestellte Python-Paket ausführt. Siehe Verfügbare vordefinierte Container für das Training.
      • PYTHON_PACKAGE_URIS: Durch Kommas getrennte Liste der Cloud Storage-URIs, die die Python-Paketdateien angeben, wobei es sich um das Trainingsprogramm und die abhängigen Pakete handelt. Die maximale Anzahl der Paket-URIs beträgt 100.
      • PYTHON_MODULE: Der Name des Python-Moduls, der nach der Installation der Pakete ausgeführt werden soll.
      • PYTHON_PACKAGE_ARGS: (Optional) Befehlszeilenargumente, die an das Python-Modul übergeben werden sollen.
    • Optionen für die Jobplanung
    • TIMEOUT: (Optional) Die maximale Ausführungszeit für den Job.
  • Geben Sie LABEL_NAME und LABEL_VALUE für alle Labels an, die Sie auf diesen benutzerdefinierten Job anwenden möchten.

HTTP-Methode und URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

JSON-Text der Anfrage:

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": MACHINE_TYPE,
          "acceleratorType": ACCELERATOR_TYPE,
          "acceleratorCount": ACCELERATOR_COUNT
        },
        "replicaCount": REPLICA_COUNT,
        "diskSpec": {
          "bootDiskType": DISK_TYPE,
          "bootDiskSizeGb": DISK_SIZE
        },

        // Union field task can be only one of the following:
        "containerSpec": {
          "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
          "command": [
            CUSTOM_CONTAINER_COMMAND
          ],
          "args": [
            CUSTOM_CONTAINER_ARGS
          ]
        },
        "pythonPackageSpec": {
          "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
          "packageUris": [
            PYTHON_PACKAGE_URIS
          ],
          "pythonModule": PYTHON_MODULE,
          "args": [
            PYTHON_PACKAGE_ARGS
          ]
        }
        // End of list of possible types for union field task.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "timeout": TIMEOUT
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs"

PowerShell

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

Die Antwort enthält Informationen zu Spezifikationen sowie die TRAININGPIPELINE_ID.

Node.js

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */

// const customJobDisplayName = 'YOUR_CUSTOM_JOB_DISPLAY_NAME';
// const containerImageUri = 'YOUR_CONTAINER_IMAGE_URI';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

// Imports the Google Cloud Job Service Client library
const {JobServiceClient} = require('@google-cloud/aiplatform');

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};

// Instantiates a client
const jobServiceClient = new JobServiceClient(clientOptions);

async function createCustomJob() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;
  const customJob = {
    displayName: customJobDisplayName,
    jobSpec: {
      workerPoolSpecs: [
        {
          machineSpec: {
            machineType: 'n1-standard-4',
            acceleratorType: 'NVIDIA_TESLA_K80',
            acceleratorCount: 1,
          },
          replicaCount: 1,
          containerSpec: {
            imageUri: containerImageUri,
            command: [],
            args: [],
          },
        },
      ],
    },
  };
  const request = {parent, customJob};

  // Create custom job request
  const [response] = await jobServiceClient.createCustomJob(request);

  console.log('Create custom job response');
  console.log(`${JSON.stringify(response)}`);
}
createCustomJob();

Python

In diesem Beispiel wird das Vertex SDK for Python verwendet. Bevor Sie das folgende Codebeispiel ausführen, müssen Sie die Authentifizierung einrichten.

from google.cloud import aiplatform

def create_custom_job_sample(
    project: str,
    display_name: str,
    container_image_uri: str,
    location: str = "us-central1",
    api_endpoint: str = "us-central1-aiplatform.googleapis.com",
):
    # The AI Platform services require regional API endpoints.
    client_options = {"api_endpoint": api_endpoint}
    # Initialize client that will be used to create and send requests.
    # This client only needs to be created once, and can be reused for multiple requests.
    client = aiplatform.gapic.JobServiceClient(client_options=client_options)
    custom_job = {
        "display_name": display_name,
        "job_spec": {
            "worker_pool_specs": [
                {
                    "machine_spec": {
                        "machine_type": "n1-standard-4",
                        "accelerator_type": aiplatform.gapic.AcceleratorType.NVIDIA_TESLA_K80,
                        "accelerator_count": 1,
                    },
                    "replica_count": 1,
                    "container_spec": {
                        "image_uri": container_image_uri,
                        "command": [],
                        "args": [],
                    },
                }
            ]
        },
    }
    parent = f"projects/{project}/locations/{location}"
    response = client.create_custom_job(parent=parent, custom_job=custom_job)
    print("response:", response)

Nächste Schritte

  • Unter Modelle in Vertex AI importieren wird gezeigt, wie Sie benutzerdefinierte Trainingsjobs erstellen, um Ihre benutzerdefinierten Trainingsanwendungen auf Vertex AI auszuführen.