Hyperparameter-Abstimmungsjob erstellen

Hyperparameter sind Variablen, die das Training eines Modells steuern, beispielsweise die Batchgröße oder die Anzahl der verborgenen Ebenen in einem neuronalen Deep-Learning-Netzwerk. Bei der Hyperparameter-Abstimmung wird nach der besten Kombination von Hyperparameter-Werten gesucht. Dazu werden Messwerte anhand einer Reihe von Tests optimiert. Messwerte sind skalare Zusammenfassungen, die Sie dem Trainer hinzufügen, z. B. die Modellgenauigkeit.

Weitere Informationen zur Hyperparameter-Abstimmung in Vertex AI. Ein detailliertes Beispiel finden Sie im Codelab zu Vertex AI: Hyperparameter Abstimmung.

Sie erfahren hier, wie Sie:

Trainingsanwendung vorbereiten

Bei einem Hyperparameter-Abstimmungsjob erstellt Vertex AI Tests für Ihren Trainingsjob mit verschiedenen Sätzen von Hyperparametern und bewertet die Effektivität eines Tests anhand der von Ihnen angegebenen Messwerte. Vertex AI übergibt Hyperparameterwerte als Befehlszeilenargumente an Ihre Trainingsanwendung. Damit Vertex AI die Wirksamkeit eines Tests bewerten kann, muss Ihre Trainingsanwendung die Messwerte an Vertex AI übergeben.

In den nächsten Abschnitten wird Folgendes erläutert:

  • Wie Vertex AI Hyperparameter an Ihre Trainingsanwendung übergibt.
  • Optionen zum Übergeben von Messwerten von Ihrer Trainingsanwendung an Vertex AI

Weitere Informationen zu den Anforderungen für benutzerdefinierte Trainingsanwendungen, die auf Vertex AI ausgeführt werden, finden Sie unter Anforderungen an Trainingscodes.

Befehlszeilenargumente für die abzustimmenden Hyperparameter bearbeiten

Vertex AI legt beim Aufrufen Ihrer Trainingsanwendung Befehlszeilenargumente fest. Nutzen Sie die Befehlszeilenargumente in Ihrem Code:

  1. Legen Sie einen Namen für jedes Hyperparameter-Argument fest und parsen Sie ihn mit einem Argument-Parser Ihrer Wahl, z. B. mit argparse. Verwenden Sie dieselben Argumentnamen beim Konfigurieren des Hyperparameter-Trainingsjobs.

    Wenn Ihre Trainingsanwendung beispielsweise ein Python-Modul mit dem Namen my_trainer ist und Sie einen Hyperparameter mit dem Namen learning_rate abstimmen, startet Vertex AI jeden Test mit einem Befehl wie dem folgenden:

    python3 -m my_trainer --learning_rate learning-rate-in-this-trial
    

    Vertex AI bestimmt die learning-rate-in-this-trial und übergibt sie mit dem Argument learning_rate.

  2. Weisen Sie die Werte aus den Befehlszeilenargumenten den Hyperparametern in Ihrem Trainingscode zu.

Weitere Informationen zu den Anforderungen beim Parsen von Befehlszeilenargumenten finden Sie in diesem Artikel.

Messwerte an Vertex AI übergeben

Verwenden Sie das Python-Paket cloudml-hypertune, um Ihre Messwerte an Vertex AI zu senden. Diese Bibliothek bietet Hilfsfunktionen zum Senden von Messwerten an Vertex AI.

Weitere Informationen zum Übergeben von Hyperparameter-Messwerten finden Sie in diesem Artikel.

Hyperparameter-Abstimmungsjob erstellen.

Wählen Sie je nach Tool, das Sie zum Erstellen eines HyperparameterTuningJob verwenden möchten, einen der folgenden Tabs aus:

Console

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

