¿Cuáles son algunas implementaciones de SGD distribuidas?

Respuesta corta: mire “Downpour SGD” o “asynchronous SGD”.

Hacer que SGD sea distribuido es bastante desafiante. Asumiré que está preguntando en el contexto de las redes neuronales.

Entrenar redes neuronales con SGD en una computadora con múltiples núcleos o una GPU es bastante fácil (en el sentido de que, para hacerlo bien desde cero, solo necesitas ser un experto en programación de GPU, pero puedes usar herramientas existentes como Theano si , como yo, no lo eres). Puede paralelizar el modelo (haga su multiplicación de matriz o convolución en paralelo) o sus datos (haga todos los elementos de su lote en paralelo).

Las verdaderas dificultades comienzan cuando quieres intentar entrenar de una manera distribuida en un clúster. El problema es (según tengo entendido) que, sea cual sea la forma en que lo corte, tendrá dificultades con el ancho de banda que tiene para comunicarse entre los nodos.

Nuevamente, podemos hacer paralelismo de modelos o paralelismo de datos.

Paralelismo de datos : suponga que coloca una réplica del modelo en cada nodo y calcula el gradiente para diferentes datos en cada uno. ¡Ahora cada nodo tiene un número real para cada parámetro en su modelo que necesitan compartir con cada otro nodo! Bueno, probablemente no pueda hacer eso en cada paso, por lo que actualiza los parámetros dentro del nodo y realiza otro paso. Después de unos pocos pasos, la réplica de su modelo podría haber divergido bastante de las réplicas en los otros nodos. ¿Cómo fusionar estos modelos divergentes de nuevo juntos? Bueno, lo natural es promediarlos, pero si han divergido demasiado, el promedio de los parámetros puede que ya no sea un buen modelo.

Paralelismo modelo : podría dividir su modelo en trozos. Tal vez pones cada capa en un nodo diferente. Ahora, no necesitan hablar con nadie más al actualizar los parámetros. ¡Pero todavía tienen una cantidad gigantesca de información para transmitir, tanto en el pase hacia adelante como en la retroproyección! Para una capa convolucional, ¡esto puede ser fácilmente un orden de magnitud peor que pasar actualizaciones a los parámetros!

Entonces, ambos enfoques son desafiantes.

El gran artículo sobre la formación paralela de redes neuronales es Redes profundas distribuidas a gran escala de Dean et al. , que describe la infraestructura DistBelief de Google para entrenar redes neuronales. Usan modelo y paralelismo de datos. Para el paralelismo de datos, describen dos algoritmos: Downpour SGD y Sandblaster L-BFGS.

“Downpour SGD” parece ser más usado que “Sandblaster L-BFGS”, pero el nombre no parece haber sobrevivido al papel. Ahora todos simplemente lo llaman SGD asíncrono o nombres similares.

En la práctica, la mayoría de los grupos no usan estas técnicas en este momento porque son difíciles de usar correctamente, y solo unos pocos grupos, como el grupo de Google, tienen la infraestructura, la experiencia en sistemas distribuidos y la experiencia de aprendizaje profundo para usarlas realmente.

En cualquier caso, “Downpour SGD” es lo que quieres.

La solución que probé para implementar SGD fue dividir el componente paralelo del componente secuencial. Esto redujo la carga de trabajo en el componente secuencial. Y hay una implementación paralela de SGD disponible.
Los siguientes documentos lo explican bastante bien.
Página en rutgers.edu

Google tiene uno llamado Downpour SGD.
Página en googleusercontent.com