¿Cuál es la mejor manera de distribuir el descenso de gradiente?

Por distribuir, ¿quiere decir “optimización distribuida mediante descenso de gradiente”? Si ese es el caso, hay muchas maneras de hacerlo. Una manera simple que probé es a continuación.

Si está trabajando con un conjunto de datos muy grande, y si está haciendo actualizaciones de mini lotes, una buena manera sería distribuir el cómputo en diferentes subprocesos (en una misma computadora) y en diferentes computadoras (incluso si es un mini- el lote es demasiado grande): cada uno de los subprocesos de todas las computadoras funciona solo en un sector / segmento particular del lote. Principalmente en tareas de ML, la actualización final del vector de peso (o la variable de optimización) se reduce a la suma de actualizaciones en cada uno de los sectores de un lote. Puede tener un hilo que combine todos esos cálculos distribuidos y luego actualizar los parámetros.

Multi-threading no será ningún problema, supongo. Para las comunicaciones a través de nodos (computadoras), puede usar cualquiera de las bibliotecas o herramientas estándar. Codifico solo en C ++. Y encontré que Lightweight Communications and Marshalling (LCM) es un buen paquete para hacer todas las comunicaciones a través de los nodos. Es muy fácil de usar y entender. Pero si está creando su propio clúster y tiene tiempo para el mismo, puede hacer openMP / openMPI.

Yo mismo implementé PEGASOS multiproceso y distribuido para SVM para entrenamiento en un conjunto de datos de 6.3 TB y el próximo conjunto de datos tendrá un tamaño cercano a 65 TB (más de 2 mil millones de puntos de datos y más de 1000 dimensiones). PEGASOS es un solucionador basado en subgrado para SVM. Los cálculos (para el conjunto de datos de 6,3 TB) se realizaron con 4 computadoras diferentes, cada una con 4 núcleos.

El tipo de arquitectura distribuida que desea construir depende de usted. Pero en lo que respecta al descenso de gradiente, todo lo que tiene que hacer es hacerlo funcionar en diferentes sectores de los datos que tenga y combinar el resultado final. No debería importar en absoluto si los cálculos se distribuyeron a través de las computadoras o con varios subprocesos en una sola. En mi caso, los cálculos en cada uno de los hilos también fueron multiproceso. Tenía un servidor central que tenía datos almacenados en 4 discos duros. También hubo un CV de 10 pliegues involucrados, por lo tanto, se necesitaban 4 computadoras, de lo contrario, una sola podría haber sido suficiente (PEGASOS multihilo).

¡Buena suerte!

Este es un campo de investigación activo, y no voy a intentar resumirlo. En cambio, te daré consejos sobre las ideas básicas. Alguien más que trabaje activamente en el campo puede intentar dar respuestas más actualizadas.

HogWild! resume las ideas principales necesarias y debería funcionar para aplicaciones generales. http://www.eecs.berkeley.edu/~br

Para algoritmos específicos como el aprendizaje profundo o la factorización matricial, se han desarrollado muchos algoritmos de propósito especial.
Para la factorización matricial, consulte NOMAD y sus variantes http://www.vldb.org/pvldb/vol7/p

Para problemas basados ​​en gráficos, puede consultar GraphLab https://dato.com/ , que distribuyó el descenso de gradiente de forma natural.

Galois (Grupo ISS de la Universidad de Texas) es algo que podría usar si está usando MPI.
[Estoy sesgado con respecto a este último, ya que este grupo también es de UT Austin, pero creo que Galois es excelente y sus documentos muestran un rendimiento impresionante sobre Graphlab y otras implementaciones distribuidas]

Ver también: ¿Cuáles son algunos algoritmos de descenso de gradiente paralelo?