In der folgenden Anleitung wird gezeigt, wie Sie eine TrainingPipeline erstellen, mit der ausschließlich ein HyperparameterTuningJob angelegt wird. Wenn Sie zusätzliche TrainingPipeline-Features wie das Training mit einem verwalteten Dataset verwenden möchten, finden Sie die entsprechenden Informationen unter Trainingspipelines erstellen.

  1. Rufen Sie in der Google Cloud Console im Abschnitt "Vertex AI" die Seite Trainingspipelines auf.

    Zur Trainingspipeline

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

  3. Legen Sie im Schritt Trainingsmethode 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. Wählen Sie im Schritt Modelldetails die Option Neues Modell trainieren oder Neue Version trainieren aus. Wenn Sie „Neues Modell trainieren” auswählen, geben Sie einen Namen Ihrer Wahl (MODEL_NAME) für Ihr Modell ein. Klicken Sie auf Weiter.

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

    1. Wählen Sie, ob ein vordefinierter Container oder ein benutzerdefinierter Container für das Training 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. Optional: Im Feld Argumente können Sie Argumente angeben, die Vertex AI beim Ausführen des Trainingscodes verwenden soll. Die maximale Länge aller Argumente zusammen beträgt 100.000 Zeichen. Das Verhalten dieser Argumente hängt davon ab, welchen Containertyp Sie verwenden:

    Klicken Sie auf Weiter.

  6. Klicken Sie im Schritt Hyperparameter-Abstimmung auf das Kästchen Hyperparameter-Abstimmung aktivieren und geben Sie die folgenden Einstellungen an:

    1. Geben Sie im Abschnitt Neuer Hyperparameter den Parameternamen und den Typ des Hyperparameters an, den Sie optimieren möchten. Konfigurieren Sie die angezeigten zusätzlichen Hyperparameter-Einstellungen abhängig vom angegebenen Typ.

      Weitere Informationen zu Hyperparameter-Typen und zugehörigen Konfigurationen finden Sie in diesem Artikel.

    2. Wenn Sie mehrere Hyperparameter abstimmen möchten, klicken Sie auf Neuen Parameter hinzufügen und wiederholen Sie den vorherigen Schritt in dem neuen Abschnitt, der angezeigt wird.

      Wiederholen Sie diese Schritte für jeden Hyperparameter, den Sie abstimmen möchten.

    3. Geben Sie im Feld Zu optimierender Messwert und in der Drop-down-Liste Ziel den Namen und das Ziel des Messwerts an, den Sie optimieren möchten.

    4. Geben Sie im Feld Maximale Anzahl an Tests die maximale Anzahl an Tests an, die von Vertex AI für Ihren Hyperparameter-Abstimmungsjob ausgeführt werden sollen.

    5. Geben Sie im Feld Maximale Anzahl an parallelen Tests die maximale Anzahl an Tests an, die Vertex AI gleichzeitig ausführen kann.

    6. Geben Sie in der Drop-down-Liste Suchalgorithmus einen Suchalgorithmus für die Verwendung durch Vertex AI an.

    7. Ignorieren Sie die Option Vorzeitiges Beenden aktivieren. Diese hat keine Auswirkungen.

    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 Schritten wird gezeigt, wie Sie mit der Google Cloud CLI eine HyperparameterTuningJob mit einer relativ minimalen Konfiguration erstellen. Informationen zu allen Konfigurationsoptionen, die Sie für diese Aufgabe verwenden können, finden Sie in der Referenzdokumentation zum Befehl gcloud ai hp-tuning-jobs create und zur HyperparameterTuningJob API-Ressource.

  1. Erstellen Sie eine YAML-Datei mit dem Namen config.yaml und einigen API-Feldern, die Sie für den neuen HyerparameterTuningJob angeben möchten:

    config.yaml
    studySpec:
      metrics:
      - metricId: METRIC_ID
        goal: METRIC_GOAL
      parameters:
      - parameterId: HYPERPARAMETER_ID
        doubleValueSpec:
          minValue: DOUBLE_MIN_VALUE
          maxValue: DOUBLE_MAX_VALUE
    trialJobSpec:
      workerPoolSpecs:
        - machineSpec:
            machineType: MACHINE_TYPE
          replicaCount: 1
          containerSpec:
            imageUri: CUSTOM_CONTAINER_IMAGE_URI
    

    Dabei gilt:

    • METRIC_ID: der Name eines Hyperparameter-Messwerts, der optimiert werden soll. Der Trainingscode muss diesen Messwert melden, wenn er ausgeführt wird.

    • METRIC_GOAL: das Ziel für Ihren Hyperparameter-Messwert, entweder MAXIMIZE oder MINIMIZE.

    • HYPERPARAMETER_ID: der Name eines abzustimmenden Hyperparameters. Der Trainingscode muss ein Befehlszeilen-Flag mit diesem Namen parsen. In diesem Beispiel muss der Hyperparameter Gleitkommawerte verwenden. Weitere Informationen zu anderen Hyperparameter-Datentypen.

    • DOUBLE_MIN_VALUE: der Mindestwert (eine Zahl), den Vertex AI für diesen Hyperparameter ausprobieren soll.

    • DOUBLE_MAX_VALUE: der Höchstwert (eine Zahl), den Vertex AI für diesen Hyperparameter ausprobieren soll.

    • MACHINE_TYPE: der VM-Typ, der für das Training verwendet werden soll.

    • CUSTOM_CONTAINER_IMAGE_URI: der URI eines Docker-Container-Image mit Ihrem Trainingscode. Beachten Sie die Informationen zum Erstellen von benutzerdefinierten Container-Images.

      Für dieses Beispiel müssen Sie einen benutzerdefinierten Container verwenden. HyperparameterTuningJob-Ressourcen unterstützen auch Trainingscode in einer Python-Quelldistribution anstelle eines benutzerdefinierten Containers.

  2. Führen Sie im selben Verzeichnis wie Ihre config.yaml-Datei den folgenden Shell-Befehl aus:

    gcloud ai hp-tuning-jobs create \
        --region=LOCATION \
        --display-name=DISPLAY_NAME \
        --max-trial-count=MAX_TRIAL_COUNT \
        --parallel-trial-count=PARALLEL_TRIAL_COUNT \
        --config=config.yaml
    

    Dabei gilt:

