Elegir entre CPU y GPU para entrenar una red neuronal

29

He visto discusiones sobre la 'sobrecarga' de una GPU, y que para redes 'pequeñas', en realidad puede ser más rápido entrenar en una CPU (o red de CPU) que en una GPU.

¿Qué se entiende por 'pequeño'?

Por ejemplo, ¿sería un MLP de una sola capa con 100 unidades ocultas 'pequeño'?

¿Cambia nuestra definición de "pequeño" para arquitecturas recurrentes?

¿Hay algún otro criterio que deba considerarse al decidir entrenar en CPU o GPU?

EDITAR 1:

Acabo de encontrar una publicación de blog (¿posiblemente desactualizada? Es de 2014):

"... La mayoría de las tarjetas de red solo funcionan con la memoria que está registrada en la CPU, por lo que la transferencia de GPU a GPU entre dos nodos sería así: GPU 1 a CPU 1 a Tarjeta de red 1 a Tarjeta de red 2 a CPU 2 a GPU 2. Lo que esto significa es que si uno elige una tarjeta de red lenta, entonces no puede haber aceleraciones en una sola computadora. Incluso con tarjetas de red rápidas, si el clúster es grande, uno ni siquiera obtiene aceleraciones de GPU en comparación a las CPU, ya que las GPU simplemente funcionan demasiado rápido para que las tarjetas de red puedan seguirlas.

Esta es la razón por la cual muchas grandes empresas como Google y Microsoft están utilizando CPU en lugar de grupos de GPU para entrenar sus grandes redes neuronales. "

Entonces, en algún momento, según esta publicación, podría haber sido más rápido usar CPU. ¿Sigue siendo el caso?

EDIT 2: Sí, esa publicación de blog puede estar desactualizada porque:

