Distributed TensorFlow [Async, Between-Graph Replication]: cuál es la interacción exacta entre trabajadores y servidores con respecto a la actualización de variables
He leído Distributed TensorFlow Doc y esta pregunta sobre StackOverflow pero todavía tengo algunas dudas sobre la dinámica detrás del entrenamiento distribuido que se puede realizar con TensorFlow y su arquitectura de servidor de parámetros. Este es un fragmento de código de Distributed TensorFlow Doc:
if FLAGS.job_name == "ps":
server.join()
elif FLAGS.job_name == "worker":
# Assigns ops to the local worker by default.
with tf.device(tf.train.replica_device_setter(
worker_device="/job:worker/task:%d" % FLAGS.task_index,
cluster=cluster)):
# Build model...
loss = ...
global_step = tf.contrib.framework.get_or_create_global_step()
train_op = tf.train.AdagradOptimizer(0.01).minimize(
loss, global_step=global_step)
Y aquí parte de la respuesta de la pregunta de StackOverflow que leí:
El trabajador lee todos los parámetros del modelo compartido en paralelo desde la(s) tarea(s) de PS y las copia en la tarea del trabajador. Estas lecturas son descoordinado con cualquier escritura concurrente, y no se adquieren bloqueos: en particular, el trabajador puede ver actualizaciones parciales de uno o más otros trabajadores (por ejemplo, un subconjunto de las actualizaciones de otro trabajador puede se han aplicado, o un subconjunto de los elementos de una variable puede haber actualizado).
El trabajador calcula los gradientes localmente, en función de un lote de datos de entrada y los valores de los parámetros que leyó en el paso 1.
El el trabajador envía los gradientes para cada variable al PS apropiado tarea, y aplica los gradientes a su respectiva variable, usando un regla de actualización determinada por el algoritmo de optimización (p. SGD, SGD con Momentum, Adagrad, Adam, etc.). Las reglas de actualización suelen utilizar (aproximadamente) operaciones conmutativas, por lo que pueden ser aplicado de forma independiente sobre las actualizaciones de cada trabajador, y el estado de cada variable será un agregado continuo de la secuencia de actualizaciones recibidas.
Tengo que reproducir este tipo de arquitectura de servidor de parámetros en otro entorno y necesito entender profundamente cómo los trabajadores y las tareas de PS interactúan entre sí dentro del marco de TensorFlow. Mi pregunta es, ¿la tarea PS realiza algún tipo de operación de fusión o actualización después de recibir el valor de los trabajadores o simplemente almacena el valor más nuevo? ¿Puede ser algo razonable simplemente almacenar el valor más nuevo? Mirando el código de la documentación de TensorFlow, veo que la tarea de PS solo hace un join() y me pregunto detrás de esta llamada de método cuál es el comportamiento completo de la tarea de PS.
Una pregunta más, ¿cuál es la diferencia entre calcular un degradado y aplicar un degradado?
Mostrar la mejor respuesta