REST

Mit dem folgenden Codebeispiel können Sie einen Hyperparameter-Abstimmungsjob mit der Methode create der Ressource hyperparameterTuningJob erstellen.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: die Region, in der Sie die HyperparameterTuningJob erstellen möchten. Verwenden Sie eine Region, die benutzerdefiniertes Training unterstützt.
  • PROJECT: Ihre Projekt-ID.
  • DISPLAY_NAME: ein einprägsamer Anzeigename Ihrer Wahl für den HyperparameterTuningJob. Informationen zu den Anforderungen für Ressourcennamen.
  • Damit legen Sie Messwerte fest:
    • METRIC_ID: der Name eines Hyperparameter-Messwerts, der optimiert werden soll. Der Trainingscode muss diesen Messwert melden, wenn er ausgeführt wird.
    • METRIC_GOAL: das Ziel für Ihren Hyperparameter-Messwert, entweder MAXIMIZE oder MINIMIZE.
  • Damit legen Sie Hyperparameter fest:
    • HYPERPARAMETER_ID: der Name eines abzustimmenden Hyperparameters. Der Trainingscode muss ein Befehlszeilen-Flag mit diesem Namen parsen.
    • PARAMETER_SCALE: (Optional) Skalierungsart des Parameters. Lassen Sie das Feld für CATEGORICAL-Parameter leer. Kann UNIT_LINEAR_SCALE, UNIT_LOG_SCALE, UNIT_REVERSE_LOG_SCALE oder SCALE_TYPE_UNSPECIFIED sein.
    • Wenn der Typ dieses Hyperparameters DOUBLE ist, geben Sie die Mindest- (DOUBLE_MIN_VALUE) und Höchstwerte (DOUBLE_MAX_VALUE) für diesen Hyperparameter an.
    • Wenn der Typ dieses Hyperparameters INTEGER ist, geben Sie die Mindest- (INTEGER_MIN_VALUE) und Höchstwerte (INTEGER_MAX_VALUE) für diesen Hyperparameter an.
    • Wenn der Typ dieses Hyperparameters CATEGORICAL ist, geben Sie die zulässigen Werte (CATEGORICAL_VALUES) als Array von Strings an.
    • Wenn der Typ dieses Hyperparameters DISCRETE ist, geben Sie die zulässigen Werte (DISCRETE_VALUES) als Array von Zahlen an.
    • Legen Sie bedingte Hyperparameter fest. Bedingte Hyperparameter werden einem Test hinzugefügt, wenn der Wert des übergeordneten Hyperparameters der von Ihnen angegebenen Bedingung entspricht. Weitere Informationen zu bedingten Hyperparametern finden Sie in diesem Artikel.
      • CONDITIONAL_PARAMETER: Die ParameterSpec des bedingten Parameters. Diese Spezifikation enthält den Namen, die Skalierung und den Wertebereich des Parameters sowie alle bedingten Parameter, die von diesem Hyperparameter abhängen.
      • Wenn der Typ des übergeordneten Hyperparameters INTEGER ist, geben Sie eine Liste ganzer Zahlen als INTEGERS_TO_MATCH an. Wenn der Wert des übergeordneten Hyperparameters mit einem der angegebenen Werte übereinstimmt, wird dieser bedingte Parameter dem Test hinzugefügt.
      • Wenn der Typ des übergeordneten Hyperparameters CATEGORICAL ist, geben Sie eine Liste von Kategorien als CATEGORIES_TO_MATCH an. Wenn der Wert des übergeordneten Hyperparameters mit einem der angegebenen Werte übereinstimmt, wird dieser bedingte Parameter dem Test hinzugefügt.
      • Wenn der Typ des übergeordneten Hyperparameters DISCRETE ist, geben Sie eine Liste ganzer Zahlen als DISCRETE_VALUES_TO_MATCH an. Wenn der Wert des übergeordneten Hyperparameters mit einem der angegebenen Werte übereinstimmt, wird dieser bedingte Parameter dem Test hinzugefügt.
  • ALGORITHM: (Optional) Der Suchalgorithmus, der in diesem Hyperparameter-Abstimmungsjob verwendet werden soll. Kann ALGORITHM_UNSPECIFIED, GRID_SEARCH oder RANDOM_SEARCH sein.
  • MAX_TRIAL_COUNT: die maximale Anzahl von Tests, die ausgeführt werden können.
  • PARALLEL_TRIAL_COUNT: die maximale Anzahl von Tests, die parallel ausgeführt werden können.
  • MAX_FAILED_TRIAL_COUNT: Die Anzahl der Jobs, die fehlschlagen können, bevor der Hyperparameter-Abstimmungsjob fehlschlägt.
  • Damit definieren Sie den benutzerdefinierten Trainingsjob:
    • MACHINE_TYPE: der VM-Typ, der für das Training verwendet werden soll.
    • ACCELERATOR_TYPE: (Optional) Der Typ des Beschleuniger, der an jeden Test angehängt werden soll.
    • ACCELERATOR_COUNT: (Optional) Die Anzahl der Beschleuniger, die an jeden Test angehängt werden sollen.
    • REPLICA_COUNT: Die Anzahl der Worker-Replikate, die pro Test verwendet werden sollen.
    • Wenn Ihre Trainingsanwendung in einem benutzerdefinierten Container ausgeführt wird, geben Sie Folgendes an:
      • CUSTOM_CONTAINER_IMAGE_URI: der URI eines Docker-Container-Image mit Ihrem Trainingscode. Beachten Sie die Informationen zum Erstellen von benutzerdefinierten Container-Images.
      • 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. Weitere Informationen zu vordefinierten Containern für das Training finden Sie in diesem Artikel.
      • PYTHON_PACKAGE_URIS: Der Cloud Storage-Speicherort der Python-Paketdateien, die das Trainingsprogramm und dessen abhängige Pakete sind. Die maximale Anzahl der Paket-URIs beträgt 100.
      • PYTHON_MODULE: Der Name des Python-Moduls, das nach der Installation der Pakete ausgeführt werden soll.
      • PYTHON_PACKAGE_ARGS: (Optional) Befehlszeilenargumente, die an das Python-Modul übergeben werden sollen.
    • SERVICE_ACCOUNT: (Optional) Das Dienstkonto, das Vertex AI zum Ausführen Ihres Codes verwendet. Weitere Informationen zum Anhängen eines benutzerdefinierten Dienstkontos.
    • TIMEOUT: (Optional) Maximale Ausführungszeit für jeden Test.
  • Geben Sie LABEL_NAME und LABEL_VALUE für alle Labels an, die Sie auf diesen Hyperparameter-Abstimmungsjob anwenden möchten.

