¿Cómo funciona “tf.train.replica_device_setter”?

Comprendí que tf.train.replica_device_setter se puede usar para asignar automáticamente las variables siempre en el mismo servidor de parámetros (PS) (usando round-robin) y los nodos de cómputo intensivo en un trabajador.

¿Cómo se reutilizan las mismas variables en múltiples réplicas de gráficos, construidas por diferentes trabajadores? ¿El servidor de parámetros solo mira el nombre de la variable que solicita un trabajador?

¿Significa esto que las tareas no deben usarse en paralelo para la ejecución de dos gráficos diferentes si en ambos gráficos las variables tienen el mismo nombre?

El tf.train.replica_device_setter() es bastante simple en su comportamiento: toma la decisión puramente local de asignar un dispositivo a cada tf.Variable medida que se crea, de forma tf.Variable en todas las tareas del servidor de parámetros.

En la versión distribuida de TensorFlow, cada dispositivo (por ejemplo, "/job:ps/task:17/cpu:0" ) mantiene un mapa de nombres de variables a variables que se comparte entre todas las sesiones que usan este dispositivo. Esto significa que cuando diferentes réplicas de trabajadores crean una sesión usando ese dispositivo, si asignan la misma variable simbólica (que tiene la misma propiedad de Variable.name ) al mismo dispositivo, verán las actualizaciones de cada uno.

Cuando realiza “replicación entre gráficos” en varias réplicas, tf.train.replica_device_setter() proporciona una forma sencilla y determinista de asignar variables a los dispositivos. Si creas un gráfico idéntico en cada réplica de trabajador, cada variable se asignará al mismo dispositivo y se compartirá con éxito, sin ninguna coordinación externa.

Advertencia: con este esquema, las réplicas de los trabajadores deben crear un gráfico idéntico *, y no debe haber aleatoriedad en la forma en que se construye el gráfico. Una vez vi un problema en el que el orden de creación de las variables se determinaba mediante la iteración de las claves de un dict Python, que no se garantiza que ocurra en el mismo orden en todos los procesos. Esto llevó a diferentes variables a ser asignadas a diferentes dispositivos PS por diferentes trabajadores …

En cuanto a su otra pregunta, debe tener cuidado con los choques de nombres de variables cuando entrene varios modelos utilizando los mismos procesos. De forma predeterminada, todas las variables se comparten en un espacio de nombres global, por lo que dos variables de diferentes redes con el mismo nombre entrarán en conflicto. Una forma de mitigar este problema es envolver cada modelo en un with tf.container(name): (con diferentes valores para el name , por ejemplo, "model_1" y "model_2" ) para colocar las variables en un espacio de nombres diferente, lo que se denomina Un “contenedor” en la jerga de TensorFlow. Puede pensar en un contenedor como un prefijo que se agrega al nombre de todas sus variables cuando se buscan en el dispositivo. El soporte para contenedores en la API es todavía bastante preliminar, pero hay planes para hacerlos más útiles en el futuro.


* Técnicamente, solo necesitan crear sus tf.Variable objetos en la misma secuencia.