Las GPUs y el machine learning

Uno de los factores que más ha impulsado el deep learning en los últimos años ha sido el uso de las GPUs (graphics processing unit) para acelerar el entrenamiento y despliegue de los algoritmos.

Las GPUs son circuitos electrónicos, popularizadas por Nvidia y especializadas en procesado de imágenes y gráficos. Cuentan con una estructura paralela que las hace más eficientes que las CPUs (central processing unit) para algoritmos con procesamiento de datos en paralelo y accesos predecibles y en streaming a memoria.

Cuando pensamos en los componentes de un modelo tipo de machine learning tenemos el bloque de preprocesamiento, entrenamiento y producción o inferencia. Además de añadir hardware y memoria específica (por ejemplo para almacenar los parámetros del modelo), uno de los aspectos donde el hardware más puede ayudar es en los bloques intensos en computación como el producto de matrices.

Si tenemos dos matrices cuadradas de orden n (n número de filas y columnas) A y B y queremos obtener la matriz producto C, cada término de esta matriz se obtendrá de la siguiente forma:

c_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+...+a_{in}b_{nj}=\sum_{k=1}^{n}a_{ik}b_{kj}

Se puede ver que para cada uno de los n2 términos de la matriz producto, es necesario hacer n productos y (n-1) sumas. La complejidad computacional en tiempo de un algoritmo básico para calcular el producto de matrices sería O(n3). Es decir, conforme crece el orden de las matrices a multiplicar, el número de pasos necesarios crece de forma polinómica con grado 3. Se pueden encontrar otros algoritmos como el de Strassen que reducen ligeramente el tiempo a O(n2.807).

Hemos hecho una simulación en Python para calcular el tiempo de ejecución de un producto de matrices en función del orden de dichas matrices. Para valores de n entre 100 y 1600 (en pasos de 20), se han creado dos matrices de orden n con valores aleatorios y se ha medido el tiempo de ejecución de su multiplicación. Como se puede ver en la siguiente figura, el tiempo de ejecución se aproxima bastante a O(n3), que es el comportamiento teórico.

Complejidad multipliación de matrices
Tiempo empleado en la multiplicación de dos matrices en función del orden n

Como hemos observado, el producto de matrices es uno de los cuellos de botella y factores que limitan el crecimiento de los modelos de machine learning debido al tiempo necesario para realizar la operación. Es aquí donde las GPUs supusieron una revolución por su eficiencia para procesamiento paralelo. El producto de matrices es un tipo de operación idóneo en este caso, ya que cada uno de los términos se puede calcular de manera paralela.

En el artículo de 2009 “Large-scale Deep Unsupervised Learning using Graphics Processors “ Raina et al ya demostraron la ventaja de usar procesadores gráficos para escalar modelos de deep learning.

Para impulsar el desarrollo de modelos de machine learning en GPUs, Nvidia creó CUDA, una plataforma de procesamiento paralelo que permite a investigadores, científicos y programadores desarrollar aplicaciones usando GPUs.

A pesar del éxito conseguido, a las GPUs les está saliendo competencia como las TPUs (Tensor Processing Units) de Google, diseñadas implícitamente para un mayor volumen de cálculo de precisión reducida. También están apareciendo start-ups especializadas en hardware para machine learning.

La batalla por el hardware en machine learning continuará y unos de los puntos principales seguirá siendo la mejora de la eficiencia para realizar operaciones de algebra lineal.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Blog de WordPress.com.

Subir ↑

A %d blogueros les gusta esto: