Utilizzo dell'ottimizzazione degli iperparametri

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 target da te specificata. La variabile target è chiamata metrica iperparametro. Quando avvii un job con l'ottimizzazione degli iperparametri, stabilisci il nome della metrica dell'iperparametro. Questo è il nome che assegni al riepilogo scalare che aggiungi al tuo trainer.

Passaggi per l'ottimizzazione degli iperparametri

Per utilizzare l'ottimizzazione degli iperparametri nel job di addestramento, devi eseguire questi passaggi:

  1. Specifica la configurazione di ottimizzazione degli iperparametri per il job di addestramento includendo HyperparameterSpec nell'oggetto TrainingInput.

  2. Includi il seguente codice nella tua applicazione di addestramento:

    • Analizza gli argomenti della riga di comando che rappresentano gli iperparametri che vuoi ottimizzare e utilizza i valori per impostare gli iperparametri per la prova di addestramento.
    • Aggiungi la metrica iperparametri al riepilogo del grafico.

Di seguito sono riportati ulteriori dettagli di ogni passaggio.

Specifica la configurazione di ottimizzazione degli iperparametri per il job di addestramento

Crea un oggetto HyperparameterSpec per contenere la configurazione di 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 il processo del job di prova di addestramento, puoi specificare un tipo di macchina personalizzata nell'oggetto TrainingInput. Ad esempio, per creare job di prova con ogni job di prova utilizzando le VM n1-standard-8, puoi specificare masterType come n1-standard-8 e lasciare vuota la configurazione worker.

In HyperparameterSpec, imposta hyperparameterMetricTag su un valore che rappresenta la metrica scelta. Se non specifichi un 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 dei tuoi iperparametri al file YAML di configurazione. Di seguito è riportato un esempio. Per un file di configurazione funzionante, vedi hptuning_config.yaml nell'esempio dello strumento di stima 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 al tuo 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 del 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 nella tua applicazione di addestramento

Nell'applicazione, gestisci gli argomenti della riga di comando per gli iperparametri e segnala la metrica degli iperparametri ad AI Platform Training.

Gestisci 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 tuo codice:

  1. Definisci un nome per ogni argomento iperparametri e analizzalo utilizzando l'analizzatore sintattico di argomenti che preferisci (in genere argparse). I nomi degli argomenti devono corrispondere a quelli dei parametri specificati nella configurazione del job, come descritto sopra.

  2. Assegna i valori degli argomenti della riga di comando agli iperparametri nel codice di addestramento.

Segnala la metrica iperparametri in AI Platform Training

Il modo per segnalare la metrica iperparametri al servizio AI Platform Training dipende dall'utilizzo o meno di TensorFlow. Dipende anche dall'utilizzo o meno di una versione di runtime o di un container personalizzato per l'addestramento.

Ti consigliamo di fare in modo che il codice di addestramento registri frequentemente la metrica degli iperparametri ad AI Platform Training per sfruttare l'interruzione anticipata.

TensorFlow con una versione di runtime

Se utilizzi una versione runtime di AI Platform Training e addestra con TensorFlow, puoi segnalare la metrica dell'iperparametro ad AI Platform Training scrivendo la metrica in un riepilogo di TensorFlow. Utilizza una delle seguenti funzioni:

L'utilizzo di un'API TensorFlow diversa che chiama una delle funzioni precedenti, come nell'esempio dello strumento di stima che segue, riporta anche la metrica dell'iperparametro ad AI Platform Training.

I seguenti esempi mostrano le nozioni di base di due modi diversi per scrivere la metrica iperparametri in un riepilogo. Entrambi gli esempi presuppongono che tu stia addestrando un modello di regressione e scrivono l'errore quadratico medio tra le etichette dei dati empirici reali e le previsioni di valutazione come metrica di iperparametro denominata metric1.

Keras

L'esempio seguente utilizza un callback personalizzato di Keras 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()])

Strumento per la stima

L'esempio seguente utilizza tf.estimator.add_metrics per aggiungere la metrica dell'iperparametro al riepilogo del grafico.

Tieni presente che gli strumenti per la stima scrivono un riepilogo del grafico ogni volta che viene eseguito il metodo evaluate. Questo esempio utilizza tf.estimator.EvalSpec con tf.estimator.train_and_evaluate per configurare lo strumento di stima in modo da valutare e scrivere 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 iperparametri in AI Platform Training.

Visualizza un esempio di utilizzo di cloudml-hypertune.

Recupero dei dettagli di un job di ottimizzazione degli 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 l'ottimizzazione degli iperparametri:

  • isHyperparameterTuningJob impostato su True.

  • trials è presente e contiene un elenco di oggetti HyperparameterOutput, uno per prova.