HTTP-Methode und URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/hyperparameterTuningJobs

JSON-Text anfordern:

{
  "displayName": DISPLAY_NAME,
  "studySpec": {
    "metrics": [
      {
        "metricId": METRIC_ID,
        "goal": METRIC_GOAL
      }
    ],
    "parameters": [
      {
        "parameterId": PARAMETER_ID,
        "scaleType": PARAMETER_SCALE,

        // Union field parameter_value_spec can be only one of the following:
        "doubleValueSpec": {
            "minValue": DOUBLE_MIN_VALUE,
            "maxValue": DOUBLE_MAX_VALUE
        },
        "integerValueSpec": {
            "minValue": INTEGER_MIN_VALUE,
            "maxValue": INTEGER_MAX_VALUE
        },
        "categoricalValueSpec": {
            "values": [
              CATEGORICAL_VALUES
            ]
        },
        "discreteValueSpec": {
            "values": [
              DISCRETE_VALUES
            ]
        }
        // End of list of possible types for union field parameter_value_spec.

        "conditionalParameterSpecs": [
            "parameterSpec": {
              CONDITIONAL_PARAMETER
            }

            // Union field parent_value_condition can be only one of the following:
            "parentIntValues": {
                "values": [INTEGERS_TO_MATCH]
            }
            "parentCategoricalValues": {
                "values": [CATEGORIES_TO_MATCH]
            }
            "parentDiscreteValues": {
                "values": [DISCRETE_VALUES_TO_MATCH]
            }
            // End of list of possible types for union field parent_value_condition.
        ]
      }
    ],
    "ALGORITHM": ALGORITHM
  },
  "maxTrialCount": MAX_TRIAL_COUNT,
  "parallelTrialCount": PARALLEL_TRIAL_COUNT,
  "maxFailedTrialCount": MAX_FAILED_TRIAL_COUNT,
  "trialJobSpec": {
      "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // 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.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      },
      "serviceAccount": SERVICE_ACCOUNT
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

{
  "name": "projects/12345/locations/us-central1/hyperparameterTuningJobs/6789",
  "displayName": "myHyperparameterTuningJob",
  "studySpec": {
    "metrics": [
      {
        "metricId": "myMetric",
        "goal": "MINIMIZE"
      }
    ],
    "parameters": [
      {
        "parameterId": "myParameter1",
        "integerValueSpec": {
          "minValue": "1",
          "maxValue": "128"
        },
        "scaleType": "UNIT_LINEAR_SCALE"
      },
      {
        "parameterId": "myParameter2",
        "doubleValueSpec": {
          "minValue": 1e-07,
          "maxValue": 1
        },
        "scaleType": "UNIT_LINEAR_SCALE"
      }
    ],
    "ALGORITHM": "RANDOM_SEARCH"
  },
  "maxTrialCount": 20,
  "parallelTrialCount": 1,
  "trialJobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-4"
        },
        "replicaCount": "1",
        "pythonPackageSpec": {
          "executorImageUri": "us-docker.pkg.dev/vertex-ai/training/training-tf-cpu.2-1:latest",
          "packageUris": [
            "gs://my-bucket/my-training-application/trainer.tar.bz2"
          ],
          "pythonModule": "my-trainer.trainer"
        }
      }
    ]
  }
}

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie den Java-Einrichtungsschritten in der Vertex AI-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI Java API.

