Usa TF_CONFIG para los detalles de entrenamiento distribuido

Cloud Machine Learning Engine establece una variable de entorno llamada TF_CONFIG en cada instancia de entrenamiento. El servicio y tu aplicación pueden acceder a detalles de los trabajos de entrenamiento en TF_CONFIG mientras se ejecutan.

En esta guía, se muestra cómo acceder a los detalles de los trabajos de entrenamiento en la variable de entorno TF_CONFIG. Esta técnica es útil para los trabajos de entrenamiento distribuidos y los trabajos de ajuste de hiperparámetros, dado que ambos requieren comunicación adicional entre la aplicación de entrenamiento y el servicio.

TensorFlow y TF_CONFIG

La API de Estimator de TensorFlow analiza la variable de entorno TF_CONFIG, si está presente, y usa los detalles relevantes de TF_CONFIG a fin de crear propiedades para el entrenamiento distribuido, incluidos la especificación de clúster, el ID de tarea y otras propiedades.

Si tu aplicación usa tf.estimator para el entrenamiento distribuido, la propagación de propiedades en la especificación de clúster funciona de manera automática, mientras Cloud ML Engine configura TF_CONFIG por ti.

El formato de TF_CONFIG

La variable de entorno TF_CONFIG es una string JSON con el siguiente formato:

Clave Descripción
"cluster" La descripción de clúster de TensorFlow. Este objeto tiene el formato de una especificación de clúster de TensorFlow y puede pasarse al creador de tf.train.ClusterSpec.
"task" Describe la tarea del nodo particular en el que se está ejecutando tu código. Puedes usar esta información a fin de escribir código para trabajadores específicos en un trabajo distribuido. Esta entrada es un diccionario con las siguientes claves:
"type" El tipo de tarea que realiza este nodo. Los valores posibles son master, worker y ps.
"index" El índice basado en cero de la tarea. La mayoría de los trabajos de entrenamiento distribuido tienen una tarea principal única, uno o más servidores de parámetros y uno o más trabajadores.
"trial" El identificador de la prueba de ajuste de hiperparámetros que se está ejecutando actualmente. Cuando configuras el ajuste de hiperparámetros de tu trabajo, estableces una cantidad de pruebas para entrenar. Este valor te proporciona una forma de diferenciar en tu código las pruebas que se están ejecutando. El identificador es un valor de string que contiene el número de prueba, que comienza en 1.
"job" Los parámetros de trabajo que usaste al momento de iniciar el trabajo. En la mayoría de los casos, puedes ignorar esta entrada, dado que replica los datos que se pasaron a tu aplicación a través de los argumentos de su línea de comandos.

Obtén TF_CONFIG y configura la especificación de clúster distribuido

En el ejemplo a continuación, se muestra cómo obtener los contenidos de TF_CONFIG en tu aplicación.

También se muestra cómo usar TF_CONFIG para configurar tf.train.ClusterSpec durante el entrenamiento distribuido. Nota: Solo necesitas compilar tf.train.ClusterSpec de TF_CONFIG si tu código usa las API del core de TensorFlow. Si usas tf.estimator, TensorFlow analiza la variable y compila la especificación de clúster por ti. Consulta la sección sobre TensorFlow y TF_CONFIG en esta página.

def train_and_evaluate(args):
  """Parse TF_CONFIG to cluster_spec and call run() method.

  TF_CONFIG environment variable is available when running using
  gcloud either locally or on cloud. It has all the information required
  to create a ClusterSpec which is important for running distributed code.

  Args:
    args (args): Input arguments.
  """

  tf_config = os.environ.get('TF_CONFIG')
  # If TF_CONFIG is not available run local.
  if not tf_config:
    return run(target='', cluster_spec=None, is_chief=True, args=args)

  tf_config_json = json.loads(tf_config)
  cluster = tf_config_json.get('cluster')
  job_name = tf_config_json.get('task', {}).get('type')
  task_index = tf_config_json.get('task', {}).get('index')

  # If cluster information is empty run local.
  if job_name is None or task_index is None:
    return run(target='', cluster_spec=None, is_chief=True, args=args)

  cluster_spec = tf.train.ClusterSpec(cluster)
  server = tf.train.Server(cluster_spec,
                           job_name=job_name,
                           task_index=task_index)

  # Wait for incoming connections forever.
  # Worker ships the graph to the ps server.
  # The ps server manages the parameters of the model.
  #
  # See a detailed video on distributed TensorFlow
  # https://www.youtube.com/watch?v=la_M6bCV91M
  if job_name == 'ps':
    server.join()
    return
  elif job_name in ['master', 'worker']:
    return run(server.target, cluster_spec, is_chief=(job_name == 'master'),
               args=args)

Configura device_filters para el entrenamiento distribuido

En el entrenamiento distribuido a gran escala, debes asegurarte de que la comunicación entre las máquinas sea confiable para que tu aplicación de entrenamiento sea resistente a fallas de la máquina.

Para lograrlo, debes configurar filtros de dispositivo en tu aplicación de entrenamiento a fin de asegurarte de que la instancia principal no dependa de que estén activas todas las instancias de trabajador. Si configuras device_filters, puedes asegurarte de que las máquinas principal y trabajadoras se comuniquen solamente con servidores de parámetros.

En el ejemplo siguiente, se muestra cómo configurar device_filters cuando se usa la biblioteca tf.estimator:

def _get_session_config_from_env_var():
    """Returns a tf.ConfigProto instance that has appropriate device_filters
    set."""

    tf_config = json.loads(os.environ.get('TF_CONFIG', '{}'))

    if (tf_config and 'task' in tf_config and 'type' in tf_config['task'] and
            'index' in tf_config['task']):
        # Master should only communicate with itself and ps
        if tf_config['task']['type'] == 'master':
            return tf.ConfigProto(device_filters=['/job:ps', '/job:master'])
        # Worker should only communicate with itself and ps
        elif tf_config['task']['type'] == 'worker':
            return tf.ConfigProto(device_filters=[
                '/job:ps',
                '/job:worker/task:%d' % tf_config['task']['index']
            ])
    return None

A continuación, pasa session_config a tf.estimator.RunConfig de la siguiente manera:

config = tf.estimator.RunConfig(session_config=_get_session_config_from_env_var())

Esto se configura de forma predeterminada en la biblioteca tf.estimator de TensorFlow 1.10 y superiores.

¿Qué sigue?

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

Enviar comentarios sobre…

Cloud ML Engine para TensorFlow