Tensorflow distribuido: la diferencia entre la replicación In-graph y la replicación entre gráficos

Me confundí sobre los dos conceptos: la In-graph replication y la In-graph replication Between-graph replication al leer el entrenamiento Replicado en el How-to oficial de tensorflow.

  1. Se dice en el enlace de arriba que

    Replicación en el gráfico. En este enfoque, el cliente crea un tf.Graph único que contiene un conjunto de parámetros (en tf. Nodos variables anclados a / job: ps); …

    ¿Esto significa que hay múltiples tf.Graph en el enfoque de Between-graph replication ? En caso afirmativo, ¿dónde están los códigos correspondientes en los ejemplos proporcionados?

  2. Si bien ya existe un ejemplo de Between-graph replication en el enlace anterior, ¿podría alguien proporcionar una implementación de In-graph replication (el pseudo código es correcto) y resaltar sus principales diferencias de la Between-graph replication ?

    ¡Gracias por adelantado!


Edit_1: más preguntas

¡Muchas gracias por sus explicaciones detalladas y el código esencial @mrry @YaroslavBulatov! Después de mirar sus respuestas, tengo las siguientes dos preguntas:

  1. Existe la siguiente statement en la capacitación Replicada :

    Replicación entre gráficas. En este enfoque, existe un cliente separado para cada tarea / trabajo: trabajador, generalmente en el mismo proceso que la tarea de trabajo. Cada cliente crea un gráfico similar que contiene los parámetros (fijado a / job: ps como antes utilizando tf.train.replica_device_setter () para asignarlos de manera determinística a las mismas tareas); y una copia única de la parte del modelo con uso intensivo de cómputo, anclado a la tarea local en / job: worker.

    Tengo dos subpreguntas relacionadas con las palabras anteriores en negrita.

    (A) ¿Por qué decimos que cada cliente construye un gráfico similar , pero no el mismo gráfico ? Me pregunto si la gráfica construida en cada cliente en el ejemplo de la capacitación Replicada debería ser la misma porque debajo de los códigos de construcción de gráficos se comparten todos los worker :

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

    (B) ¿No deberían ser varias copias de la parte del modelo que requiere mucha computación, ya que tenemos varios workers ?

  2. ¿El ejemplo en el entrenamiento Replicado admite el entrenamiento en máquinas múltiples, cada una de las cuales tiene múltiples GPU? De lo contrario, ¿podemos usar simultáneamente tanto la In-graph replication para admitir el entrenamiento en múltiples GPU en cada máquina y la Between-graph replication para el entrenamiento entre máquinas? Formulo esta pregunta porque @mrry indicó que la In-graph replication es esencialmente igual a la utilizada en el modelo de ejemplo CIFAR-10 para múltiples GPU .

En primer lugar, para algunos contextos históricos, la “replicación en gráfico” es el primer enfoque que probamos en TensorFlow, y no logró el rendimiento que requerían muchos usuarios, por lo que el enfoque “entre gráficos” más complicado es el actual forma recomendada de realizar entrenamiento distribuido. Las bibliotecas de nivel superior como tf.learn usan el enfoque “entre gráficas” para el entrenamiento distribuido.

Para responder a sus preguntas específicas:

  1. ¿Esto significa que hay múltiples tf.Graph en el enfoque de replicación entre gráficos? En caso afirmativo, ¿dónde están los códigos correspondientes en los ejemplos proporcionados?

    Sí. La configuración típica de replicación entre gráficos utilizará un proceso separado de TensorFlow para cada réplica de trabajador, y cada uno de estos generará un tf.Graph por separado para el modelo. Por lo general, cada proceso utiliza el gráfico global predeterminado (accesible a través de tf.get_default_graph() ) y no se crea explícitamente.

    (En principio, puede usar un único proceso TensorFlow con el mismo tf.Graph y múltiples objetos de tf.Session que comparten el mismo gráfico subyacente, siempre y cuando configure la opción tf.ConfigProto.device_filters para cada sesión de manera diferente, pero esto es una configuración poco común).

  2. Si bien ya existe un ejemplo de replicación entre gráficos en el enlace anterior, ¿podría alguien proporcionar una implementación de replicación en un gráfico (el seudocódigo es correcto) y resaltar sus principales diferencias de la replicación entre gráficos?

    Por razones históricas, no hay muchos ejemplos de replicación en el gráfico ( la esencia de Yaroslav es una excepción). Un progtwig que utiliza la replicación en un gráfico generalmente incluye un bucle que crea la misma estructura de gráfico para cada trabajador (por ejemplo, el bucle en la línea 74 de la esencia ), y usa el intercambio de variables entre los trabajadores.

    El único lugar donde persiste la replicación en el gráfico es para usar varios dispositivos en un solo proceso (por ejemplo, múltiples GPU). El modelo de ejemplo CIFAR-10 para múltiples GPU es un ejemplo de este patrón (consulte el ciclo sobre dispositivos GPU aquí ).

(En mi opinión, la incoherencia entre cómo se tratan múltiples trabajadores y dispositivos múltiples en un solo trabajador es desafortunada. La replicación en un gráfico es más fácil de entender que la replicación entre gráficos, porque no se basa en el intercambio implícito entre las réplicas. Las bibliotecas de nivel superior, como tf.learn y TF-Slim, ocultan algunos de estos problemas y ofrecen la esperanza de que podamos ofrecer un mejor esquema de replicación en el futuro).

  1. ¿Por qué decimos que cada cliente construye un gráfico similar , pero no el mismo gráfico?

    Porque no se requiere que sean idénticos (y no hay una verificación de integridad que haga cumplir esto). En particular, cada trabajador puede crear un gráfico con diferentes asignaciones explícitas de dispositivos ( "/job:worker/task:0" , "/job:worker/task:1" , etc.). El jefe de trabajadores podría crear operaciones adicionales que no sean creadas (o utilizadas por) los trabajadores no jefes. Sin embargo, en la mayoría de los casos, los gráficos son lógicamente (es decir, asignaciones de dispositivo de módulo) iguales.

    ¿No deberían ser múltiples copias de la parte de cálculo intensivo del modelo, ya que tenemos varios trabajadores?

    Por lo general, cada trabajador tiene un gráfico separado que contiene una copia única de la parte del modelo que requiere mucha computación. El gráfico para el trabajador i no contiene los nodos para el trabajador j (suponiendo que i ≠ j). (Una excepción sería el caso en el que utiliza la replicación entre gráficas para el entrenamiento distribuido y la replicación en gráficas para usar múltiples GPU en cada trabajador. En ese caso, el gráfico para un trabajador normalmente contendría N copias del cálculo -intensiva parte del gráfico, donde N es el número de GPU en ese trabajador).

  2. ¿El ejemplo en el entrenamiento Replicado admite el entrenamiento en máquinas múltiples, cada una de las cuales tiene múltiples GPU?

    El código de ejemplo solo cubre el entrenamiento en varias máquinas y no dice nada sobre cómo entrenar en múltiples GPU en cada máquina. Sin embargo, las técnicas se componen fácilmente. En esta parte del ejemplo:

     # Build model... loss = ... 

    … podría agregar un bucle sobre las GPU en la máquina local, para lograr la capacitación distribuida de múltiples trabajadores, cada uno con múltiples GPU.

Intereting Posts