Hyperparameter-Abstimmung verwenden

Auf dieser Seite erfahren Sie, wie Sie die Hyperparameter-Abstimmung von AI Platform Training beim Training Ihres Modells verwenden. Durch Hyperparameter-Abstimmung wird eine von Ihnen angegebene Zielvariable optimiert. Die Zielvariable wird als Hyperparameter-Messwert bezeichnet. Wenn Sie einen Job mit Hyperparameter-Abstimmung starten, legen Sie den Namen Ihres Hyperparameter-Messwerts fest. Dies ist der Name, den Sie der skalaren Zusammenfassung zuordnen, die Sie Ihrer Trainingsanwendung hinzufügen.

Schritte der Hyperparameter-Abstimmung

Gehen Sie so vor, um die Hyperparameter-Abstimmung in einem Trainingsjob zu verwenden:

  1. Legen Sie die Konfiguration der Hyperparameter-Abstimmung für Ihren Trainingsjob fest. Fügen Sie dazu ein HyperparameterSpec-Objekt in das Objekt TrainingInput ein.

  2. Fügen Sie der Trainingsanwendung folgenden Code hinzu:

    • Parsen Sie die Befehlszeilenargumente, die die abzustimmenden Hyperparameter darstellen, und verwenden Sie die Werte, um die Hyperparameter für Ihren Trainingstest festzulegen.
    • Fügen Sie Ihren Hyperparameter-Messwert zur Zusammenfassung für Ihre Grafik hinzu.

Im Folgenden finden Sie nähere Angaben zu den einzelnen Schritten.

Konfiguration der Hyperparameter-Abstimmung für einen Trainingsjob festlegen

Erstellen Sie ein HyperparameterSpec-Objekt mit der Konfiguration der Hyperparameter-Abstimmung für Ihren Trainingsjob und fügen Sie HyperparameterSpec als hyperparameters-Objekt in das Objekt TrainingInput ein.

Der Hyperparameter-Abstimmungsjob erstellt Testjobs. Wenn Sie den Trainingsjobprozess beschleunigen möchten, können Sie im Objekt TrainingInput einen benutzerdefinierten Maschinentyp angeben. Wenn Sie beispielsweise Testjobs mit jedem Testjob mit n1-standard-8-VMs erstellen möchten, können Sie masterType als n1-standard-8 angeben und die Worker-Konfiguration leer lassen.

Legen Sie in HyperparameterSpec einen Wert für hyperparameterMetricTag fest, der den von Ihnen ausgewählten Messwert darstellt. Wenn Sie keinen Wert für hyperparameterMetricTag angeben, sucht AI Platform Training nach einem Messwert mit dem Namen training/hptuning/metric. Das folgende Beispiel zeigt, wie Sie eine Konfiguration für einen Messwert mit dem Namen metric1 erstellen:

gcloud

Fügen Sie Ihre Hyperparameter-Konfigurationsinformationen zu Ihrer YAML-Konfigurationsdatei hinzu. Ein Beispiel dafür sehen Sie unten. Eine funktionsfähige Konfigurationsdatei finden Sie unter hptuning_config.yaml im Beispiel mit den Erhebungsdaten.

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    goal: MAXIMIZE
    hyperparameterMetricTag: metric1
    maxTrials: 30
    maxParallelTrials: 1
    enableTrialEarlyStopping: True
    params:
    - parameterName: hidden1
      type: INTEGER
      minValue: 40
      maxValue: 400
      scaleType: UNIT_LINEAR_SCALE
    - parameterName: numRnnCells
      type: DISCRETE
      discreteValues:
      - 1
      - 2
      - 3
      - 4
    - parameterName: rnnCellType
      type: CATEGORICAL
      categoricalValues:
      - BasicLSTMCell
      - BasicRNNCell
      - GRUCell
      - LSTMCell
      - LayerNormBasicLSTMCell

Python

Erstellen Sie ein Wörterbuch für HyperparameterSpec und fügen Sie es Ihrer Trainingseingabe hinzu. Im folgenden Beispiel wird angenommen, dass Sie bereits ein TrainingInput-Wörterbuch erstellt haben (in diesem Fall training_inputs), wie in der Anleitung zur Trainingsjobkonfiguration gezeigt.

# Add hyperparameter tuning to the job config.
hyperparams = {
    'goal': 'MAXIMIZE',
    'hyperparameterMetricTag': 'metric1',
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'enableTrialEarlyStopping': True,
    'params': []}

hyperparams['params'].append({
    'parameterName':'hidden1',
    'type':'INTEGER',
    'minValue': 40,
    'maxValue': 400,
    'scaleType': 'UNIT_LINEAR_SCALE'})

hyperparams['params'].append({
    'parameterName':'numRnnCells',
    'type':'DISCRETE',
    'discreteValues': [1, 2, 3, 4]})

