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:
Legen Sie die Konfiguration der Hyperparameter-Abstimmung für Ihren Trainingsjob fest. Fügen Sie dazu ein HyperparameterSpec-Objekt in das Objekt TrainingInput ein.
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 funktionierende Konfigurationsdatei finden Sie unter
hptuning_config.yaml
in der Stichprobe der Bevölkerungsschätzungen.
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:
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.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:
tf.compat.v1.summary.FileWriter.add_summary
(in TensorFlow 1.x auch alstf.summary.FileWriter.add_summary
bezeichnet)tf.summary.scalar
(nur in TensorFlow 2.x)
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 eine benutzerdefinierte Keras- Callback 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 werden
tf.estimator.add_metrics
um der Zusammenfassung für Ihre Grafik
Ihren Hyperparameter-Messwert 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
um den Schätzer so zu konfigurieren, dass Zusammenfassungen alle 300 Sekunden ausgewertet und geschrieben werden
während des Trainings.
# 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 für das Training einen benutzerdefinierten Container verwenden
oder wenn Sie eine Hyperparameter-Abstimmung mit einem anderen Framework als
TensorFlow verwenden, müssen Sie den
cloudml-hypertune
Python-Paket, 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 aufTrue
festgelegt.trials
ist vorhanden und enthält eine Liste vonHyperparameterOutput
-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
undmaxParallelTrials
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
- Mehr über die Konzepte der Hyperparameter-Abstimmung erfahren
- Blogpost zur Messung der Auswirkungen der neuesten Optimierungen bei der Hyperparameter-Abstimmung lesen
- Blogpost über Bayes'sche Optimierung und Hyperparameter-Abstimmung lesen