Tensorflow: uso de servidores de parámetros en entrenamiento distribuido

No está totalmente claro cómo los servidores de parámetros saben qué hacer en un entrenamiento de flujo tensorial distribuido.

Por ejemplo, en esta pregunta SO , el siguiente código se usa para configurar el servidor de parámetros y las tareas del trabajador:

if FLAGS.job_name == "ps": server.join() elif FLAGS.job_name == "worker": ##some training code 

¿Cómo indica server.join() la tarea dada debe ser un servidor de parámetros? ¿El parámetro sirve un tipo de comportamiento predeterminado para las tareas? ¿Hay algo más que pueda / deba decirle a una tarea de servicio de parámetros que haga?

Edit : Esta pregunta SO responde a algunas de mis preguntas: “La lógica allí se asegura de que los objetos de Variable se asignen de manera uniforme a los trabajadores que actúan como servidores de parámetros”. Pero, ¿cómo sabe un servidor de parámetros que es un servidor de parámetros? ¿Es server.join() suficiente?

TL; DR: TensorFlow no sabe nada acerca de los “servidores de parámetros”, pero en su lugar admite la ejecución de gráficos en múltiples dispositivos en diferentes procesos. Algunos de estos procesos tienen dispositivos cuyos nombres comienzan con "/job:ps" , y estos contienen las variables. Los trabajadores conducen el proceso de capacitación y, cuando ejecutan train_op , harán que se train_op trabajo en los dispositivos "/job:ps" , que actualizarán las variables compartidas.

El método server.join() simplemente le dice a TensorFlow que bloquee y escuche las solicitudes hasta que el servidor se apague (lo que actualmente significa que se bloquea para siempre, o hasta que finalice el proceso, ya que el cierre limpio no está implementado actualmente).

En el ejemplo de mi respuesta anterior, las tareas de PS son pasivas y todo está controlado por las tareas del trabajador … en ## some training code . Si divide su código en varios dispositivos, TensorFlow agregará la comunicación adecuada, y esto se extiende a los dispositivos en diferentes procesos. El with tf.device(tf.train.replica_device_setter(...)): le dice a TensorFlow que ponga cada variable en una tarea PS diferente configurando su dispositivo en "/job:ps/task:{i}" (para diferentes valores de {i} , elegidos en forma de round-robin).

Cuando llama a sess.run(train_op) , TensorFlow ejecutará un gráfico que depende de las variables y las actualiza, e incluye las operaciones que las actualizan. Esta parte del cálculo se realizará en los dispositivos "/job:ps" , por lo que esos dispositivos actuarán como un servidor de parámetros.