Questa pagina mostra come utilizzare l'ottimizzazione degli iperparametri di AI Platform Training durante l'addestramento del modello. L'ottimizzazione degli iperparametri ottimizza una variabile di destinazione specificata. La variabile target è chiamata metrica iperparametro. Quando avvii un job con l'ottimizzazione degli iperparametri, stabilisci il nome della metrica degli iperparametri. Si tratta del nome assegnato al riepilogo scalare che aggiungi al tuo trainer.
I passaggi per l'ottimizzazione degli iperparametri
Per utilizzare l'ottimizzazione degli iperparametri nel job di addestramento, devi eseguire i seguenti passaggi:
Specifica la configurazione dell'ottimizzazione degli iperparametri per il tuo job di addestramento includendo un HyperparameterSpec nell'oggetto TrainingInput.
Includi il seguente codice nell'applicazione di addestramento:
- Analizza gli argomenti della riga di comando che rappresentano gli iperparametri da ottimizzare e utilizza i valori per impostare gli iperparametri per la prova di addestramento.
- Aggiungi la metrica dell'iperparametro al riepilogo del grafico.
Di seguito sono riportati ulteriori dettagli su ogni passaggio.
Specifica la configurazione dell'ottimizzazione degli iperparametri per il job di addestramento
Crea un oggetto HyperparameterSpec per contenere la configurazione dell'ottimizzazione degli iperparametri per il job di addestramento e aggiungi HyperparameterSpec
come oggetto hyperparameters
nell'oggetto TrainingInput.
Il job di ottimizzazione degli iperparametri creerà job di prova. Se vuoi accelerare la procedura di esecuzione del job di prova dell'addestramento, puoi specificare un tipo di macchina personalizzata nell'oggetto TrainingInput. Ad esempio, per creare job di prova con ogni job di prova che utilizza VM n1-standard-8
, puoi specificare masterType
come n1-standard-8
e lasciare vuota la configurazione del worker.
In HyperparameterSpec
, imposta hyperparameterMetricTag
su un valore
che rappresenti la metrica scelta. Se non specifichi un valore hyperparameterMetricTag
, AI Platform Training cerca una metrica con il nome training/hptuning/metric
. L'esempio seguente mostra come creare una configurazione per una metrica denominata metric1
:
gcloud
Aggiungi le informazioni di configurazione degli iperparametri al file YAML di configurazione. Di seguito è riportato un esempio. Per un file di configurazione funzionante, consulta
hptuning_config.yaml
nel campione di stimatori del censimento.
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
Crea un dizionario che rappresenti HyperparameterSpec e aggiungilo all'input di addestramento. L'esempio seguente presuppone che tu abbia già creato un dizionario TrainingInput
(in questo caso denominato training_inputs
) come mostrato nella guida alla configurazione dei job di addestramento.
# 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}
Controlla il codice nell'applicazione di addestramento
Nell'applicazione, gestisci gli argomenti della riga di comando per gli iperparametri e registra la metrica degli iperparametri in AI Platform Training.
Gestire gli argomenti della riga di comando per gli iperparametri da ottimizzare
AI Platform Training imposta gli argomenti della riga di comando quando chiama l'applicazione di addestramento. Utilizza gli argomenti della riga di comando nel codice:
Definisci un nome per ogni argomento dell'iperparametro e analizzalo utilizzando il parser di argomenti che preferisci (in genere
argparse
). I nomi degli argomenti devono corrispondere ai nomi dei parametri specificati nella configurazione del job, come descritto sopra.Assegna i valori degli argomenti della riga di comando agli iperparametri nel codice di addestramento.
Segnalare la metrica degli iperparametri ad AI Platform Training
Il modo in cui segnalare la metrica degli iperparametri al servizio di AI Platform Training dipende dal fatto che tu stia utilizzando o meno TensorFlow per l'addestramento. Dipende anche se utilizzi una versione del runtime o un container personalizzato per l'addestramento.
Ti consigliamo di segnalare frequentemente la metrica degli iperparametri al codice di addestramento di AI Platform Training per sfruttare la interruzione anticipata.
TensorFlow con una versione del runtime
Se utilizzi una versione di runtime di AI Platform Training e esegui l'addestramento con TensorFlow, puoi segnalare la metrica degli iperparametri ad AI Platform Training scrivendola in un riepilogo di TensorFlow. Utilizza una delle seguenti funzioni:
tf.compat.v1.summary.FileWriter.add_summary
(noto anche cometf.summary.FileWriter.add_summary
in TensorFlow 1.x)tf.summary.scalar
(solo in TensorFlow 2.x)
L'utilizzo di un'API TensorFlow diversa che chiama una delle funzioni precedenti, come nel seguente esempio di stimatore, registra anche la metrica dell'iperparametro in AI Platform Training.
Gli esempi riportati di seguito mostrano le nozioni di base di due diversi modi per scrivere la metrica dell'iperparametro in un riepilogo. Entrambi gli esempi presuppongono che tu stia addestrando un
modello di regressione e scrivono l'errore quadratico medio della radice tra le etichette basate su dati empirici reali
e le previsioni di valutazione come metrica dell'iperparametro denominata metric1
.
Keras
Il seguente esempio utilizza un callback Keras personalizzato per scrivere un riepilogo scalare alla fine di ogni epoca di addestramento:
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
L'esempio seguente utilizza
tf.estimator.add_metrics
per aggiungere la metrica dell'iperparametro al riepilogo del grafico.
Tieni presente che gli stimatori scrivono un riepilogo del grafico ogni volta che viene eseguito il loro evaluate
metodo. Questo esempio utilizza
tf.estimator.EvalSpec
con
tf.estimator.train_and_evaluate
per configurare lo stimatore in modo che valuti e scriva i riepiloghi ogni 300 secondi
durante l'addestramento.
# 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)
Altri framework di machine learning o container personalizzati
Se utilizzi un container personalizzato per l'addestramento o se vuoi eseguire l'ottimizzazione degli iperparametri con un framework diverso da TensorFlow, devi utilizzare il pacchetto Python cloudml-hypertune
per segnalare la metrica degli iperparametri ad AI Platform Training.
Guarda un esempio di utilizzo di
cloudml-hypertune
.
Visualizzazione dei dettagli di un job di ottimizzazione iperparametri durante l'esecuzione
Puoi monitorare l'ottimizzazione degli iperparametri ottenendo lo stato dettagliato del job di addestramento in esecuzione.
L'oggetto TrainingOutput
nella risorsa Job della risposta ha i seguenti valori impostati durante un job di addestramento con ottimizzazione degli iperparametri:
isHyperparameterTuningJob
impostato suTrue
.trials
è presente e contiene un elenco di oggettiHyperparameterOutput
, uno per prova.
Puoi anche recuperare l'ID di prova dalla variabile di ambiente TF_CONFIG
. Consulta la guida su come recuperare i dettagli da TF_CONFIG
.
Ottenere i risultati dell'ottimizzazione degli iperparametri
Al termine dell'addestramento, puoi visualizzare i risultati di ogni prova nella console Google Cloud.
In alternativa, puoi chiamare il numero projects.jobs.get
per ricevere i risultati. L'oggetto
TrainingOutput
nella risorsa job contiene le metriche per tutte le esecuzioni, con le metriche
per l'esecuzione con la migliore ottimizzazione identificata.
Per ottenere queste informazioni, utilizza la stessa richiesta di stato dettagliata che utilizzi per monitorare il job durante l'elaborazione.
Puoi vedere i risultati di ogni prova nella descrizione del job. Nella console Google Cloud, puoi filtrare le prove in base a rmse
, learning_rate
e
training steps
. Trova la prova che ha generato il valore più auspicabile per la metrica dell'iperparametro. Se il trial soddisfa il tuo standard di successo del
modello, puoi utilizzare i valori degli iperparametri mostrati per il trial nelle esecuzioni
successive del modello.
A volte più prove forniscono risultati identici per la metrica di ottimizzazione. In questo caso, devi determinare quali valori degli iperparametri sono più vantaggiosi in base ad altre misure. Ad esempio, se stai ottimizzando il numero di nodi in un livello nascosto e ottieni risultati identici quando il valore è impostato su 8 o su 20, devi utilizzare 8, perché più nodi significano più elaborazione e costi senza alcun miglioramento del modello.
Lo stato della prova FAILED
in
HyperparameterOutput può indicare che l'addestramento non è riuscito per la prova o che la prova non è riuscita a registrare la metrica di ottimizzazione degli iperparametri. In quest'ultimo caso, il job principale può essere completato anche se la prova non va a buon fine. Puoi visualizzare il log della prova per verificare se la formazione non è andata a buon fine per la prova.
Impostare un limite al numero di prove
Devi decidere quante prove vuoi consentire al servizio di eseguire e impostare il valore maxTrials
nell'oggetto HyperparameterSpec.
Quando decidi quante prove consentire, devi tenere conto di due interessi in competizione:
- tempo (e di conseguenza costi)
- accuracy
L'aumento del numero di prove generalmente dà risultati migliori, ma non sempre è così. Nella maggior parte dei casi, c'è un punto in cui i risultati diminuiscono dopo il quale ulteriori prove hanno poco o nessun effetto sulla precisione. Prima di avviare un job con un numero elevato di prove, potrebbe essere meglio iniziare con un numero ridotto di prove per valutare l'effetto degli iperparametri scelti sull'accuratezza del modello.
Per ottenere il massimo dall'ottimizzazione degli iperparametri, non devi impostare un valore massimo inferiore a dieci volte il numero di iperparametri utilizzati.
Gestione delle prove non riuscite
Se le prove di ottimizzazione degli iperparametri terminano con errori, ti consigliamo di terminare il job di addestramento in anticipo. Imposta il campo maxFailedTrials
in HyperparameterSpec sul numero di prove non riuscite che vuoi consentire.
Dopo questo numero di tentativi non riusciti, AI Platform Training termina il job di addestramento.
Il valore maxFailedTrials
deve essere minore o uguale a maxTrials
.
Se non imposti maxFailedTrials
o lo imposti su 0
,
AI Platform Training utilizza le seguenti regole per gestire i trial non riusciti:
- Se la prima prova del job non va a buon fine, AI Platform Training termina immediatamente il job. Un errore durante la prima prova suggerisce un problema nel codice di addestramento, pertanto è probabile che anche le prove successive non vadano a buon fine. La terminazione del job ti offre la possibilità di diagnosticare il problema senza attendere altri tentativi e senza costi aggiuntivi.
- Se la prima prova va a buon fine, AI Platform Training potrebbe terminare il job dopo i fallimenti durante le prove successive in base a uno dei seguenti criteri:
- Il numero di prove non riuscite è aumentato troppo.
- Il rapporto tra prove non riuscite e prove riuscite è diventato troppo elevato.
Queste soglie interne sono soggette a modifica. Per garantire un comportamento specifico, imposta il campo maxFailedTrials
.
Esecuzione di prove parallele
Puoi specificare un numero di prove da eseguire in parallelo impostando
maxParallelTrials
nell'oggetto HyperparameterSpec.
L'esecuzione di prove parallele ha il vantaggio di ridurre il tempo necessario per il job di addestramento (in tempo reale, il tempo di elaborazione totale richiesto in genere non cambia). Tuttavia, l'esecuzione in parallelo può ridurre l'efficacia complessiva del job di ottimizzazione. Questo perché l'ottimizzazione degli iperparametri utilizza i risultati delle prove precedenti per determinare i valori da assegnare agli iperparametri delle prove successive. Quando vengono eseguite in parallelo, alcune prove iniziano senza usufruire dei risultati delle prove ancora in esecuzione.
Se utilizzi prove parallele, il servizio di addestramento esegue il provisioning di più cluster di elaborazione dell'addestramento (o di più singole macchine nel caso di un trainer con un solo processo). Il livello di scalabilità impostato per il job viene utilizzato per ogni singolo cluster di addestramento.
Interrompere in anticipo le prove
Puoi specificare che AI Platform Training deve interrompere automaticamente una prova che è diventata chiaramente poco promettente. In questo modo risparmi il costo di una prova che probabilmente non sarà utile.
Per consentire l'interruzione anticipata di una prova, imposta il valore enableTrialEarlyStopping
in HyperparameterSpec su TRUE
.
Ripresa di un job di ottimizzazione iperparametri completato
Puoi continuare un job di ottimizzazione degli iperparametri completato per iniziare da uno stato parzialmente ottimizzato. In questo modo è possibile riutilizzare le conoscenze acquisite nel job di ottimizzazione degli iperparametri precedente.
Per riprendere un job di ottimizzazione degli iperparametri, invia un nuovo job di ottimizzazione degli iperparametri con la seguente configurazione:
- Imposta il valore
resumePreviousJobId
in HyperparameterSpec sull'ID job della prova precedente. - Specifica i valori per
maxTrials
emaxParallelTrials
.
AI Platform Training utilizza l'ID job precedente per trovare e riutilizzare gli stessi valori goal
, params
e hyperparameterMetricTag
per continuare il job di ottimizzazione degli iperparametri.
Utilizza nomi hyperparameterMetricTag
e params
coerenti per job simili, anche se hanno parametri diversi. Questa pratica consente all'AI Platform Training di migliorare l'ottimizzazione nel tempo.
I seguenti esempi mostrano l'utilizzo della configurazione resumePreviousJobId
:
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}
Ottimizzazione degli iperparametri con Cloud TPU
Se esegui il job di ottimizzazione degli iperparametri con Cloud TPU su
AI Platform Training, la best practice è utilizzare la proprietà eval_metrics
in TPUEstimatorSpec
.
Consulta l'esempio di ottimizzazione degli iperparametri di ResNet-50 con TPU per un esempio pratico di ottimizzazione degli iperparametri con Cloud TPU.
Anziché utilizzare la proprietà eval_metrics
per utilizzare il servizio di ottimizzazione degli iperparametri, un'alternativa è chiamare tf.summary
in host_call
. Per maggiori dettagli, consulta TPUEstimatorSpec
.
Passaggi successivi
- Scopri di più sui concetti coinvolti nell'ottimizzazione degli iperparametri.
- Leggi un post del blog che misura l'impatto dei recenti miglioramenti all'ottimizzazione degli iperparametri.
- Leggi un post del blog sull'ottimizzazione bayesiana e sull'ottimizzazione di iperparametri.