Hyperparameter-Abstimmung verwenden

Auf dieser Seite erfahren Sie, wie Sie beim Trainieren Ihres Modells die Hyperparameter-Abstimmung von AI Platform einsetzen. 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.

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

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 überprüfen

Bearbeiten Sie in Ihrer Anwendung die Befehlszeilenargumente für die Hyperparameter und fügen Sie der Grafikzusammenfassung Ihren Messwert hinzu.

Befehlszeilenargumente für die abzustimmenden Hyperparameter bearbeiten

AI Platform 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 den Hyperparametern in Ihrer Grafik die Werte aus den Befehlszeilenargumenten zu.

Hyperparameter-Messwert der Grafikzusammenfassung hinzufügen

AI Platform sucht nach dem Hyperparameter-Messwert, wenn der Zusammenfassungsautor der Grafik aufgerufen wird. Hinweis: Die TensorFlow Estimator-Vorlage verwendet für Training und Bewertung denselben Messwertnamen. Für die Hyperparameter-Abstimmung benötigen Sie einen separaten Messwert, damit AI Platform die Quelle des Messwerts ermitteln kann.

Ihr Code ist abhängig davon, ob Sie die TensorFlow Estimator API oder die TensorFlow Core APIs verwenden. Nachfolgend finden Sie Beispiele für beide Fälle:

Estimator

Verwenden Sie den folgenden Code, um der Zusammenfassung für Ihre Grafik den Hyperparameter-Messwert hinzuzufügen. In diesem Beispiel wird angenommen, dass der Name des Messwerts metric1 lautet:

# Create metric for hyperparameter tuning
def my_metric(labels, predictions):
    pred_values = predictions['predictions']
    return {'metric1': tf.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.contrib.estimator.add_metrics(estimator, my_metric)

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

Weitere Informationen finden Sie im Volkszählungsbeispiel für TensorFlow Estimator.

TensorFlow Core

Erstellen Sie einen Zusammenfassungsautor tf.summaryFileWriter und fügen Sie eine Zusammenfassung ein, die Ihren Messwert als Tag enthält. Im folgenden Beispiel wird angenommen, dass der Name des Messwerts metric1 lautet:

from tensorflow.core.framework.summary_pb2 import Summary
...
summary = Summary(value=[Summary.Value(tag='metric1', simple_value=loss_val)])
eval_path = os.path.join(args['job_dir'], 'metric1')
summary_writer = tf.summary.FileWriter(eval_path)

# Note: adding the summary to the writer is enough for hyperparameter tuning.
# AI Platform looks for any summary added with the hyperparameter metric tag.
summary_writer.add_summary(summary)
summary_writer.flush()

Weitere Informationen finden Sie im Volkszählungsbeispiel für TensorFlow Core.

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 auf True gesetzt

  • trials ist vorhanden und enthält für jeden Test eine Liste der HyperparameterOutput-Objekte.

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 Versuche in der GCP Console ansehen. Alternativ können Sie projects.jobs.get aufrufen, um die Ergebnisse abzurufen. 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 GCP 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.

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 Versuche 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 Versuche danach wenig oder keinen Einfluss auf die Genauigkeit haben. Am besten beginnen Sie mit einer kleinen Versuchsanzahl, um die Auswirkung der gewählten Hyperparameter auf die Genauigkeit des Modells zu messen, bevor Sie einen Job mit einer großen Anzahl von Versuchen 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 den Trainingsjob. Der Wert für maxFailedTrials muss kleiner oder gleich maxTrials sein.

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

  • Wenn der erste Test Ihres Jobs fehlschlägt, beendet AI Platform 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 verläuft, kann AI Platform den Job trotzdem aufgrund von fehlgeschlagenen 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 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.
  • Legen Sie Werte für maxTrials und maxParallelTrials fest.

AI Platform 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 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 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.

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...