Un nuevo enfoque para el aprendizaje profundo y la programación de HPC
Presentando un marco para simplificar el desarrollo de kernels de DL y HPC para varios sistemas CPU.
― 6 minilectura
Tabla de contenidos
En los últimos años, los campos del Deep Learning (DL) y la Computación de Alto Rendimiento (HPC) han avanzado un montón. Pero, la forma de programar estos sistemas no ha estado a la altura. Muchos desarrolladores todavía se apoyan en bibliotecas viejas que están diseñadas para plataformas específicas. Esta dependencia puede ocasionar problemas, ya que estas bibliotecas pueden funcionar bien para ciertas tareas, pero mal en otras. Este artículo presenta un nuevo marco que busca solucionar estos problemas facilitando a los programadores la creación de núcleos eficientes y flexibles de DL y HPC para sistemas modernos de CPU.
Entendiendo el Problema
Ha habido una convergencia entre el aprendizaje profundo y la computación de alto rendimiento, lo que significa que comparten muchas tareas computacionales comunes. Sin embargo, los métodos de programación usados en estas dos áreas a menudo se quedan atrás. Muchos programadores están atrapados usando bibliotecas rígidas y específicas de proveedores que ofrecen un rendimiento excelente en plataformas concretas. Esto suele resultar en código que no se puede mover o adaptar fácilmente a diferentes tareas o sistemas. Debido a esto, el desarrollo de aplicaciones puede volverse costoso y llevar mucho tiempo.
Estas bibliotecas específicas de proveedores pueden rendir mal en muchos casos, lo que resulta en una incapacidad para crear código flexible o de uso general. Además, a medida que la arquitectura de la CPU sigue avanzando, estas bibliotecas a menudo no aprovechan al máximo las nuevas características. Esto hace que sea complicado desarrollar aplicaciones eficientes que puedan ejecutarse bien en varios diseños de CPU.
Presentando el Nuevo Marco
El nuevo marco busca mejorar la forma en que se desarrolla el código de DL y HPC. Se enfoca en dos pasos principales:
- Usando Primitivas de Procesamiento Tensorial (TPPs): Las TPPs son un conjunto de operaciones tensoriales 2D simplificadas que se pueden usar para construir tareas más complejas.
- Abstracciones de Bucles de Alto Nivel: Este paso permite a los programadores declarar bucles lógicos de una manera más sencilla sin meterse en detalles complicados como cómo debería organizarse los datos o el orden de las operaciones.
Al dividir el desarrollo de núcleos en estos dos pasos, el marco permite a los programadores concentrarse en el panorama general en lugar de quedar atrapados en los detalles del código para diferentes plataformas.
Los Beneficios del Marco
Una gran ventaja de este marco es que permite un código más portátil. Como el núcleo de los cálculos se expresa usando TPPs, el código se puede adaptar a diferentes sistemas sin necesidad de reescrituras importantes. Esto significa que los desarrolladores no tienen que comenzar desde cero cada vez que quieren ejecutar su código en una arquitectura de CPU diferente.
Además, usar abstracciones de alto nivel para los bucles facilita el control de cómo se llevan a cabo las tareas. Los programadores pueden especificar las propiedades que desean para sus bucles sin tener que escribir manualmente código complicado. Esto lleva a un código más claro y fácil de mantener, lo que hace que sea más sencillo adaptarse en el futuro.
Cómo Funciona el Marco
El marco opera a través de una herramienta llamada PARLOOPER, que simplifica la creación de bucles alrededor de las TPPs.
Paso 1: Declarando TPPs
El primer paso para usar PARLOOPER es definir el núcleo computacional de un núcleo utilizando TPPs. Esto significa que los programadores expresan sus cálculos principales en términos de las operaciones básicas ofrecidas por la biblioteca TPP. Esto se puede hacer de una manera sencilla, facilitando a los desarrolladores enfocarse en la lógica real de su código.
Paso 2: Especificando Bucles con PARLOOPER
Una vez que se han definido los cálculos principales, los programadores pueden declarar los bucles lógicos que rodearán las TPPs. Este paso se simplifica gracias a PARLOOPER, que permite a los usuarios especificar las restricciones y propiedades de sus bucles sin tener que escribir toda la estructura manualmente.
En tiempo de ejecución, los usuarios pueden proporcionar un solo parámetro que le dice a PARLOOPER cómo configurar los bucles. Esto permite que los bucles se adapten según las necesidades de la computación específica y las capacidades del hardware subyacente. Este proceso de dos pasos brinda gran flexibilidad mientras mantiene un alto rendimiento.
Rendimiento y Flexibilidad
La eficiencia del nuevo marco ha sido probada en varios sistemas de CPU, demostrando su capacidad para superar las soluciones existentes. Al usar TPPs combinadas con PARLOOPER, los desarrolladores pueden alcanzar altos niveles de rendimiento en una variedad de aplicaciones.
El marco no solo proporciona velocidad; también facilita la adaptación a nuevo hardware a medida que se vuelve disponible. Esto es esencial en el mundo tecnológico de ritmo rápido, donde los nuevos diseños y capacidades de CPU están surgiendo constantemente. La capacidad de escribir código flexible con un esfuerzo mínimo es una ventaja significativa.
Aplicaciones Prácticas
Este marco se ha utilizado para desarrollar varios tipos de aplicaciones, incluyendo:
Multiplicación General de Matrices (GEMM): Esta es una operación común en DL que implica multiplicar dos matrices. El marco facilita la implementación eficiente de esta operación, sin importar el hardware específico.
Perceptrones de Múltiples Capas (MLPs): El marco permite la creación de redes neuronales complejas que pueden aprovechar las últimas capacidades de hardware mientras simplifican el proceso de programación.
Redes Neuronales Convolucionales (CNNs): Estas se utilizan ampliamente en tareas de procesamiento de imágenes, y el marco ha mostrado gran promesa en acelerar su implementación.
Operaciones con Matrices Dispersas: El marco también soporta operaciones avanzadas que involucran matrices dispersas, lo que puede reducir los requerimientos de memoria y mejorar el rendimiento en varias aplicaciones.
Conclusión
La necesidad de métodos de programación flexibles y eficientes en DL y HPC es clara. El nuevo marco ofrece una solución al ofrecer una forma de desarrollar código portátil que puede adaptarse a una variedad de arquitecturas de CPU. Con su enfoque en TPPs y abstracciones de bucles de alto nivel, este marco no solo simplifica el proceso de desarrollo, sino que también mejora el rendimiento de las aplicaciones.
A medida que la tecnología sigue avanzando, este enfoque ayudará a los desarrolladores a mantenerse al día con los desafíos emergentes y aprovechar al máximo el nuevo hardware. En general, el marco representa un avance en hacer la programación de DL y HPC más accesible y eficiente para todos los desarrolladores.
Título: Harnessing Deep Learning and HPC Kernels via High-Level Loop and Tensor Abstractions on CPU Architectures
Resumen: During the past decade, Deep Learning (DL) algorithms, programming systems and hardware have converged with the High Performance Computing (HPC) counterparts. Nevertheless, the programming methodology of DL and HPC systems is stagnant, relying on highly-optimized, yet platform-specific and inflexible vendor-optimized libraries. Such libraries provide close-to-peak performance on specific platforms, kernels and shapes thereof that vendors have dedicated optimizations efforts, while they underperform in the remaining use-cases, yielding non-portable codes with performance glass-jaws. This work introduces a framework to develop efficient, portable DL and HPC kernels for modern CPU architectures. We decompose the kernel development in two steps: 1) Expressing the computational core using Tensor Processing Primitives (TPPs): a compact, versatile set of 2D-tensor operators, 2) Expressing the logical loops around TPPs in a high-level, declarative fashion whereas the exact instantiation (ordering, tiling, parallelization) is determined via simple knobs. We demonstrate the efficacy of our approach using standalone kernels and end-to-end workloads that outperform state-of-the-art implementations on diverse CPU platforms.
Autores: Evangelos Georganas, Dhiraj Kalamkar, Kirill Voronin, Abhisek Kundu, Antonio Noack, Hans Pabst, Alexander Breuer, Alexander Heinecke
Última actualización: 2024-03-15 00:00:00
Idioma: English
Fuente URL: https://arxiv.org/abs/2304.12576
Fuente PDF: https://arxiv.org/pdf/2304.12576
Licencia: https://creativecommons.org/licenses/by/4.0/
Cambios: Este resumen se ha elaborado con la ayuda de AI y puede contener imprecisiones. Para obtener información precisa, consulte los documentos originales enlazados aquí.
Gracias a arxiv por el uso de su interoperabilidad de acceso abierto.