Puoi anche recuperare l'ID prova dalla variabile di ambiente TF_CONFIG. Consulta la guida per recuperare i dettagli da TF_CONFIG.

Recupero dei risultati dell'ottimizzazione degli iperparametri

Al termine dell'addestramento, puoi visualizzare i risultati di ogni prova nella console Google Cloud. In alternativa, puoi chiamare projects.jobs.get per ottenere i risultati. L'oggetto TrainingOutput nella risorsa job contiene le metriche per tutte le esecuzioni, con le metriche per l'esecuzione ottimizzata identificata.

Utilizza la stessa richiesta di stato dettagliata utilizzata per monitorare il job durante l'elaborazione per ottenere queste informazioni.

Puoi visualizzare i risultati di ogni prova nella descrizione del job. Nella console Google Cloud, puoi filtrare le prove per rmse, learning_rate e training steps. Trova la prova che ha prodotto il valore più desiderabile per la metrica iperparametro. Se la prova soddisfa lo standard per il successo del modello, puoi utilizzare i valori degli iperparametri mostrati per quella prova nelle esecuzioni successive del modello.

A volte, più prove forniscono risultati identici per la metrica di ottimizzazione. In tal caso, devi determinare quali dei valori degli iperparametri sono più vantaggiosi con 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 come quando è impostato su 20, devi utilizzare 8, perché più nodi significano più elaborazione e costi senza miglioramenti al 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 segnalare la metrica di ottimizzazione degli iperparametri. In quest'ultimo caso, il job padre può andare a buon fine anche se la prova non va a buon fine. Puoi visualizzare il log della prova per vedere se l'addestramento non è riuscito.

Impostare un limite per il numero di prove

Devi decidere quante prove consentire al servizio di eseguire e impostare il valore maxTrials nell'oggetto HyperparameterSpec.

Ci sono due interessi in conflitto da considerare quando si decide quante prove consentire:

  • tempo (e, di conseguenza, costo)
  • accuratezza

L'aumento del numero di prove in genere produce risultati migliori, ma non è sempre così. Nella maggior parte dei casi si verifica un punto di riduzione dei rendimenti dopo il quale le prove aggiuntive hanno un impatto minimo o nullo sull'accuratezza. Ti consigliamo di iniziare con un numero limitato di prove per valutare l'effetto degli iperparametri che hai scelto sull'accuratezza del modello prima di iniziare un job con un numero elevato di prove.

Per ottenere il massimo dall'ottimizzazione degli iperparametri, non impostare il valore massimo su un valore inferiore a dieci volte il numero di iperparametri utilizzati.

Gestione delle prove non riuscite

Se le prove di ottimizzazione degli iperparametri terminano con errori, è consigliabile 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 prove, AI Platform Training termina il job di addestramento. Il valore di 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 le prove con errori:

  • 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, quindi è probabile che anche altre prove non vadano a buon fine. Il termine del job ti offre l'opportunità di diagnosticare il problema senza attendere ulteriori prove e sostenere costi maggiori.
  • Se la prima prova ha esito positivo, AI Platform Training potrebbe terminare il job dopo gli errori 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 è aumentato troppo.

Queste soglie interne sono soggette a modifiche. 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 di prove precedenti per stabilire i valori da assegnare agli iperparametri delle prove successive. Quando vengono eseguite in parallelo, alcune prove iniziano senza avere il vantaggio dei risultati di eventuali 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ù macchine singole nel caso di un addestramento con un solo processo). Il livello di scalabilità impostato per il job viene utilizzato per ogni singolo cluster di addestramento.

Interruzione anticipata delle prove

Puoi specificare che AI Platform Training deve interrompere automaticamente una prova che è diventata chiaramente poco promettente. In questo modo puoi risparmiare sui costi di continuare con una prova che difficilmente si rivela 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. Ciò consente di riutilizzare le conoscenze acquisite nel precedente job di ottimizzazione degli iperparametri.

Per riprendere un job di ottimizzazione iperparametri, invia un nuovo job di ottimizzazione iperparametri con la seguente configurazione:

  • Imposta il valore resumePreviousJobId in HyperparameterSpec sull'ID job della prova precedente.
  • Specifica i valori per maxTrials e maxParallelTrials.

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. In questo modo, AI Platform Training può 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 prevede l'utilizzo della proprietà eval_metrics in TPUEstimatorSpec.

Consulta l'esempio di ottimizzazione degli iperparametri TPU ResNet-50 per un esempio funzionante di ottimizzazione degli iperparametri con Cloud TPU.

Anziché utilizzare la proprietà eval_metrics per usare il servizio di ottimizzazione degli iperparametri, un'alternativa è chiamare tf.summary in host_call. Per maggiori dettagli, consulta la pagina TPUEstimatorSpec.

Passaggi successivi