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.
-
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 deBetween-graph replication
? En caso afirmativo, ¿dónde están los códigos correspondientes en los ejemplos proporcionados? -
Si bien ya hay un ejemplo de
Between-graph replication
en el enlace anterior, ¿alguien podría proporcionar una implementación deIn-graph replication
(el pseudocódigo está bien) y resaltar sus principales diferencias con respectoBetween-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:
-
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
? -
¿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 laBetween-graph replication
para el entrenamiento entre máquinas? Hago esta pregunta porque @mrry indicó que laIn-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:
-
¿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 detf.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 objetostf.Session
que comparten el mismo gráfico subyacente, siempre que haya configurado la opcióntf.ConfigProto.device_filters
para cada sesión de manera diferente, pero esto es una configuración poco común). -
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).
-
¿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).
-
¿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.