Usa el ajuste de hiperparámetros

En esta página, se muestra cómo usar el ajuste de hiperparámetros de Cloud Machine Learning Engine cuando entrenas tu modelo. El ajuste de hiperparámetro optimiza una variable de destino que especificaste. La variable de destino se llama métrica de hiperparámetro. Cuando inicias un trabajo con ajuste de hiperparámetro, estableces el nombre de tu métrica de hiperparámetro. Este es el nombre que asignas al resumen escalar que agregas a tu entrenador.

Los pasos involucrados en el ajuste de hiperparámetro

Para usar el ajuste de hiperparámetro en tu trabajo de capacitación, debes realizar los siguientes pasos:

  1. Especifica la configuración del ajuste de hiperparámetro para tu trabajo de entrenamiento, incluye un HyperparameterSpec en tu objeto de TrainingInput.

  2. Incluye el siguiente código en tu aplicación de entrenamiento:

    • Analiza los argumentos de la línea de comandos que representan los hiperparámetros que deseas ajustar y usa los valores para establecer los hiperparámetros en tu prueba de entrenamiento.
    • Agrega tu métrica de hiperparámetro al resumen de tu grafo.

A continuación, se presentan más detalles de cada paso.

Especifica la configuración del ajuste de hiperparámetro para tu trabajo de entrenamiento

Crea un objeto HyperparameterSpec para mantener la configuración del ajuste de hiperparámetro en tu trabajo de capacitación y agrega el HyperparameterSpec como el objeto hyperparameters en tu objeto TrainingInput.

En tu HyperparameterSpec, configura el hyperparameterMetricTag a un valor que represente la métrica elegida. Por ejemplo: metric1. Si no especificas un hyperparameterMetricTag, Cloud ML Engine busca una métrica con el nombre training/hptuning/metric.

gcloud

Agrega la información de configuración de tu hiperparámetro a tu archivo YAML de configuración. A continuación, se muestra un ejemplo. Para un archivo de configuración de trabajo, consulta hptuning_config.yaml en la muestra del estimador de censo.

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 diccionario que represente tu HyperparameterSpec y agrégalo a tu información de entrenamiento. El siguiente ejemplo supone que ya creaste un diccionario TrainingInput (en este caso, se llama training_inputs) como se muestra en la guía de configuración del trabajo de entrenamiento.

# 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}

Comprueba el código en tu aplicación de entrenamiento

En tu aplicación, controla los argumentos de la línea de comandos para los hiperparámetros y agrega tu métrica al resumen del grafo.

Controla los argumentos de la línea de comandos para los hiperparámetros que deseas ajustar

Cloud ML Engine establece argumentos de línea de comandos cuando llama a tu aplicación de entrenamiento. Haz uso de los argumentos de línea de comandos en tu código:

  1. Define un nombre para cada argumento de hiperparámetro y analízalo, usa el analizador de argumentos que prefieras (generalmente argparse). Los nombres de los argumentos deben coincidir con los nombres de los parámetros que especificaste en la configuración del trabajo, como se describe anteriormente.

  2. Asigna los valores de los argumentos de la línea de comandos a los hiperparámetros en tu grafo.

Agrega tu métrica de hiperparámetro al resumen del grafo

Cloud ML Engine busca tu métrica de hiperparámetro cuando se llama al escritor del resumen del grafo. Nota: El Estimator de TensorFlow conservado usa el mismo nombre de métrica para el entrenamiento y la evaluación. Necesitas una métrica separada para el ajuste de hiperparámetro, y así asegurarte de que Cloud ML Engine pueda determinar la fuente de la métrica.

Tu código depende de si estás usando la API de Estimator de TensorFlow o las API principales de TensorFlow. A continuación, se presentan ejemplos para ambas situaciones.

Estimator

Usa el siguiente código para agregar tu métrica de hiperparámetro al resumen de tu grafo. El ejemplo supone que el nombre de tu métrica es metric1:

# 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)

Consulta la Muestra del censo de Estimator de TensorFlow.

TensorFlow Core

Crea un escritor de resumen tf.summary.FileWriter y agrega un resumen al escritor con tu métrica como una etiqueta. El siguiente ejemplo supone que el nombre de tu métrica es metric1:

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.
# ML Engine looks for any summary added with the hyperparameter metric tag.
summary_writer.add_summary(summary)
summary_writer.flush()

Consulta Muestra del censo del núcleo de TensorFlow

Obtén detalles de un trabajo de ajuste de hiperparámetro mientras se ejecuta

Puedes supervisar el ajuste del hiperparámetro, para ello obtén el estado detallado de tu trabajo de entrenamiento en ejecución.

El objeto TrainingOutput en el recurso de trabajo de la respuesta tiene los siguientes valores establecidos durante un trabajo de entrenamiento con ajuste de hiperparámetro:

  • isHyperparameterTuningJob establecido en True.

  • trials está presente y contiene una lista de objetos HyperparameterOutput, uno por prueba.

También puedes recuperar el ID de prueba de la variable de entorno TF_CONFIG. Consulta la guía Obtén detalles de TF_CONFIG.

Obtén resultados del ajuste de hiperparámetros

Cuando los entrenamientos de ejecución se completen, puedes llamar a projects.jobs.get para obtener los resultados. El objeto TrainingOutput en el recurso de trabajo contiene las métricas para todas las ejecuciones con las métricas de ejecución mejor ajustada identificada.

