Aceleración por Hardware con FPGAs

1 June, 2020 |

La revolución derivada del surgimiento y masificación de las computadoras planteó un antes y un después, destacándose en el vertiginoso aumento de la productividad, velocidad e interconectividad que conocemos hoy en día.
Podría decirse que la raíz de todo nace en el CPU. Como bien sabemos, estos son dispositivos de propósito general, diseñados para ejecutar código secuencial. Sin embargo, en los últimos años surgieron aplicaciones de alto costo computacional, que generó la necesidad de arquitecturas de hardware específicas.

Una solución consistió en la creación de los procesadores gráficos (GPU), quienes fueron introducidos en los ochenta para liberar a los CPU de tareas demandantes, primero con el manejo de pixeles en 2D, y luego con el renderizado de escenas 3D, lo que implicó un gran aumento de su poder de cómputo. La arquitectura actual de cientos de procesadores especializados en paralelo, resulta en una gran eficiencia para la ejecución de operaciones , lo que llevó a su utilización como aceleradores de propósito general. Sin embargo, si el problema a resolver no se adapta a la perfección, aumenta la complejidad de desarrollo y disminuye el rendimiento.

¿Qué son las FPGA?
Tanto los CPU como los GPU presentan una arquitectura de hardware fija. La alternativa con arquitectura reconfigurable, son los dispositivos conocidos como Field-programmable Gate Array (FPGA). Los mismos, se componen de bloques lógicos (resuelven funciones simples y, opcionalmente, guardan el resultado en un registro) y una potente matriz de interconexión. Pueden considerarse circuitos Integrados en blanco, con gran capacidad de paralelismo, que pueden adaptarse para resolver tareas específicas, de manera performante.


 
¿Para qué nos sirven?
El concepto general tras la utilización de esta tecnología, es que un algoritmo complejo computacionalmente demandante, se mueva de una aplicación ejecutándose sobre el CPU a un acelerador implementado sobre la FPGA. Cuando la aplicación requiere una tarea acelerada, el CPU transmite los datos y sigue con sus tareas, la FPGA los procesa y los retorna para su posterior utilización, liberando al CPU de dicha tarea y ejecutándola en menor tiempo.

El factor de aceleración a obtener, dependerá del algoritmo, la cantidad y tipo de datos. Puede esperarse desde unas pocas veces hasta miles, que en procesos que llevan días de computo se traduce bajarlo a horas o minutos. Esto no solo es una mejora en la experiencia de usuario, sino que también una disminución del costo energético y de infraestructura.
Si bien cualquier algoritmo complejo y demandante es potencialmente acelerable, hay casos de usos típicos, como:

Deep/Machine Learning e Inteligencia Artificial en general
Aplicaciones de tipo Análisis Predictivo (ej. Detección avanzada de fraudes), Clasificación (ej. Segmentación de nuevos clientes, Clasificación automática de documentos), Motores de Recomendación (ej. Marketing Personalizado), etc. Se dispone de frameworks y librerías acelerados como TensorFlow, Apache Spark ML, Keras, Scikit-learn, Caffe y XG Boost.

Análisis de Modelos Financieros
Usado en Bancos, Fintech, Seguros, por ej., para detectar transacciones fraudulentas en tiempo real. También para Análisis de Riesgos (con CPU, los bancos sólo pueden realizar modelos de riesgos 1 vez al día, pero con las FPGA pueden realizar ese análisis en tiempo real). En finanzas, se usan algoritmos como el de Montecarlo acelerado, que estima la variación en el tiempo de instrumentos bursátiles.

Visión por computador
Interpretación de Imágenes Médicas o Satelitales, etc. con algoritmos acelerados de OpenCV.
Procesamiento de Video en tiempo real: Usado en todo tipo de aplicaciones automotrices, Retail (Analíticas en Actividad en Tiendas), Salud, etc. utilizando algoritmos acelerados de OpenCV y herramientas de FFmpeg.

Big Data
Análisis en tiempo real de grandes volúmenes de datos, por ejemplo, provenientes de dispositivos IoT vía Apache Spark.

Data Centers
Centros de Datos híbridos, con diferentes tipos de cálculos para diferentes tipos de tareas (CPU, GPU, FPGA, ASIC).

Seguridad
Criptografía, Compresión, Auditoría de redes en tiempo real, etc.

Típicamente, los aceleradores son invocados desde APIs de C/C++, pero también se pueden usar lenguajes como Java, Python, Scala o R y frameworks distribuidos como Apache Spark ML y Apache Mahout.

Algunas desventajas
No todos los procesos se pueden acelerar. Similar a lo que ocurre con los GPUs, el aplicar esta tecnología erróneamente conlleva generar lentitud en la ejecución, debido a la penalización por mover datos entre dispositivos.

Además, hay que tener en cuenta que se requiere una infraestructura de servidores con mayores requerimientos para su desarrollo y utilización. Finalmente, para lograr un producto final de alta calidad se necesita know-how altamente especializado, el cual es escaso en el mercado actual.

Conclusiones
En los últimos años, la tecnología FPGA se acercó al mundo del desarrollo de software gracias a placas aceleradoras y de la mano de servicios en la nube. Las razones para usarlas, van desde lograr tiempos que de otra forma no se cumplen o mejorar la experiencia de usuario, hasta disminuir costos energéticos y de alojamiento.

Es candidato a la aceleración por hardware cualquier software que involucra algoritmos complejos y gran cantidad de datos. Algunos casos de uso típicos, incluyen, pero no se limitan, a la investigación genómica, el análisis de modelos financieros, la realidad aumentada y los sistemas de visión artificial, el procesamiento de big data y la seguridad de redes informáticas.