¿Qué aspecto de los algoritmos de las redes de aprendizaje profundo requieren GPU además de, o en lugar de, CPU, y por qué?

Las CPU son muy rápidas, funcionan a 4 GHz más o menos, sin embargo, solo una pequeña fracción de su matriz, llamada FPU (unidad de punto flotante) está dedicada a las operaciones de punto flotante. El resto está dedicado a muchas otras funciones que la CPU debe realizar de manera rápida y eficiente, como instrucciones y búsqueda de datos, problema de fuera de servicio paralelo, manejo del flujo de control por predicción de rama, manejo de múltiples niveles de jerarquía de memoria, incluidos registros, Caches L1, L2 y mucho más.

Una CPU moderna de cuatro núcleos como Intel Core i7 tiene cuatro núcleos, que son CPU independientes en sí mismos. Además, cada núcleo tiene dos subprocesos (lógicos), que pueden verse nuevamente como CPU independientes. El resultado final es que Intel Core i7 puede realizar hasta 8 operaciones de FPU simultáneamente.

La diferencia entre hilos y núcleos es que los hilos comparten en gran medida los recursos, mientras que los núcleos son replicados e independientes. Uno puede ver el efecto de esta organización en comandos como ‘top’ en Linux, donde un solo chip de cuatro núcleos aparece como 8 CPU.

En contraste, una GPU como Nvidia GTX, o un chip AMD similar, tiene miles de FPU. Funcionan más lentamente que las CPU, pero su potencia proviene de la gran cantidad de unidades de procesamiento simples.

En una GPU, todas esas unidades están organizadas en tuberías simples, capaces de funcionar muy rápido para secuencias de instrucciones optimizadas especializadas con pocos saltos. En las CPU, también hay tuberías profundas, pero son muy complejas ya que tienen que manejar código arbitrario con potencialmente muchos saltos.

La técnica clave empleada por las CPU para los saltos se denomina predicción de ramificación, donde la CPU intenta adivinar literalmente el resultado de los saltos por adelantado. Las CPU modernas pueden hacer esto correctamente alrededor del 95% del tiempo, lo cual es sorprendente, si lo piensas por un momento.

En caso de que la CPU adivine incorrectamente, la consecuencia es una gran desaceleración en la velocidad de ejecución, ya que las instrucciones adivinadas incorrectamente restantes deben vaciarse y la tubería se llena nuevamente. Una penalización típica de predicción de rama de CPU contemporánea de más de 14 ciclos es sustancial, especialmente si se combina con errores de caché.

En las GPU, las tuberías se llenan de secuencias más secuenciales mediante código producido por varios algoritmos especializados, como gráficos o aprendizaje profundo. Las GPU también pueden evitar los saltos con frecuencia, utilizando una variedad de técnicas. Dicho esto, las GPU todavía tienen problemas de salto: en particular sufren de divergencia de rama, pero tienen otras técnicas para evitar el impacto en el rendimiento asociado con esto. Gran parte se puede evitar con algoritmos bien diseñados.

En resumen, las GPU son mucho más rápidas que las CPU para el aprendizaje profundo porque tienen órdenes de magnitud más recursos dedicados a operaciones de punto flotante, ejecutando algoritmos especializados que aseguran que sus tuberías profundas siempre estén llenas.

Si bien las GPU funcionan a frecuencias más bajas, por lo que no pueden realizar una tarea específica tan rápido como las CPU modernas, generalmente tienen muchas veces la cantidad de núcleos. Por lo tanto, podemos usarlos para tareas paralelas.
Casi todas las tareas realizadas en el proceso de capacitación y decodificación son operaciones matriciales. Multiplicar una matriz mxn (la matriz de peso) con una matriz nxb (vector de entrada como un mini lote) puede dividirse en m * b tareas separadas que pueden ser paralelas. Cuando tienes matrices grandes, esta aceleración se vuelve muy significativa. Otras compañías como NVIDIA han escrito algoritmos muy eficientes para el hardware que puede usar para estas aplicaciones (como la biblioteca cuBLAS).
Sin embargo, escribir sus propias funciones no es demasiado difícil y siempre es interesante escribir, ya que necesita pensar en cómo ejecutar estos trabajos en paralelo. Te daré un ejemplo de una función bastante simple. Supongamos que está tratando de implementar una capa LSTM, que tiene compuertas que se multiplican por elementos con “propuestas” para controlar el flujo de información. Cuando ahora multiplica por elementos dos matrices mxn desea ejecutar la misma llamada “función de núcleo” m * n veces. Estas funciones se envían a un cierto número de ‘bloques’ que tienen un cierto número de ‘hilos’.
En CUDA, esta función podría verse así:

__global__ void Kern_MulMatrix (float * lhPtr, float * rhPtr, int segLen, float * resPtr) {

int pos;
pos = (blockIdx.x * blockDim.x) + threadIdx.x;
if (pos resPtr [pos] = lhPtr [pos] * rhPtr [pos];
}
}

lhPtr apunta a la matriz que es la primera matriz y rhPtr apunta a la segunda matriz. segLen es igual a m * n.
“(BlockIdx.x * blockDim.x) + threadIdx.x” le da a cada núcleo ejecutado una ID diferente que comienza con 0.