hyperparams['params'].append({
    'parameterName':'rnnCellType',
    'type': 'CATEGORICAL',
    'categoricalValues': [
        'BasicLSTMCell',
        'BasicRNNCell',
        'GRUCell',
        'LSTMCell',
        'LayerNormBasicLSTMCell'
    ]
})

# Add hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

Code in der Trainingsanwendung prüfen

Bearbeiten Sie in Ihrer Anwendung die Befehlszeilenargumente für die Hyperparameter und melden Sie Ihren Hyperparameter-Messwert an AI Platform Training.

Befehlszeilenargumente für die abzustimmenden Hyperparameter bearbeiten

AI Platform Training legt beim Aufruf 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 es mit einem Argument-Parser Ihrer Wahl (in der Regel argparse). Die Argumentnamen müssen mit den Parameternamen übereinstimmen, die Sie in der Jobkonfiguration angegeben haben, wie oben beschrieben.

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

Hyperparameter-Messwert an AI Platform Training melden

Wie Sie den Hyperparameter-Messwert an den AI Platform Training-Dienst melden, hängt davon ab, ob Sie TensorFlow für das Training verwenden oder nicht. Es hängt auch davon ab, ob Sie eine Laufzeitversion oder einen benutzerdefinierten Container für das Training verwenden.

Wir empfehlen, dass Ihr Trainingscode Ihre Hyperparameter-Messwerte häufig an AI Platform Training meldet, um die Vorteile von vorzeitigem Beenden zu nutzen.

TensorFlow mit Laufzeitversion

Wenn Sie eine Laufzeitversion von AI Platform Training verwenden und mit TensorFlow trainieren, können Sie den Hyperparameter-Messwert an AI Platform Training melden. Schreiben Sie dafür den Messwert in eine TensorFlow-Zusammenfassung. Verwenden Sie eine der folgenden Funktionen:

Wenn Sie eine andere TensorFlow API verwenden, die wie im folgenden Estimator-Beispiel eine der vorhergehenden Funktionen aufruft, wird auch der Hyperparameter-Messwert an AI Platform Training gemeldet.

Die folgenden zwei grundlegenden Beispiele zeigen, wie man Hyperparameter-Messwerte in eine Zusammenfassung schreiben kann. Bei beiden Beispielen wird davon ausgegangen, dass Sie ein Regressionsmodell trainieren, und sie schreiben die Wurzel der mittleren Fehlerquadratsumme zwischen Ground Truth-Labels und Bewertungsvorhersagen als Hyperparameter-Messwert mit dem Namen metric1.

Keras

Im folgenden Beispiel wird ein benutzerdefinierter Keras-Callback verwendet, um am Ende jeder Trainingsphase eine skalare Zusammenfassung zu schreiben:

class MyMetricCallback(tf.keras.callbacks.Callback):

    def on_epoch_end(self, epoch, logs=None):
        tf.summary.scalar('metric1', logs['RootMeanSquaredError'], epoch)

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default()

model = tf.keras.Sequential(
    tf.keras.layers.Dense(1, activation='linear', input_dim=784))
model.compile(
    optimizer='rmsprop',
    loss='mean_squared_error',
    metrics=['RootMeanSquaredError'])

model.fit(
    x_train,
    y_train,
    batch_size=64,
    epochs=10,
    steps_per_epoch=5,
    verbose=0,
    callbacks=[MyMetricCallback()])

Estimator

Im folgenden Beispiel wird tf.estimator.add_metrics verwendet, um den Hyperparameter-Messwert der Zusammenfassung für die Grafik hinzuzufügen.

Die Estimators erstellen bei jeder Ausführung ihrer evaluate-Methode eine Grafikzusammenfassung. In diesem Beispiel wird tf.estimator.EvalSpec mit tf.estimator.train_and_evaluate verwendet, um den Estimator so zu konfigurieren, dass Zusammenfassungen alle 300 Sekunden während des Trainings ausgewertet und geschrieben werden.

# Create metric for hyperparameter tuning
def my_metric(labels, predictions):
    # Note that different types of estimator provide different different
    # keys on the predictions Tensor. predictions['predictions'] is for
    # regression output.
    pred_values = predictions['predictions']
    return {'metric1': tf.compat.v1.metrics.root_mean_squared_error(labels, pred_values)}

# Create estimator to train and evaluate
def train_and_evaluate(output_dir):

    estimator = tf.estimator.DNNLinearCombinedRegressor(...)

    estimator = tf.estimator.add_metrics(estimator, my_metric)

    train_spec = ...
    eval_spec = tf.estimator.EvalSpec(
        start_delay_secs = 60, # start evaluating after 60 seconds
        throttle_secs = 300,  # evaluate every 300 seconds
        ...)
    tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

