Cómo comenzar a usar GPU para el aprendizaje profundo

De hecho, puedo relacionarme con esta pregunta. Una vez estuve en esta situación yo mismo. Ahora supongo que tiene sus antecedentes teóricos cubiertos en el aprendizaje profundo, y conoce todas las cosas matemáticas detrás de la mayoría de las arquitecturas de redes profundas, por ejemplo, redes totalmente conectadas, codificadores automáticos, redes, etc.

Necesitaba la implementación de la GPU, ya que estoy en el inicio de la robótica, y hago una gran visión por computadora e investigación de IA. Mi teoría siempre fue muy fuerte, pero tengo algo de semana en programación. Estaba haciendo un poco de investigación de visión por computadora, y los algoritmos no podían usarse para cálculos en tiempo real, ya que eran lentos en las CPU (soy dueño de una placa de clase de servidor único con Z10PE-D16 con dos procesadores Xeon 2620 v3). Por lo tanto, tenía recursos informáticos limitados para asignar a cada uno de los algoritmos que operan en el robot. Entonces fue cuando finalmente decidí aprender CUDA, después de muchas postergaciones.

Ahora también tenía limitaciones de tiempo. Simplemente no podía permitirme dar más de 2 o 3 días para aprender CUDA, ya que eso habría afectado la investigación que estaba haciendo. Entonces, después de mucho buscar, encontré un curso de programación CUDA en Udacity. Este curso comienza desde cero y luego se acumula. No necesita pasar por todo el curso para poder comprender CUDA y programar las GPU. Ahora no recuerdo cuánto del curso seguí, pero sé que fue menos del 50% del curso. Eso era mucho más de lo que necesitaba. Después de eso, cuando aprendí el CUDA básico, comencé a implementar algoritmos en CUDA. Finalmente, comencé a progresar en CUDA y me volví muy bueno en eso. Descubrí algunas implementaciones específicas cuando las necesitaba en mi investigación.

Ahora, codifico regularmente los núcleos de red profunda en las GPU. Por ejemplo, he codificado por completo una información general (lo que significa que permite al usuario especificar las unidades de activación y la cantidad de capas y la cantidad de unidades en cada capa, y hace el resto del trabajo) de alimentación completamente conectada arquitectura neta desde cero en CUDA. También es eficiente en memoria, aunque no lo he comparado con las bibliotecas. Actualmente estoy escribiendo una arquitectura CNN general en C ++ / CUDA. De todos modos, mi implementación, durante el entrenamiento, se ejecuta tan rápido como las bibliotecas modernas. Por ejemplo, uno de mis pasantes codificó una arquitectura de red profunda usando theano, e hice lo mismo desde cero en CUDA / C ++. Ambos corrieron en el mismo hardware, y los tiempos de procesamiento por lotes fueron casi los mismos.

Además, si desea tener un control total sobre todos y cada uno de los parámetros de su arquitectura (por ejemplo, durante las pruebas, ya que el tiempo de entrenamiento no importa mucho, si no es en meses o días) y tener un control muy fino sobre asignación de memoria, tendrá que codificar su red profunda en CUDA. Recientemente desarrollé una nueva arquitectura de red profunda, para el rendimiento en tiempo real usando una sola GPU GTX 970, para la tarea de detección de carreteras, para lograr el rendimiento de clasificación en tiempo real, escribí los núcleos por mi cuenta.

Pero para hacer / aprender todo esto, ese curso de Udacity es lo único que solía estudiar formalmente CUDA y eso también solo el 50% de ese curso. Ese curso le enseñará todo lo necesario para que pueda escribir sus núcleos.


Ahora, si está buscando algo que le permita entrenar arquitecturas complejas sin necesidad de codificar sus propios núcleos de red profunda, para capacitación y pruebas, puede usar theano, caffe o antorcha. Para las CNN, puede específicamente cuda-convnet. Cuda-Convnet admite muchas unidades de activación diferentes y un número arbitrario de capas, y supongo que muchas opciones de agrupación diferentes (máximo, promedio, L2). Pero no estoy seguro, ya que personalmente no he usado estas bibliotecas, solo codifico en C ++ y CUDA.

Pero de todos modos, si trabaja en visión y robótica, será beneficioso aprender al menos un poco de CUDA. Pero si las pruebas en tiempo real no son su objetivo, puede concentrarse por completo en las bibliotecas, sin preocuparse por cómo se realiza toda la codificación cuda de bajo nivel. Pero si vas a ese curso de CUDA sobre udacity, creo que todo el curso necesario se puede hacer en pocas horas.


Eso es todo lo que diré, no hay detalles adicionales en su pregunta, en cuanto a cuál es su objetivo específico. También he dejado en claro mi experiencia en programación antes de comenzar CUDA.

¡Buena suerte!

Creo que algunas respuestas aquí han mencionado que ya usan otras bibliotecas como TensorFlow o Torch. Dado que las GPU son buenas para acelerar los algoritmos paralelos, como los algoritmos de aprendizaje que usan operaciones de matriz y vectores, puede construir sus propias bibliotecas usando C \ C ++, que podría hacer uso de los lenguajes de sombreado para acelerar algunas operaciones de matriz y vectores.

También puede usar la API OpenMP para entornos informáticos de múltiples núcleos para distribuir los cálculos entre múltiples núcleos de procesamiento.

Construir su propia biblioteca de ML es bastante satisfactorio, pero también consume mucho tiempo y es muy engorroso, por lo que debe tener una razón adecuada para ello.

Por lo tanto, solo use TensorFlow, en realidad lo estoy aprendiendo para poder usarlo en proyectos futuros que necesiten algo de potencia bruta de GPU.

Espero que esto ayude.

¿Te refieres desde el punto de vista teórico?
Las redes neuronales realizan análisis del grado de mapeo de una función a otra. Podemos representar funciones como vectores. Una GPU es buena en el manejo de vectores. Por lo tanto, debe aprender a usar una GPU para manejar vectores y luego usar sus capacidades para manejar el cálculo del grado de coincidencia entre dos vectores. Esa es la descripción general. No hay mucho espacio para escribir un tratado sobre la práctica de este arte.
El siguiente aspecto es que el aprendizaje profundo implica diferentes arquitecturas, cada una buena para la aplicación a un dominio particular de problemas. Deberá llegar a comprender cómo hacer que las arquitecturas utilicen vectores para el aprendizaje y luego implementar una arquitectura en el mecanismo proporcionado por las capacidades de manejo de vectores de una GPU.
Como señala Angus Zhang, busca esto en el ecosistema de CUDA.

Si simplemente quiere “usarlo”, simplemente elija un marco, como Torch o TensorFlow, y “encienda” la GPU en el script. Eso es.

Si desea usarlo de manera genérica, puede ser una buena idea comenzar leyendo el código fuente en Torch y ver cómo se usa la GPU.

Si desea utilizar GPU en el aprendizaje profundo, podría tener en cuenta CUDA.