Usa la misma solicitud de estado detallada que usas cuando supervisas el trabajo durante el procesamiento para obtener esta información.

Puedes ver los resultados de cada prueba en la descripción del trabajo. Encuentra la prueba que produjo el valor más deseable para tu métrica de hiperparámetro. Si la prueba cumple con tu estándar para el éxito del modelo, puedes usar los valores de hiperparámetro que se muestran en esa prueba en las siguientes ejecuciones de tu modelo.

A veces, varias pruebas dan resultados idénticos para tu métrica de ajuste. En tal caso, debes determinar cuáles de los valores del hiperparámetro son más ventajosos en otras medidas. Por ejemplo, si ajustas la cantidad de nodos en una capa oculta y obtienes resultados idénticos cuando el valor está establecido en 8 que cuando está establecido en 20, debes usar 8, porque más nodos significa más procesamiento y costo sin ninguna mejora en tu modelo

Establece un límite para la cantidad de intentos

Debes decidir cuántos ensayos deseas permitir que ejecute el servicio y establecer el valor maxTrials en el objeto HyperparameterSpec.

Hay dos intereses en competencia que se deben tener en cuenta cuando decides cuántas pruebas se deben permitir:

  • tiempo (y en consecuencia costo)
  • precisión

El aumento de la cantidad de pruebas suele producir mejores resultados, pero no siempre es así. En la mayoría de los casos hay un punto de rendimientos decrecientes, después de lo cual las pruebas adicionales tienen poco o ningún efecto en la exactitud. Puede ser mejor comenzar con una pequeña cantidad de pruebas para evaluar el efecto que tienen los hiperparámetros elegidos en la exactitud de tu modelo antes de comenzar un trabajo con una gran cantidad de pruebas.

Para aprovechar al máximo el ajuste del hiperparámetro, no debes establecer tu valor máximo inferior a diez veces la cantidad de hiperparámetros que usas.

Ejecuta ensayos paralelos

Puedes especificar una cantidad de intentos que se ejecutarán en paralelo. Para ello, establece maxParallelTrials en el objeto HyperparameterSpec.

La ejecución de pruebas paralelas tiene el beneficio de reducir el tiempo que toma el trabajo de entrenamiento (tiempo real, el tiempo total de procesamiento requerido no suele cambiar). Sin embargo, ejecutar en paralelo puede reducir la efectividad del trabajo de ajuste en general. Esto se debe a que el ajuste de hiperparámetros usa los resultados de los ensayos anteriores para informar los valores y así asignar a los hiperparámetros de los ensayos posteriores. Cuando se ejecutan en paralelo, algunas pruebas comienzan sin tener el beneficio de los resultados de cualquier prueba que aún se esté ejecutando.

Si usas pruebas paralelas, el servicio de capacitación aprovisiona varios clústeres de procesamiento de capacitación (o varias máquinas individuales en el caso de un entrenador de un solo proceso). El nivel de escala que establezcas para tu trabajo lo usa cada clúster de entrenamiento individual.

Detén las pruebas anticipadas

Puedes especificar que Cloud ML Engine debe detener automáticamente una prueba que se ha vuelto claramente poco prometedora. Esto te ahorra el costo de continuar una prueba que es poco probable que sea útil.

Para permitir que se detenga una prueba antes de tiempo, configura el valor enableTrialEarlyStopping en el HyperparameterSpec en TRUE.

Reanuda un trabajo de ajuste de hiperparámetros completado

Puedes continuar un trabajo de ajuste de hiperparámetros completado para comenzar desde un estado que está parcialmente optimizado. Esto hace posible que reutilices el conocimiento adquirido en el trabajo de ajuste de hiperparámetros anterior.

Para reanudar un trabajo de ajuste de hiperparámetros, envía un trabajo de ajuste de hiperparámetros nuevo con la siguiente configuración:

  • Establece el valor resumePreviousJobId en el HyperparameterSpec al ID de trabajo de la prueba anterior.
  • Especifica valores para maxTrials y maxParallelTrials.

Cloud ML Engine usa el ID de trabajo anterior para encontrar y reutilizar los mismos valores goal, params, y hyperparameterMetricTag a fin de continuar el trabajo de sintonía hiperparámetro.

Usa el nombre coherente params y hyperparameterMetricTag para trabajos similares, incluso cuando los trabajos tienen parámetros diferentes. Esta práctica hace posible que Cloud ML Engine mejore la optimización a lo largo del tiempo.

En los siguientes ejemplos se muestra el uso de la configuración 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}

Ajusta el hiperparámetro con Cloud TPU

Si estás ejecutando tu trabajo de ajuste de hiperparámetros con Cloud TPU en Cloud ML Engine, la práctica recomendada es usar la propiedad eval_metrics en TPUEstimatorSpec.

Consulta la muestra de ajuste de hiperparámetros de TPU de ResNet-50 para ver un ejemplo práctico de ajuste de hiperparámetros con Cloud TPU.

En lugar de usar la propiedad eval_metrics para usar el servicio de ajuste de hiperparámetro, una alternativa es llamar a tf.summary en host_call. Para obtener más detalles, consulta TPUEstimatorSpec.

¿Qué sigue?

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Cloud ML Engine para TensorFlow