Richten Sie zur Authentifizierung bei Vertex AI Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

import com.google.cloud.aiplatform.v1.AcceleratorType;
import com.google.cloud.aiplatform.v1.CustomJobSpec;
import com.google.cloud.aiplatform.v1.HyperparameterTuningJob;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.PythonPackageSpec;
import com.google.cloud.aiplatform.v1.StudySpec;
import com.google.cloud.aiplatform.v1.StudySpec.MetricSpec;
import com.google.cloud.aiplatform.v1.StudySpec.MetricSpec.GoalType;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ConditionalParameterSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ConditionalParameterSpec.DiscreteValueCondition;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.DiscreteValueSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.DoubleValueSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ScaleType;
import com.google.cloud.aiplatform.v1.WorkerPoolSpec;
import java.io.IOException;
import java.util.Arrays;

public class CreateHyperparameterTuningJobPythonPackageSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";
    String executorImageUri = "EXECUTOR_IMAGE_URI";
    String packageUri = "PACKAGE_URI";
    String pythonModule = "PYTHON_MODULE";
    createHyperparameterTuningJobPythonPackageSample(
        project, displayName, executorImageUri, packageUri, pythonModule);
  }

  static void createHyperparameterTuningJobPythonPackageSample(
      String project,
      String displayName,
      String executorImageUri,
      String packageUri,
      String pythonModule)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (JobServiceClient client = JobServiceClient.create(settings)) {
      // study spec
      MetricSpec metric =
          MetricSpec.newBuilder().setMetricId("val_rmse").setGoal(GoalType.MINIMIZE).build();

      // decay
      DoubleValueSpec doubleValueSpec =
          DoubleValueSpec.newBuilder().setMinValue(1e-07).setMaxValue(1).build();
      ParameterSpec parameterDecaySpec =
          ParameterSpec.newBuilder()
              .setParameterId("decay")
              .setDoubleValueSpec(doubleValueSpec)
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .build();
      Double[] decayValues = {32.0, 64.0};
      DiscreteValueCondition discreteValueDecay =
          DiscreteValueCondition.newBuilder().addAllValues(Arrays.asList(decayValues)).build();
      ConditionalParameterSpec conditionalParameterDecay =
          ConditionalParameterSpec.newBuilder()
              .setParameterSpec(parameterDecaySpec)
              .setParentDiscreteValues(discreteValueDecay)
              .build();

      // learning rate
      ParameterSpec parameterLearningSpec =
          ParameterSpec.newBuilder()
              .setParameterId("learning_rate")
              .setDoubleValueSpec(doubleValueSpec) // Use the same min/max as for decay
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .build();

      Double[] learningRateValues = {4.0, 8.0, 16.0};
      DiscreteValueCondition discreteValueLearning =
          DiscreteValueCondition.newBuilder()
              .addAllValues(Arrays.asList(learningRateValues))
              .build();
      ConditionalParameterSpec conditionalParameterLearning =
          ConditionalParameterSpec.newBuilder()
              .setParameterSpec(parameterLearningSpec)
              .setParentDiscreteValues(discreteValueLearning)
              .build();

      // batch size
      Double[] batchSizeValues = {4.0, 8.0, 16.0, 32.0, 64.0, 128.0};

      DiscreteValueSpec discreteValueSpec =
          DiscreteValueSpec.newBuilder().addAllValues(Arrays.asList(batchSizeValues)).build();
      ParameterSpec parameter =
          ParameterSpec.newBuilder()
              .setParameterId("batch_size")
              .setDiscreteValueSpec(discreteValueSpec)
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .addConditionalParameterSpecs(conditionalParameterDecay)
              .addConditionalParameterSpecs(conditionalParameterLearning)
              .build();

      // trial_job_spec
      MachineSpec machineSpec =
          MachineSpec.newBuilder()
              .setMachineType("n1-standard-4")
              .setAcceleratorType(AcceleratorType.NVIDIA_TESLA_T4)
              .setAcceleratorCount(1)
              .build();

      PythonPackageSpec pythonPackageSpec =
          PythonPackageSpec.newBuilder()
              .setExecutorImageUri(executorImageUri)
              .addPackageUris(packageUri)
              .setPythonModule(pythonModule)
              .build();

      WorkerPoolSpec workerPoolSpec =
          WorkerPoolSpec.newBuilder()
              .setMachineSpec(machineSpec)
              .setReplicaCount(1)
              .setPythonPackageSpec(pythonPackageSpec)
              .build();

      StudySpec studySpec =
          StudySpec.newBuilder()
              .addMetrics(metric)
              .addParameters(parameter)
              .setAlgorithm(StudySpec.Algorithm.RANDOM_SEARCH)
              .build();
      CustomJobSpec trialJobSpec =
          CustomJobSpec.newBuilder().addWorkerPoolSpecs(workerPoolSpec).build();
      // hyperparameter_tuning_job
      HyperparameterTuningJob hyperparameterTuningJob =
          HyperparameterTuningJob.newBuilder()
              .setDisplayName(displayName)
              .setMaxTrialCount(4)
              .setParallelTrialCount(2)
              .setStudySpec(studySpec)
              .setTrialJobSpec(trialJobSpec)
              .build();
      LocationName parent = LocationName.of(project, location);
      HyperparameterTuningJob response =
          client.createHyperparameterTuningJob(parent, hyperparameterTuningJob);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }
}

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.