Andere Frameworks für maschinelles Lernen oder benutzerdefinierte Container

Wenn Sie einen benutzerdefinierten Container zum Trainieren verwenden oder eine Hyperparameter-Abstimmung mit einem anderen Framework als TensorFlow durchführen möchten, müssen Sie das Python-Paket cloudml-hypertune verwenden, um Ihren Hyperparameter-Messwert an AI Platform Training zu melden.

Beispiel für cloudml-hypertune.

Details eines Hyperparameter-Abstimmungsjobs während der Ausführung abrufen

Sie können die Hyperparameter-Abstimmung überprüfen, indem Sie den detaillierten Status Ihres laufenden Trainingsjobs abrufen.

Im Objekt TrainingOutput in der Jobressource der Antwort sind die folgenden Werte während eines Trainingsjobs mit Hyperparameter-Abstimmung festgelegt:

  • isHyperparameterTuningJob ist auf True festgelegt.

  • trials ist vorhanden und enthält eine Liste von HyperparameterOutput-Objekten, eines pro Test.

Sie können die Test-ID auch aus der Umgebungsvariable TF_CONFIG abrufen. Weitere Informationen finden Sie in der Anleitung zum Abrufen von Details aus TF_CONFIG.

Ergebnisse der Hyperparameter-Abstimmung abrufen

Nach Abschluss der Trainingsläufe können Sie sich die Ergebnisse der einzelnen Tests in der Google Cloud Console ansehen. Alternativ haben Sie die Möglichkeit, projects.jobs.get aufzurufen, um die Ergebnisse zu erhalten. Das Objekt TrainingOutput in der Jobressource enthält die Messwerte für alle Läufe, wobei die Messwerte für den am besten abgestimmten Trainingslauf gekennzeichnet werden.

Verwenden Sie die gleiche detaillierte Statusanfrage wie für die laufende Überwachung des Jobs, um diese Informationen abzurufen.

Die Ergebnisse der einzelnen Tests sehen Sie in der Jobbeschreibung. In der Google Cloud Console können Sie Tests nach rmse, learning_rate und training steps filtern. Bestimmen Sie den Test, der den besten Wert für Ihren Hyperparameter-Messwert erzielt hat. Wenn der Test im Hinblick auf den Erfolg des Modells Ihren Anforderungen entspricht, können Sie die für diesen Test gezeigten Hyperparameter-Werte für nachfolgende Läufe Ihres Modells verwenden.

Manchmal liefern mehrere Tests identische Ergebnisse für Ihren Abstimmungsmesswert. In einem solchen Fall sollten Sie feststellen, welche der Hyperparameter-Werte aufgrund anderer Kriterien am vorteilhaftesten sind. Wenn Sie zum Beispiel die Knotenanzahl in einer versteckten Ebene abstimmen und identische Ergebnisse für den Wert 8 und den Wert 20 erhalten, sollten Sie 8 verwenden, da eine größere Knotenanzahl mit einem größeren Verarbeitungsvolumen und höheren Kosten einhergeht, ohne dass Verbesserungen des Modells erzielt werden.

Der Teststatus FAILED in HyperparameterOutput kann entweder bedeuten, dass das Training für diesen Test fehlgeschlagen ist, oder dass der Test den Hyperparameter-Feinabstimmungsmesswert nicht gemeldet hat. Im letzteren Fall kann der übergeordnete Job auch dann erfolgreich ausgeführt werden, wenn der Test fehlschlägt. Sie können das Testlog aufrufen, um zu sehen, ob das Training für die Testphase fehlgeschlagen ist.

Beschränkung für die Anzahl der Versuche festlegen

Sie sollten die Anzahl der Tests beschränken, die der Dienst maximal ausführen darf. Legen Sie dazu im Objekt HyperparameterSpec den Wert maxTrials fest.

Beim Festlegen der zulässigen Versuche 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 die Rückläufe verringert werden und anschließende zusätzliche Tests kaum noch Auswirkungen auf die Genauigkeit haben. Am besten beginnen Sie mit einer kleinen Anzahl von Tests, um die Auswirkung der gewählten Hyperparameter auf die Genauigkeit des Modells zu ermitteln, bevor Sie einen Job mit einer großen Anzahl von Tests starten.

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

Umgang mit fehlgeschlagenen Tests

Wenn die Tests Ihrer Hyperparameter-Abstimmung mit Fehlern enden, sollten Sie den Trainingsjob vorzeitig beenden. Setzen Sie dazu das Feld maxFailedTrials im Objekt HyperparameterSpec auf die Anzahl der fehlgeschlagenen Tests, die Sie zulassen möchten. Nachdem diese Anzahl von Tests fehlgeschlagen ist, beendet AI Platform Training den Trainingsjob. Der Wert maxFailedTrials muss kleiner oder gleich maxTrials sein.

