Cómo usar el ajuste de hiperparámetros

En esta página, se muestra cómo usar el ajuste de hiperparámetros de AI Platform cuando entrenas tu modelo. El ajuste de hiperparámetros 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ámetros, 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ámetros para tu trabajo de entrenamiento, incluye un HyperparameterSpec en tu objeto 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ámetros en tu trabajo de entrenamiento 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, AI Platform 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

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

AI Platform 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ámetros, y así asegurarte de que AI Platform 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.
# AI Platform 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.

Cómo obtener resultados del ajuste de hiperparámetros

Cuando los entrenamientos de ejecución se completen, puedes ver los resultados de cada prueba en GCP Console. De manera alternativa, puedes llamar a projects.jobs.get para obtener los resultados. El objeto TrainingOutput del 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. En GCP Console, puedes filtrar las pruebas por rmse, learning_rate y training steps. 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 ejecuciones posteriores 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ántas pruebas 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.

Cómo manejar las pruebas con errores

Si las pruebas de ajuste de hiperparámetros salen con errores, es posible que desees finalizar el trabajo de entrenamiento antes de tiempo. Establece el campo maxFailedTrials en HyperparameterSpec a la cantidad de intentos con errores que deseas permitir. Después de que falle esta cantidad de pruebas, AI Platform finaliza el trabajo de entrenamiento. El valor de maxFailedTrials debe ser menor o igual que maxTrials.

Si no configuras maxFailedTrials, o si lo estableces en 0, AI Platform usa las siguientes reglas para manejar las pruebas con errores:

  • Si la primera prueba de tu trabajo falla, AI Platform finaliza el trabajo de inmediato. Un error durante la primera prueba sugiere la existencia de un problema en tu código de entrenamiento, por lo que es probable que otras pruebas también fallen. Terminar el trabajo te permite diagnosticar el problema sin esperar más pruebas y, además, sin incurrir en mayores costos.
  • Si la primera prueba se realiza de forma correcta, AI Platform podría finalizar el trabajo después de la detección de fallas durante las pruebas posteriores según uno de los siguientes criterios:
    • La cantidad de pruebas con errores ha aumentado demasiado.
    • La proporción de pruebas con errores frente a pruebas exitosas ha aumentado demasiado.

Estos umbrales internos están sujetos a cambios. Para garantizar un comportamiento específico, configura el campo maxFailedTrials.

Cómo ejecutar ensayos paralelos

Puedes especificar una cantidad de intentos que se ejecutarán en paralelo. Para ello, estable 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.

Cómo detener las pruebas anticipadas

Puedes especificar que AI Platform detenga de manera automática 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.

AI Platform usa el ID de trabajo anterior para encontrar y reutilizar los mismos valores de goal, params y hyperparameterMetricTag a fin de continuar con el trabajo de ajuste de hiperparámetros.

Usa el nombre coherente params y hyperparameterMetricTag para trabajos similares, incluso si los trabajos tienen parámetros diferentes. Esta práctica permite que AI Platform mejore la optimización con el 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}

Ajustar de hiperparámetros con Cloud TPU

Si estás ejecutando tu trabajo de ajuste de hiperparámetros con Cloud TPU en AI Platform, 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…

¿Necesitas ayuda? Visita nuestra página de asistencia.