Una GPU es bastante buena para Deep Learning, lo que le permite operar a su velocidad máxima donde los algoritmos normales podrían funcionar mucho mejor en una CPU.

Elementos de arquitectura específicos que tiene una GPU y se utiliza con el aprendizaje profundo:

  1. El ancho de banda de memoria de una GPU. Las GPU de gama alta tienen cientos de GB / s de ancho de banda de memoria externa donde una CPU tendrá decenas de GB / s.
  2. Longitud de un vector de cálculo. Típicamente, cualquier unidad de cómputo maneja 32 flotadores / reloj en una Gpu donde una CPU puede hacer 8 (usando AVX). Las últimas tarjetas de Nvidia incluso pueden hacer 64 medios flotadores por reloj.
  3. La cantidad de unidades de cálculo. Decenas para GPU de gama alta, y normalmente 4 para una computadora de escritorio i7.
  4. Bibliotecas altamente optimizadas. NVidia hizo un gran trabajo al proporcionar muy buenas bibliotecas de Deep Learning.
  5. Soporte Hyper Threading. Por lo general, se programan muchos más subprocesos en paralelo para ocultar las latencias (de memoria), donde un i7 solo admite dos hiperprocesos.

Entonces, en total, esto le da una gran ventaja a las GPU para el aprendizaje profundo.

Tenga en cuenta que no puede comparar directamente un núcleo de CPU con un núcleo Cuda, por lo que una GPU no es 1000 veces más rápida como podría indicar una comparación ingenua.

Las GPGPU son más capaces de realizar operaciones en matrices y vectores (que contienen números de coma flotante). Además, las GPU están optimizadas para un mayor rendimiento en lugar de latencia.

Las redes neuronales (y algunos otros algoritmos de aprendizaje automático) se pueden representar como gráficos computacionales (esto lo hacen bibliotecas como CUDA, Theano, TensorFlow, etc.) y, por lo tanto, se pueden identificar rutas independientes que se pueden ejecutar en paralelo.

Por lo tanto, las GPU definitivamente son computacionalmente más potentes para las tareas de Deep Learning.

Porque las CPU son increíblemente lentas en comparación con las GPU.

El Titan X (~ 6600 GFLOPS) es 17 veces más rápido que el i7-5960x (~ 380 GFLOPS) para cálculos de punto flotante de precisión simple. Hay tarjetas Quadro con proporciones similares para doble precisión. El único problema es que las GPU requieren un algoritmo altamente paralelo para aprovechar la velocidad.

Además, el Titan X solo usa aproximadamente el doble de potencia que un 5960x, lo que significa que tiene un rendimiento ~ 8x mejor por vatio.

Verá, los algoritmos de aprendizaje profundo no requieren el uso de una GPU, permiten el uso de uno.

Creo que es porque la red de aprendizaje consta de muchas operaciones matriciales y las GPU están diseñadas para realizarlas. (porque los cálculos gráficos también consisten en operaciones matriciales).

Las CPU normales se crean para realizar operaciones aritméticas lógicas o básicas y cada operación de matriz debe “traducirse” a operaciones simples para calcularla en la CPU, que es más lenta en comparación con la computación acelerada por hardware en la GPU

Las redes neuronales son inherentemente muy paralelas. Por lo tanto, las GPU son una opción natural para acelerarlas.

Una CPU seguirá funcionando, pero cuando comienzas a usar redes cada vez más grandes, se vuelve bastante lenta.

Respuesta simple,

La CPU es bazuca, mata una tarea Muy rápido

Gpu es ametralladora, mata muchas tareas rápido

La red neuronal tiene muchos pesos para actualizar en lugar de uno solo

Entonces, la respuesta de cuál es la mejor ahora depende de usted 😀

More Interesting

¿Cuáles son algunos buenos proyectos de aprendizaje automático que implican el uso de estructuras de datos y tienen aplicaciones de la vida real y se pueden hacer en 2-3 semanas?

¿Qué medida de evaluación fuera de línea para los sistemas de recomendación se correlaciona mejor con los resultados de la prueba AB en línea?

¿Cuál es la mejor manera de manejar múltiples brazos en algoritmos de bandidos?

Cómo construir un horario usando un algoritmo genético

¿Cuáles son algunos de los grandes usos de Google TensorFlow?

¿Cómo afectarán herramientas como BigML y Google Prediction API al aprendizaje automático? ¿Reducirá la demanda de científicos de datos?

¿Cómo cambio de una carrera de software integrado a una carrera en aprendizaje automático?

¿Me puede explicar sobre el aprendizaje automático? ¿Cuál es el alcance del aprendizaje automático?

¿Cuáles son los principales desafíos en el aprendizaje semi-supervisado?

¿Qué es la agrupación de datos?

¿La retropropagación de red neuronal de convolución utiliza un algoritmo en línea o un algoritmo por lotes?

¿Qué tan popular y extendido es el aprendizaje automático en África?

¿Cuáles son los algoritmos disponibles para diseñar un detector de actividad de habla hablada cercana?

¿Cómo se diseñan y desarrollan las nuevas arquitecturas de aprendizaje profundo?

¿Cómo podemos hacer que las redes profundas funcionen de manera eficiente en dispositivos de baja potencia (por ejemplo, teléfonos)?