Tensorflow distribuido: CreateSession sigue esperando

Sencillo script a continuación se inicia con args que se muestran en su encabezado. Se comporta de manera diferente, pero a menudo uno de los trabajadores cuelga e imprime estos mensajes “CreateSession aún en espera de alguna otra tarea”. ¿Por qué un nuevo MonitoredTrainingSession necesita otros? ¿Y por qué los demás no esperan que empiece?

# #!/bin/bash # python train.py --job master --task 0 & # python train.py --job worker --task 0 & # python train.py --job worker --task 1 & # python train.py --job worker --task 2 & import argparse import tensorflow as tf parser = argparse.ArgumentParser() parser.add_argument('--job', type=str) parser.add_argument('--task', type=int) args = parser.parse_args() hosts = { "master": [ "localhost:2222", ], "worker": [ "localhost:2223", "localhost:2224", "localhost:2225", ] } nworkers = len(hosts['worker']) cluster = tf.train.ClusterSpec(hosts) server = tf.train.Server(cluster, job_name=args.job, task_index=args.task) with tf.device(f'/job:master/task:0'): global_step = tf.train.get_or_create_global_step() inc_global_step = tf.assign(global_step, global_step + 1) if args.job == 'worker': hooks = [ tf.train.StopAtStepHook(last_step=4), ] with tf.train.MonitoredTrainingSession(master=server.target, is_chief=(args.task == 0), hooks=hooks) as sess: while not sess.should_stop(): print(args.task, sess.run(inc_global_step)) else: server.join() 

Podría esperar que el jefe inicie sus variables. Pero pasa a esperar a otro trabajador no jefe también. Entonces, ¿MonitoredTrainingSession sincroniza las tareas? Si no es así, ¿son FIFOQueues la única primitiva para hacer la sincronización manual?

De forma predeterminada, una sesión distribuida de TensorFlow intentará conectarse a todos los servidores nombrados en tf.train.ClusterSpec y se bloqueará hasta que respondan. Esto proporciona una barrera útil que garantiza que todos los trabajadores estén listos para recibir solicitudes de cómputo antes de devolver el control al usuario. Esta barrera ocurre antes del código MonitoredTrainingSession que espera a que el jefe inicialice las variables.

Si no desea que su sesión espere en todos los servidores (por ejemplo, solo espere en las tareas en "/job:ps" y no en las otras tareas en "/job:worker" , que es una estrategia común de implementación entre gráficos), La opción más sencilla es especificar un “filtro de dispositivo” cuando cree su sesión. El filtro de dispositivos es una lista blanca de especificaciones de dispositivos (parciales) que determina las tareas a las que se tf.Session una tf.Session . Por ejemplo, la prueba mnist_replica.py especifica un filtro de dispositivo como parte de tf.ConfigProto que se utiliza para configurar la sesión.