from google.cloud import aiplatform

from google.cloud.aiplatform import hyperparameter_tuning as hpt


def create_hyperparameter_tuning_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    container_uri: str,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    worker_pool_specs = [
        {
            "machine_spec": {
                "machine_type": "n1-standard-4",
                "accelerator_type": "NVIDIA_TESLA_K80",
                "accelerator_count": 1,
            },
            "replica_count": 1,
            "container_spec": {
                "image_uri": container_uri,
                "command": [],
                "args": [],
            },
        }
    ]

    custom_job = aiplatform.CustomJob(
        display_name='custom_job',
        worker_pool_specs=worker_pool_specs,
    )

    hpt_job = aiplatform.HyperparameterTuningJob(
        display_name=display_name,
        custom_job=custom_job,
        metric_spec={
            'loss': 'minimize',
        },
        parameter_spec={
            'lr': hpt.DoubleParameterSpec(min=0.001, max=0.1, scale='log'),
            'units': hpt.IntegerParameterSpec(min=4, max=128, scale='linear'),
            'activation': hpt.CategoricalParameterSpec(values=['relu', 'selu']),
            'batch_size': hpt.DiscreteParameterSpec(values=[128, 256], scale='linear')
        },
        max_trial_count=128,
        parallel_trial_count=8,
        labels={'my_key': 'my_value'},
    )

    hpt_job.run()

    print(hpt_job.resource_name)
    return hpt_job

Konfiguration des Hyperparameter-Trainingsjobs

Hyperparameter-Abstimmungsjobs suchen nach der besten Kombination von Hyperparametern, mit der Ihre Messwerte optimiert werden können. Die Jobs führen dazu mehrere Tests Ihrer Trainingsanwendung mit verschiedenen Sätzen von Hyperparametern aus.

Wenn Sie einen Hyperparameter-Abstimmungsjob konfigurieren, müssen Sie die folgenden Details angeben:

Anzahl der Tests begrenzen

Legen Sie fest, wie viele Tests der Dienst maximal ausführen darf. Geben Sie dazu im Objekt HyperparameterTuningJob einen Wert für maxTrialCount an.

Beim Festlegen der zulässigen Tests müssen Sie zwei Faktoren gegeneinander abwägen:

  • Zeit (und damit Kosten)
  • Genauigkeit

Die Erhöhung der Anzahl der Tests führt in der Regel zu besseren Ergebnissen, aber dies ist nicht immer so. In den meisten Fällen gibt es einen Punkt, ab dem rückläufige Ergebnisse geliefert werden und zusätzliche Tests danach wenig oder keinen Einfluss auf die Genauigkeit haben. Bevor Sie einen Job mit einer großen Anzahl an Tests starten, sollten Sie mit einer kleinen Anzahl an Tests beginnen, um zu prüfen, wie sich die gewählten Hyperparameter auf die Genauigkeit Ihres Modells auswirken.

Der maximale Wert sollte nicht niedriger als das Zehnfache der Anzahl der Hyperparameter sein, die Sie verwenden, um die Hyperparameter-Abstimmung optimal zu nutzen.

Parallele Tests

Sie können festlegen, wie viele Tests sich parallel ausführen lassen. Dazu geben Sie parallelTrialCount im HyperparameterTuningJob an.

Das parallele Ausführen von Tests hat den Vorteil, dass die Dauer des Trainingsjobs reduziert wird (Echtzeit – die erforderliche Gesamtverarbeitungszeit ändert sich in der Regel nicht). Das parallele Ausführen kann jedoch die Effektivität des Abstimmungsjobs insgesamt reduzieren. Grund hierfür ist, dass die Hyperparameter-Abstimmung die Ergebnisse vorheriger Versuche verwendet, um die Werte anzugeben, die den Hyperparametern in zukünftigen Versuchen zugewiesen werden sollen. Bei der Parallelausführung starten einige Tests, ohne den Vorteil der Ergebnisse noch laufender Tests zu nutzen.

