Cómo evaluar el último marco de aprendizaje profundo cxxnet
Este artículo presenta el diseño de redes neuronales profundas paralelas. Entre los dos proyectos de aprendizaje automático lanzados este año, cxxnet es el más interesante. Porque contiene lo último en todos los aspectos del aprendizaje automático y los sistemas que nuestro equipo puede aprovechar: además del aprendizaje profundo de vanguardia, sus dos características únicas también nos hacen disfrutar al máximo del diseño y la implementación.
1 ) Soporte de fórmulas flexibles y programación de plantillas C definitiva;
La implementación de redes neuronales profundas se puede dividir aproximadamente en dos categorías: el grupo de eficiencia de programación basado en Python y la búsqueda del rendimiento representado por C como grupo central . El primero admite cálculos tensoriales directos, mientras que el segundo a menudo requiere escribir núcleos cuda independientes para cada capa de red neuronal y fórmulas de actualización. Los defensores de la eficiencia de la programación creen que los programadores de aprendizaje automático deberían escribir fórmulas para lograr la máxima legibilidad y facilidad de reescritura del código. La razón por la que muchos códigos de núcleo C no admiten cálculos de tensor muy flexibles es porque la sobrecarga del operador y la asignación temporal de espacio reducirán la eficiencia.
El núcleo mshadow de cxxnet logra un equilibrio entre los dos. Esto nos permite utilizar tecnología de programación de plantillas para permitir a los desarrolladores escribir código similar a matlab/numpy sin perder eficiencia y expandirlo automáticamente a un kernel optimizado durante la compilación. La tecnología de plantilla de expresión detrás de esto es uno de mis trucos C favoritos. Es muy digno de ser comprendido por estudiantes que buscan abstracción eficiente y elegancia.
Debido a que mshadow se utiliza como núcleo, varias implementaciones de cxxnet pueden ser muy simples y legibles. Puede escribir un código y ejecutarlo en GPU y CPU. Hacer el código más simple y extensible.
2) Esquema universal de actualización y uso compartido de parámetros paralelos
La informática multitarjeta y multimáquina siempre ha sido un tema apasionante en el aprendizaje automático a gran escala. Cuando se trata de paralelismo de redes neuronales, lo que más me preocupa es que hay muchas opciones para elegir y todas implican diferentes trucos. Cuando usamos varias tarjetas en una sola máquina, ¿deberíamos usar P2P, copiar a la memoria o usar la transmisión para iniciar subprocesos múltiples? ¿Deberíamos utilizar un servidor de parámetros, MPI o escribir nuestro propio marco para la distribución? Hay muchas opciones para elegir. No es difícil diseñar un código distribuido. Lo difícil es cómo hacer que la interfaz paralela sea naturalmente independiente para que no afecte la implementación de otras partes. Después de una consideración constante, finalmente decidí usar mshadow-ps, una interfaz unificada para compartir parámetros.
En pocas palabras, mshadow-ps es una interfaz de servidor de parámetros asíncronos de GPU (debería ser la única hasta ahora, porque el modelo de subproceso de GPU es diferente al de la CPU y la biblioteca ps original no puede ser utilizado directamente en la GPU) ). La comunicación asincrónica es muy importante para las actualizaciones de redes neuronales. En el algoritmo backprop, podemos obtener el gradiente muy temprano y realizar la sincronización del gradiente, y este peso solo será necesario cuando se reenvíe a la capa correspondiente la próxima vez.
Limu y yo colaboramos para diseñar tres interfaces estilo ps para resolver dichos problemas de sincronización, Push/PullReq y Pullwait. Al obtener el gradiente de backprop, llame directamente a push para enviar el gradiente y llame a pullreq para solicitar el resultado. Push y Pullreq son operaciones asincrónicas y habrá un hilo separado detrás de ellas para completar la sincronización de copia de datos y las operaciones de copia de seguridad al mismo tiempo. Y cuando necesitamos peso, llamamos a Pullwait para esperar operaciones que quizás no se completen. Tres interfaces tan simples nos permiten diseñar redes neuronales distribuidas y de múltiples tarjetas con muy pocos cambios, y no es necesario implementar ninguna sincronización de relaciones al llamar a estas interfaces.
Cabe mencionar que este modelo de programación combina directamente múltiples GPU, distribución y varios marcos de comunicación. mshadow-ps admite GPU PS de múltiples tarjetas para una sola máquina, así como la implementación de PS distribuida basada en el servidor de parámetros. De manera similar, MPI puede admitir fácilmente la comunicación entre varias máquinas. Esto permite una interfaz unificada para admitir varias implementaciones de back-end, desde múltiples tarjetas en una sola máquina hasta distribuidas. Y debido a la comunicación asincrónica eficiente, podemos lograr una aceleración lineal en Alexnet (Nota: la dificultad del paralelismo radica en la relación de tiempo de cálculo y comunicación. Las redes más complejas con menos peso son más fáciles de acelerar linealmente, y Alexnet es un ejemplo muy difícil ).
Después de los continuos esfuerzos de todos en el equipo, la V2 de cxxnet finalmente puede satisfacer a todos. Además de los aspectos técnicos destacados presentados anteriormente, también hay varias características interesantes. Ahora las características se resumen a continuación:
1. Marco liviano y completo: hacemos todo lo posible para mantener las bibliotecas dependientes más pequeñas para lograr la mayor cantidad de funciones. El entorno recomendado solo requiere la compilación de CUDA, OpenCV, MKL o BLAS.
2. Potente interfaz de computación paralela unificada: la interfaz de computación paralela basada en mshadow-ps utiliza un código para resolver la sincronización asincrónica de múltiples GPU y múltiples máquinas. La sincronización y el cálculo se superponen y se pueden obtener aceleraciones lineales en múltiples pruebas.
3. Estructura de código fácilmente escalable: el núcleo informático de cxxnet lo proporciona mshadow. Mshadow permite a los usuarios escribir código de estilo numpy/matlab pero aún tener la flexibilidad de optimizar manualmente el código CUDA. La CPU y la GPU comparten el mismo código, que se traduce automáticamente en llamadas CUDA/MKL a través de plantillas durante la compilación.
Algunas otras características incluyen:
4. Compatibilidad con CuDNN: compatibilidad con convolución nativa de Nvidia, que puede acelerar los cálculos en 30.
5. La última tecnología actualizada de manera oportuna: seguiremos de inmediato los desarrollos en la comunidad académica, como ParametricRelu de MSRA y Batch Normalization de Google, que ahora son compatibles.
6. Conversión de modelos Caffe: admite la conversión de modelos Caffe entrenados directamente en modelos cxxnet (¡se lanzará esta semana!)
7. Interfaz de lenguaje conveniente: la capacitación se puede realizar directamente en Python para una fácil visualización. Matlab también lo proporcionará pronto.
Creemos que la implementación eficiente de una red neuronal profunda en C se puede completar mediante el código más conciso y claro. También damos la bienvenida a estudiantes interesados en sistemas y aprendizaje automático a unirse al proyecto