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.
fuente
Respuestas:
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.
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.
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.
fuente
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.
fuente
Primero haré referencia a algunas citas de preguntas similares:
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.
fuente