Wenn Sie parallele Test verwenden, stellt der Dienst für die Hyperparameter-Abstimmung mehrere Trainingsverarbeitungscluster (oder mehrere Einzelmaschinen im Falle einer Einzelprozess-Trainingsanwendung) bereit. Die Jobpoolspezifikation, die Sie für Ihren Job festgelegt haben, wird für jeden einzelnen Trainingscluster verwendet.

Fehlgeschlagene Tests verarbeiten

Wenn die Tests Ihrer Hyperparameter-Abstimmung mit Fehlern enden, sollten Sie den Trainingsjob vorzeitig beenden. Legen Sie dazu für das Feld maxFailedTrialCount im Objekt HyperparameterTuningJob die Anzahl der fehlgeschlagenen Tests fest, die Sie zulassen möchten. Nachdem diese Anzahl von Tests fehlgeschlagen ist, beendet Vertex AI den Trainingsjob. Der Wert maxFailedTrialCount muss kleiner oder gleich maxTrialCount sein.

Wenn Sie maxFailedTrialCount nicht oder auf 0 festlegen, wendet Vertex AI auf fehlgeschlagene Tests folgende Regeln an:

  • Wenn der erste Test Ihres Jobs fehlschlägt, beendet Vertex AI den Job sofort. Ein fehlgeschlagener erster Test lässt vermuten, dass in Ihrem Trainingscode ein Problem vorliegt und nachfolgende Tests vermutlich ebenfalls fehlschlagen werden. Durch Beenden des Jobs können Sie das Problem diagnostizieren, ohne auf weitere Tests zu warten und ohne zusätzliche Kosten zu verursachen.
  • Wenn der erste Test erfolgreich ist, kann Vertex AI den Job bei Fehlern in nachfolgenden Tests aufgrund eines der folgenden Kriterien beenden:
    • Die Anzahl der fehlgeschlagenen Tests ist zu hoch.
    • Der Anteil der fehlgeschlagenen Tests gegenüber den erfolgreichen Tests ist zu hoch.

Diese Regeln können sich ändern. Wenn Sie ein bestimmtes Verhalten erzwingen möchten, legen Sie das Feld maxFailedTrialCount fest.

Hyperparameter-Abstimmungsjobs verwalten

In den folgenden Abschnitten wird gezeigt, wie Sie Ihre Hyperparameter-Abstimmungsjobs verwalten.

Informationen zu einem Hyperparameter-Abstimmungsjob abrufen

Die folgenden Codebeispiele zeigen, wie Sie einen Hyperparameter-Abstimmungsjob abrufen.

gcloud

Führen Sie folgenden gcloud ai hp-tuning-jobs describe-Befehl aus:

gcloud ai hp-tuning-jobs describe ID_OR_NAME \
    --region=LOCATION

Dabei gilt:

  • ID_OR_NAME: entweder der Name oder die numerische ID von HyperparameterTuningJob. (Die ID ist der letzte Teil des Namens.)

    Möglicherweise haben Sie die ID oder den Namen beim Erstellen des HyperparameterTuningJob angezeigt. Wenn Sie die ID oder den Namen nicht kennen, können Sie den Befehl gcloud ai hp-tuning-jobs list ausführen und nach der entsprechenden Ressource suchen.

  • LOCATION: die Region, in der der HyperparameterTuningJob erstellt wurde.

REST

Mit dem folgenden Codebeispiel können Sie einen Hyperparameter-Abstimmungsjob mit der Methode get der Ressource hyperparameterTuningJob abrufen.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: die Region, in der der HyperparameterTuningJob erstellt wurde.
  • NAME: der Name des Hyperparameter-Abstimmungsjobs. Der Jobname hat folgendes Format: projects/{project}/LOCATIONS/{LOCATION}/hyperparameterTuningJobs/{hyperparameterTuningJob}.

HTTP-Methode und URL:

GET https://LOCATION-aiplatform.googleapis.com/v1/NAME

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