Wenn Sie maxFailedTrials nicht oder auf 0 festlegen, wendet AI Platform Training folgende Regeln auf fehlgeschlagene Tests an:

  • Wenn der erste Test Ihres Jobs fehlschlägt, beendet AI Platform Training den Job sofort. Ein fehlgeschlagener erster Test lässt vermuten, dass in Ihrem Trainingscode ein Problem vorliegt und nachfolgende Tests vermutlich ebenfalls fehlschlagen werden. Das Beenden des Jobs gibt Ihnen die Möglichkeit, sofort mit der Problemdiagnose zu beginnen, ohne weitere Tests abzuwarten und zusätzliche Kosten zu verursachen.
  • Wenn der erste Test erfolgreich ist, kann AI Platform Training den Job nach Fehlern während der nachfolgenden Tests beenden, wenn eines der folgenden Kriterien erfüllt ist:
    • Die Anzahl der fehlgeschlagenen Tests ist zu hoch.
    • Der Anteil der fehlgeschlagenen Tests gegenüber den erfolgreichen Tests ist zu hoch.

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

Parallele Tests ausführen

Sie können festlegen, dass eine bestimmte Anzahl von Tests parallel ausgeführt wird. Legen Sie dazu im Objekt HyperparameterSpec einen Wert für maxParallelTrials fest.

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 Versuche verwenden, belegt der Trainingsdienst mehrere Trainingsverarbeitungscluster (oder mehrere Einzelmaschinen im Falle einer Einzelprozess-Trainingsanwendung). Die Skalierung, die Sie für Ihren Job eingestellt haben, wird für jeden einzelnen Trainingscluster verwendet.

Tests vorzeitig beenden

Sie können festlegen, dass AI Platform Training einen Test, dessen negativer Ausgang absehbar ist, automatisch beendet. Dies erspart Ihnen die Kosten für die Fortsetzung eines Tests, der wahrscheinlich nicht sinnvoll ist.

Wenn Sie das vorzeitige Beenden eines Tests zulassen möchten, legen Sie im Objekt HyperparameterSpec den Wert von enableTrialEarlyStopping auf TRUE fest.

Abgeschlossenen Hyperparameter-Abstimmungsjob fortsetzen

Sie können einen abgeschlossenen Hyperparameter-Abstimmungsjob fortsetzen, um von einem teilweise optimierten Zustand aus zu starten. Dies bietet die Möglichkeit, die im vorherigen Hyperparameter-Abstimmungsjob gewonnenen Kenntnisse wiederzuverwenden.

Wenn Sie einen Hyperparameter-Abstimmungsjob fortsetzen möchten, senden Sie einen neuen Hyperparameter-Abstimmungsjob mit folgender Konfiguration:

  • Legen Sie im Objekt HyperparameterSpec den Wert von resumePreviousJobId auf die Job-ID des vorherigen Tests fest.
  • Geben Sie Werte für maxTrials und maxParallelTrials an.

AI Platform Training sucht anhand der vorherigen Job-ID nach den Werten von goal, params und hyperparameterMetricTag und setzt den Hyperparameter-Abstimmungsjob mit diesen Werten fort.

Verwenden Sie für ähnliche Jobs einheitliche hyperparameterMetricTag-Namen und params, auch wenn die Jobs verschiedene Parameter haben. Durch diese Vorgehensweise kann AI Platform Training den Optimierungsprozess im Laufe der Zeit verbessern.

In den folgenden Beispielen wird die Nutzung der Konfiguration resumePreviousJobId gezeigt:

gcloud

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    enableTrialEarlyStopping: TRUE
    maxTrials: 30
    maxParallelTrials: 1
    resumePreviousJobId: [PREVIOUS_JOB_IDENTIFIER]

Python

# Add hyperparameter tuning to the job config.
hyperparams = {
    'enableTrialEarlyStopping': True,
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'resumePreviousJobId': [PREVIOUS_JOB_IDENTIFIER]}

# Add the hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

Hyperparameter-Abstimmung mit Cloud TPU

Wenn Sie Ihren Hyperparameter-Abstimmungsjob mit Cloud TPU in AI Platform Training ausführen, empfiehlt sich die Verwendung des Attributs eval_metrics in TPUEstimatorSpec.

Ein Beispiel für die Hyperparameter-Abstimmung mit Cloud TPU finden Sie unter Beispiel für ResNet-50 TPU-Hyperparameter-Abstimmung.

Statt das Attribut eval_metrics zu verwenden, können Sie alternativ tf.summary in host_call aufrufen, um den Dienst für die Hyperparameter-Abstimmung zu verwenden. Weitere Informationen finden Sie unter TPUEstimatorSpec.

Nächste Schritte