Ahora parece que las GPU dentro de un nodo están conectadas a través del bus PCIe, por lo que la comunicación puede ocurrir a aproximadamente 6GiB / s. (Por ejemplo: https://www.youtube.com/watch?v=el1iSlP1uOs , aproximadamente 35 minutos). El orador implica que esto es más rápido que pasar de GPU1 a CPU a GPU2. Significaría que la tarjeta de red ya no es el cuello de botella.

EstadísticasSorceress
fuente
Ese tipo con su publicación de blog saca buenos puntos. No entendí todas sus justificaciones. Sin embargo, el hecho de que Google, Facebook, Twitter y todos los principales grupos de aprendizaje profundo en la academia ejecutan sus códigos principalmente en GPU sugiere que es una buena idea. Aunque sesgado: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Respuestas:

28

A diferencia de algunas de las otras respuestas, recomendaría no entrenar siempre en GPU sin pensarlo dos veces. Esto se debe al uso de métodos de aprendizaje profundo en imágenes y textos, donde los datos son muy ricos (por ejemplo, muchos píxeles = muchas variables) y el modelo tiene muchos millones de parámetros. Para otros dominios, este podría no ser el caso.

¿Qué se entiende por 'pequeño'? Por ejemplo, ¿sería un MLP de una sola capa con 100 unidades ocultas 'pequeño'?

Sí, eso es definitivamente muy pequeño para los estándares modernos. A menos que tenga una GPU adecuada para el entrenamiento (por ejemplo, NVIDIA 1080 o NVIDIA Titan), no me sorprendería descubrir que su CPU fue más rápida.

Tenga en cuenta que la complejidad de su red neuronal también depende de su número de características de entrada, no solo del número de unidades en su capa oculta. Si su capa oculta tiene 100 unidades y cada observación en su conjunto de datos tiene 4 características de entrada, entonces su red es pequeña (~ 400 parámetros). Si cada observación tiene características de entrada de 1M como en algunos contextos médicos / biotecnológicos, entonces su red es bastante grande en términos de número de parámetros. Para el resto de mi respuesta, supongo que tiene muy pocas características de entrada pr. observación.

Un buen ejemplo que he encontrado al comparar el rendimiento de la CPU con el de la GPU fue cuando entrené a un robot de póker utilizando el aprendizaje por refuerzo. Para el aprendizaje por refuerzo, a menudo no desea tantas capas en su red neuronal y descubrimos que solo necesitábamos unas pocas capas con pocos parámetros. Además, el número de características de entrada era bastante bajo. Inicialmente me entrené en una GPU (NVIDIA Titan), pero me tomó mucho tiempo ya que el aprendizaje de refuerzo requiere muchas iteraciones. ¡Afortunadamente, descubrí que el entrenamiento en mi CPU hizo que mi entrenamiento fuera 10 veces más rápido! Esto es solo para decir que las CPU a veces pueden ser mejores para el entrenamiento.

¿Hay algún otro criterio que deba considerarse al decidir entrenar en CPU o GPU?

Es importante tener en cuenta que mientras esté en una GPU, siempre querrá llenar toda la memoria de la GPU aumentando el tamaño del lote, ese no es el caso en la CPU. En la CPU, un aumento en el tamaño del lote aumentará el tiempo pr. lote. Por lo tanto, si es importante que tenga un tamaño de lote muy grande (por ejemplo, debido a una señal muy ruidosa), puede ser beneficioso usar una GPU. Sin embargo, no he experimentado esto en la práctica y normalmente se prefieren lotes pequeños.

pir
fuente
Gracias @pir! ¿Tiene alguna referencia específica donde pueda leer más?
EstadísticasSorceress
Puede encontrar fácilmente la cantidad de parámetros de, por ejemplo, VGG para comparar y ver que su red es pequeña en comparación.
pir
3
No he visto un montón de comparaciones de CPU / GPU en pequeñas redes, porque eso no es lo que las grandes empresas y laboratorios de investigación está interesado en.
pir
@StatsSorceress Si desea probarlo por su cuenta, ¿por qué no simplemente configurar un MLP Keras simple y probar el rendimiento en GPU frente a CPU? Además, vea mi respuesta actualizada wrt. El tamaño de su red.
pir
5

La CPU es el administrador de la sucursal, puede hacer un poco de todo, pero no es bueno en nada excepto en delegar tareas. Sin embargo, la GPU es un matemático dedicado que se esconde en su máquina. Si está haciendo algún proceso matemático pesado, entonces debe usar su GPU. Siempre.

Si está utilizando algún lenguaje de programación popular para el aprendizaje automático, como python o MATLAB, es una línea de código para decirle a su computadora que desea que las operaciones se ejecuten en su GPU.

También debe asegurarse de utilizar todos los núcleos de su máquina. Esto significa hacer uso de la computación paralela. Especialmente para redes neuronales donde las operaciones se pueden realizar de forma independiente, esto aumentará enormemente su velocidad.

JahKnows
fuente
44
He descubierto que a veces la sobrecarga de transferir datos hacia y desde la GPU elimina por completo el aumento de velocidad del paralelismo. No siempre es una buena idea ir a la GPU.
Adrian Keister
1
Depende de la complejidad de su modelo. Si estás entrenando un K-NN simple, entonces quizás no valga la pena. Sin embargo, si está entrenando cualquier modelo que requiera una matriz inversa o una red neuronal que necesite muchas operaciones de matriz consecuentes, siempre es una buena idea optar por la GPU.
JahKnows
1
@AdrianKeister, estoy de acuerdo. A eso estaba tratando de llegar en mi respuesta. Para la red mencionada por OP, probablemente sería el cuello de botella.
pir
1
100 unidades ocultas es más rápido en GPU usando mi máquina. Necesitaría una cantidad muy pequeña de unidades ocultas para que la CPU sea más rápida. Además, siempre tiendo a hacer mi entrenamiento en lotes. En este caso, dudo que una CPU sea el cuello de botella considerando datos que sean lo suficientemente densos.
JahKnows
3

Primero haré referencia a algunas citas de preguntas similares:

Cuando se trata de operaciones matriciales, no lo piensas dos veces, siempre optas por las GPU. fuente

La arquitectura paralela en una GPU está bien adaptada para operaciones de vectores y matrices. fuente

Entonces, si lees estas preguntas, verás que te recomiendan usar GPU independientemente del caso; siempre proporcionará alguna mejora.

La razón por la que puede haber leído que las redes `` pequeñas '' deberían entrenarse con CPU, es porque implementar el entrenamiento de GPU solo para una red pequeña puede tomar más tiempo que simplemente entrenar con CPU, eso no significa que GPU sea más lenta.

Una red de unidades 100 ocultas es un poco pequeña , yo la llamaría una red pequeña en relación con las grandes redes profundas que existen. Las arquitecturas recurrentes (en su mayoría) tienen más sinapsis que las redes de avance, por lo que un RNN de 100 unidades ocultas es "más grande" que un FFN de 100 unidades ocultas.

Thomas W
fuente
¿No es cierto que si tiene un MLP con una sola capa oculta de 100 unidades, que tiene el mismo número de parámetros que un RNN estándar con 100 unidades ocultas debido al peso compartido? Tiene más 'sinapsis', más 'activaciones', pero la misma cantidad de parámetros, ¿verdad?
EstadísticasSorceress
No estoy familiarizado con el término "peso compartido". Tiene la misma cantidad de activaciones, pero más conexiones, así que más parámetros ...
Thomas W
El peso compartido significa que la matriz de peso de una capa oculta en el RNN a la siguiente capa oculta es la misma; es la misma matriz 'U', replicada a través del tiempo. Además, los pesos de la entrada a la capa oculta son los mismos a lo largo del tiempo.
EstadísticasSorceress
@StatsSorceress no estoy familiarizado con el trabajo con matrices. Sí, la matriz de peso de una capa oculta a la siguiente es la misma. Sin embargo, hay más conexiones en total (porque una capa también se puede conectar a la capa ANTERIOR). No estoy seguro de cómo puedo explicarlo, pero un RNN siempre tendrá más parámetros, ya que hay más capas conectadas ...
Thomas W
Sí, entiendo que físicamente hay más parámetros, pero muchos de esos parámetros toman el mismo valor, lo que significa que el número efectivo de parámetros en un MLP y un RNN con el mismo número de dimensiones de entrada y el mismo número de dimensiones ocultas será el mismo.
EstadísticasSorceress