En el episodio de hoy de Un podcast ninja sobre Big Data vamos a hablar de GPUs.
¿Qué es una GPU y por qué son importantes para el Machine Learning? ¿En qué se diferencia una GPU de una CPU?
Y todas estas cositas 🙂
En el repaso que le dimos al 2023 en el episodio 64 os contaba cómo NVIDIA lo estaba petando como líder del mercado de GPUs y cómo todo el mundo estaba un poco enloquecido comprando montones de GPUs para llenar sus centros de datos.
Estas GPUs son las que permiten entrenar esos modelos tan chulos de IA a los que nos hemos acostumbrado tan rápido y también las que nos permiten utilizarlos, claro.
Sin embargo, NVIDIA no es una empresa que se creara, allá por los años 90, con la idea de liderar el mercado del hardware que está detrás de la Inteligencia Artificial.
NVIDIA se fundó con la idea de que un día el PC sería un dispositivo de consumo utilizado para ejecutar juegos.
La idea era conseguir cada vez videojuegos con imágenes más realistas y ser capaces de renderizar en la pantalla escenas en 3D en tiempo real.
En 1995, Sega, líder del mercado de juegos arcade, adaptaba el código de Virtua Fighter para convertirlo en el primer juego 3D ejecutado con gráficos NVIDIA.
En 1999 NVIDIA comercializa la primera GPU del mundo y la definía como:
"Un procesador integrado en un chip que incluye motores de transformación, iluminación, configuración de triángulos/planos de corte y renderizado, y es capaz de procesar un mínimo de 10 millones de polígonos por segundo".
Esto estaba todo pensado para procesar mejores gráficos.
Sus chips se estaban integrando en consolas como la Xbox, la Play 3…
De momento, nada que ver con Machine Learning. Como véis.
En 2007 lanzan CUDA, que es un interfaz de programación para sus GPUs.
En un lugar no muy lejano, unos científicos que trabajaban en algoritmos de redes neuronales (que por aquel entonces no eran muy populares todo sea dicho) habían estado observando como la capacidad de cálculo de las CPUs había aumentado un factor de x5000 entre los años 1990 y 2010.
No estaba mal pero aún no era suficiente como para poder entrenar sus modelos de clasificación de imágenes en un tiempo razonable, pensaron.
Entonces se plantearon:
"¿Y si utilizamos este nuevo interfaz de programación, CUDA, y conseguimos entrenar nuestra red neuronal en una GPU?
Total… Nuestro problema es de reconocimiento de imágenes y esto de las GPUs va de procesamiento de gráficos.
¿Qué puede ir mal?"
Pues nada.
Fue todo muy bien.
Estos investigadores eran Alex Krizhevsky e Ilya Sutskever.
Esta gente implementó una red neuronal para reconocimiento de imágenes con Cuda sobre un par de GPUs y ganó la competición de ImageNet en 2012 con bastante ventaja sobre el segundo.
Lo que supuso el inicio del boom del deep learning.
Las GPUs o unidades de procesamiento de gráficos son circuitos electrónicos capaces de realizar cálculos matemáticos a alta velocidad y además de forma paralelizada.
Peeeero no cualquier tipo de cálculo, sino aquellos que van bien para la renderización de gráficos y que implican mover, escalar y rotar los modelos 3D para posicionarlos correctamente en el mundo virtual, lo cual requiere de operaciones matemáticas como multiplicaciones de matrices y transformaciones de vectores.
Justo las operaciones que se necesitan para representar, entrenar y utilizar modelos redes neuronales. Multiplicaciones y transformaciones de vectores y matrices.
Así que, en cierta manera, fue la industria de los videojuegos la que financió el nacimiento de la inteligencia artificial con la arquitectura de modelos que conocemos ahora.
Imaginad una fábrica donde hay que realizar muchas tareas pequeñas y repetitivas.
En lugar de tener un trabajador muy habilidoso y que vale para todo, como una CPU en una ordenador, que realiza una tarea a la vez, pues tenemos muchos trabajadores un poco menos hábiles - los núcleos de la GPU - que saben hacer menos cosas peeero que las hacen muy rápido y además en paralelo.
La GPU recibe instrucciones de la CPU que pueden ser sobre gráficos (como renderizar un juego o una película) o cálculos matemáticos (como los utilizados en Machine Learnig), pero que básicamente son multiplicaciones y transformaciones de vectores y matrices.
Cada uno de los núcleos de la GPU trabaja en una pequeña parte de la tarea al mismo tiempo que los demás núcleos trabajan en otras partes.
Por ejemplo, en la renderización de un juego, un núcleo puede trabajar en un píxel, mientras que otros núcleos trabajan en los píxeles cercanos al mismo tiempo.
Una vez que todos los núcleos han terminado sus tareas, la GPU compila todos los resultados en un resultado final, como una imagen renderizada completa, y la envía de vuelta a la CPU o la muestra en la pantalla.
Es decir, una CPU, o unidad central de procesamiento, es el hardware en un ordenador que maneja todo los tipo de tareas necesarios para que el sistema operativo y las aplicaciones se ejecuten.
Pero es tan flexible, puede hacer tantas cosas diferentes, que no sabe qué es lo próximo que le va a tocar así que tiene que ir y leer la siguiente instrucción del software correspondiente y de paso guardar en su memoria los resultados de cada cálculo.
Se puede entrenar una red neuronal en una CPU, sí.
Pero aunque tenga que hacer siempre las mismas multiplicaciones y sumas de matrices y vectores tiene que ir una a una, consultando la siguiente instrucción, accediendo a memoria, etc…
Muy lento.
Una unidad de procesamiento gráfico o GPU es un componente de hardware similar, pero mucho más especializado y sobre todo con un montón de núcleos que permiten muchos cálculos en al mismo tiempo.
Las dos tienen componentes internos similares, incluidos núcleos, memoria y unidades de control.
Los núcleos ejecutan todos los cálculos y funciones lógicas y la memoria interna está para poder acceder rápido a los datos.
Las CPUs tienen una arquitectura generalista que las hace versátiles y capaces de realizar una amplia variedad de tareas, como en el ejemplo de antes el trabajador hábil que sirve para todas las tareas.
Por otro lado, las GPUs tienen una arquitectura especializada que las hace más eficientes en tareas relacionadas con el procesamiento de gráficos y cálculos matemáticos específicos. Esto les permite realizar estas tareas mucho más rápido que las CPUs, peeero a menudo son menos versátiles.
Las CPUs suelen tener unos pocos núcleos de procesamiento más potentes, mientras que las GPUs suelen tener cientos o incluso miles de núcleos de procesamiento. Esto les permite realizar una gran cantidad de cálculos en paralelo, lo que les hace más eficientes para realizar tareas que requieren el procesamiento simultáneo de muchos datos.
Todos nuestros ordenadores vienen con GPU, incluso los teléfonos móviles vienen con GPUs.
En algunos casos estas GPUs están integradas, normalmente cuando se necesita una opción más barata y que ocupe menos, orientada al procesamiento de gráficos normales y corrientes.
Y otras veces se venden por separado, así que están aisladas de la CPU y tienen su propia memoria.
En 2016 en Google decidieron crear una unidad de procesamiento específico para entrenar modelos de Machine Learning.
Las TPUs o unidades de procesamiento de tensores.
Los tensores son básicamente matrices, vectores, y estas cosas algebraicas.
Es decir, una TPU es un procesador que sólo sabe procesar matrices.
Como solo hace eso no tiene que ir accediendo a memoria para ver que tiene que hacer después como una CPU.
Así que carga los coeficientes a multiplicar en sus núcleos, luego carga los datos y va multiplicando y sumando todo.
El resultado final será la suma de todos las multiplicaciones entre datos y parámetros.
Durante todo este proceso, no ha accedido a memoria ni una sola vez (solo al principio cuando se cargan los coeficientes y los datos).
Y esta es la razón por la que las TPUs son más rápidas en cálculos de redes neuronales.
Todo este sarao de CPUs, GPUs y TPUs puede parecer un rollo que no os afecta para nada, pero sí.
Porque llegará el día (si no ha llegado ya), en el que queráis entrenar un modelo de Machine Learning en vuestro ordenador y se os haga de noche esperando a que termine porque no tiene suficiente capacidad de procesamiento.
Lo ideal sería tener una GPU de NVIDIA e instalarla en nuestro ordenador o tener una estación de trabajo dedicada con GPUs 💸💸💸
Pero hay opciones más económicas.
Por ejemplo, Apple ha puesto mucho foco en el machine learning y al parecer los chips M1, M2 y M3 van bastante bien.
En su momento desarrolló su propio fork de TensorFlow y ahora está trabajando en un entorno de deep learning, que ha llamado MLX y está específicamente optimizado para sus chips.
En resumen, para experimentar y aprender los fundamentos de Machine Learning un ordenador corriente se entrenará más rápido cuantos más núcleos de GPU tenga (lo mismo para la etapa de inferencia ) pero también hay que tener en cuenta el tamaño de la memoria RAM.
Cuanto mayor sea, mayor podrá ser el tamaño de los bloques al entrenar el modelo de deep learning.
Por ejemplo, una RAM de 8GB se queda muy pequeña para entrenar modelos de deep learning por mucho que sea un M3 Max.
Pero antes de pensar en comprar un ordenador nuevo con GPUs con muchos cores y memoria RAM para aburrir considerad la opción de Google Colab.
Únicamente hace falta un ordenador normal y conexión a internet. Google pone el resto.
Una cosa importante es que Google Colab tiene una opción gratis.
No tiene recursos infinitos pero para experimentar va muy bien.
Pero eso lo dejo ya para el episodio de la semana que viene. Si no os importa.
Espero que el episodio de hoy os sea de provecho y que aprendáis algo de valor.
Si es así, no olvidéis dejar una valoración de 5 estrellas del podcast en Apple podcasts, en Spotify, en Ivoox o donde quiera que escuchéis el podcast.
Recordad que si tenéis cualquier duda o pregunta podéis contactar conmigo a través del formulario de contacto o podemos seguir la conversación en Twitter.
Muchas gracias por estar ahí y os espero en el próximo episodio de Un Podcast Ninja sobre Big Data.