graph tensorflow distributed

graph - Tensorflow distribuido: la diferencia entre la replicación en gráfico y la replicación entre gráfico



distributed (1)

Me confundí acerca de los dos conceptos: In-graph replication y In-graph replication Between-graph replication al leer la capacitación replicada en el tutorial 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 s 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 hay un ejemplo de Between-graph replication en el enlace anterior, ¿alguien podría proporcionar una implementación de In-graph replication (el pseudocódigo está bien) y resaltar sus principales diferencias con respecto 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 buscar sus respuestas, tengo las siguientes dos preguntas:

  1. Existe la siguiente declaración en el entrenamiento replicado :

    Replicación entre gráficos. En este enfoque, hay un cliente separado para cada / trabajo: tarea del trabajador, típicamente en el mismo proceso que la tarea del trabajador. Cada cliente crea un gráfico similar que contiene los parámetros (anclados a / job: ps como antes, usando tf.train.replica_device_setter () para asignarlos determinísticamente a las mismas tareas); y una copia única de la parte de cómputo intensiva del modelo, anclada a la tarea local en / trabajo: trabajador.

    Tengo dos subpreguntas relacionadas con las palabras anteriores en negrita.

    (A) ¿Por qué decimos que cada cliente crea un gráfico similar , pero no el mismo gráfico ? Me pregunto que el gráfico construido en cada cliente en el ejemplo de capacitación replicada debería ser el mismo porque los códigos de construcción del gráfico a continuación se comparten entre todos los worker :

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

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

  2. ¿El ejemplo en Entrenamiento replicado admite entrenamiento en múltiples máquinas, cada una de las cuales tiene múltiples GPU? Si no es así, ¿podemos usar simultáneamente 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? Hago esta pregunta porque @mrry indicó que la In-graph replication es esencialmente la misma que se usa en el modelo de ejemplo CIFAR-10 para múltiples GPU .


En primer lugar, para algún contexto histórico, la "replicación en el 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 más complicado "entre gráficos" es el actual forma recomendada de realizar entrenamiento distribuido. Las bibliotecas de nivel superior como tf.learn utilizan el enfoque "entre gráficos" para la capacitación distribuida.

Para responder a sus preguntas específicas:

  1. ¿Significa esto que hay múltiples tf.Graph s 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 TensorFlow separado para cada réplica de trabajo, y cada uno de estos generará un tf.Graph para el modelo. Por lo general, cada proceso utiliza el gráfico predeterminado global (accesible a través de tf.get_default_graph() ) y no se crea explícitamente.

    (En principio, podría usar un solo proceso TensorFlow con el mismo tf.Graph y múltiples objetos tf.Session que comparten el mismo gráfico subyacente, siempre que haya configurado 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 hay un ejemplo de replicación entre gráficos en el enlace anterior, ¿alguien podría proporcionar una implementación de replicación en gráfico (el pseudocódigo está bien) y resaltar sus principales diferencias con respecto a la replicación entre gráficos?

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

    El único lugar donde persiste la replicación en el gráfico es usar múltiples 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 bucle sobre dispositivos GPU here ).

(En mi opinión, la inconsistencia entre cómo se tratan múltiples trabajadores y múltiples dispositivos en un solo trabajador es desafortunada. La replicación en 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 puede crear operaciones adicionales que no son creadas (o utilizadas por) los trabajadores no principales. Sin embargo, en la mayoría de los casos, los gráficos son lógicamente (es decir, asignaciones de dispositivos de módulo) iguales.

    ¿No deberían ser copias múltiples de la parte de computación intensiva del modelo, ya que tenemos múltiples trabajadores?

    Por lo general, cada trabajador tiene un gráfico separado que contiene una copia única de la parte del modelo que requiere mucho cálculo. 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 usa la replicación entre gráficos para la capacitación distribuida y la replicación en el gráfico para usar múltiples GPU en cada trabajador. En ese caso, el gráfico para un trabajador típicamente 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 Entrenamiento replicado admite entrenamiento en múltiples máquinas, cada una de las cuales tiene múltiples GPU?

    El código de ejemplo solo cubre el entrenamiento en múltiples 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.