{
  "name": "projects/12345/LOCATIONs/us-central1/hyperparameterTuningJobs/6789",
  "displayName": "my-hyperparameter-tuning-job",
  "studySpec": {
    "metrics": [
      {
        "metricId": "my_metric",
        "goal": "MINIMIZE"
      }
    ],
    "parameters": [
      {
        "parameterId": "my_parameter",
        "doubleValueSpec": {
          "minValue": 1e-05,
          "maxValue": 1
        }
      }
    ]
  },
  "maxTrialCount": 3,
  "parallelTrialCount": 1,
  "trialJobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-4"
        },
        "replicaCount": "1",
        "pythonPackageSpec": {
          "executorImageUri": "us-docker.pkg.dev/vertex-ai/training/training-tf-cpu.2-1:latest",
          "packageUris": [
            "gs://my-bucket/my-training-application/trainer.tar.bz2"
          ],
          "pythonModule": "my-trainer.trainer"
        }
      }
    ]
  },
  "trials": [
    {
      "id": "2",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.71426874725564571
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30007445812225342
          }
        ]
      },
      "startTime": "2020-09-09T23:39:15.549112551Z",
      "endTime": "2020-09-09T23:47:08Z"
    },
    {
      "id": "3",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.3078893356622992
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30000102519989014
          }
        ]
      },
      "startTime": "2020-09-09T23:49:22.451699360Z",
      "endTime": "2020-09-09T23:57:15Z"
    },
    {
      "id": "1",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.500005
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30005377531051636
          }
        ]
      },
      "startTime": "2020-09-09T23:23:12.283374629Z",
      "endTime": "2020-09-09T23:36:56Z"
    }
  ],
  "state": "JOB_STATE_SUCCEEDED",
  "createTime": "2020-09-09T23:22:31.777386Z",
  "startTime": "2020-09-09T23:22:34Z",
  "endTime": "2020-09-10T01:31:24.271307Z",
  "updateTime": "2020-09-10T01:31:24.271307Z"
}

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie den Java-Einrichtungsschritten in der Vertex AI-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI Java API.

Richten Sie zur Authentifizierung bei Vertex AI Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

import com.google.cloud.aiplatform.v1.HyperparameterTuningJob;
import com.google.cloud.aiplatform.v1.HyperparameterTuningJobName;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import java.io.IOException;

public class GetHyperparameterTuningJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String hyperparameterTuningJobId = "HYPERPARAMETER_TUNING_JOB_ID";
    getHyperparameterTuningJobSample(project, hyperparameterTuningJobId);
  }

  static void getHyperparameterTuningJobSample(String project, String hyperparameterTuningJobId)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (JobServiceClient client = JobServiceClient.create(settings)) {
      HyperparameterTuningJobName name =
          HyperparameterTuningJobName.of(project, location, hyperparameterTuningJobId);
      HyperparameterTuningJob response = client.getHyperparameterTuningJob(name);
      System.out.format("response: %s\n", response);
    }
  }
}

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.

# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from google.cloud import aiplatform


def get_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    return hpt_job


Hyperparameter-Abstimmungsjob abbrechen

Die folgenden Codebeispiele zeigen, wie Sie einen Hyperparameter-Abstimmungsjob abbrechen.

gcloud

Führen Sie folgenden gcloud ai hp-tuning-jobs cancel-Befehl aus:

gcloud ai hp-tuning-jobs cancel ID_OR_NAME \
    --region=LOCATION

Dabei gilt:

  • ID_OR_NAME: entweder der Name oder die numerische ID von HyperparameterTuningJob. (Die ID ist der letzte Teil des Namens.)

    Möglicherweise haben Sie die ID oder den Namen beim Erstellen des HyperparameterTuningJob angezeigt. Wenn Sie die ID oder den Namen nicht kennen, können Sie den Befehl gcloud ai hp-tuning-jobs list ausführen und nach der entsprechenden Ressource suchen.

  • LOCATION: die Region, in der der HyperparameterTuningJob erstellt wurde.

REST

Mit dem folgenden Codebeispiel können Sie einen Hyperparameter-Abstimmungsjob mit der Methode cancel der Ressource hyperparameterTuningJob abbrechen.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: die Region, in der der HyperparameterTuningJob erstellt wurde.
  • NAME: der Name des Hyperparameter-Abstimmungsjobs. Der Jobname hat folgendes Format: projects/{project}/locations/{location}/hyperparameterTuningJobs/{hyperparameterTuningJob}.

HTTP-Methode und URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/NAME:cancel

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten einen erfolgreichen Statuscode (2xx) und eine leere Antwort als Ausgabe erhalten.

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.

from google.cloud import aiplatform


def cancel_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    hpt_job.cancel()

Hyperparameter-Abstimmungsjob löschen

Mit den folgenden Codebeispielen wird veranschaulicht, wie Sie einen Hyperparameter-Abstimmungsjob mit dem Vertex AI SDK for Python und der REST API löschen.

REST

Mit dem folgenden Codebeispiel können Sie einen Hyperparameter-Abstimmungsjob mit der Methode delete der Ressource hyperparameterTuningJob löschen.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: Ihre Region.
  • NAME: der Name des Hyperparameter-Abstimmungsjobs. Der Jobname hat folgendes Format: projects/{project}/LOCATIONs/{LOCATION}/hyperparameterTuningJobs/{hyperparameterTuningJob}.

HTTP-Methode und URL:

DELETE https://LOCATION-aiplatform.googleapis.com/v1/NAME

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten einen erfolgreichen Statuscode (2xx) und eine leere Antwort als Ausgabe erhalten.

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.

from google.cloud import aiplatform


def delete_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    hpt_job.delete()

Nächste Schritte