Avances en Representaciones de Computación de Alto Rendimiento
Nueva representación mejora las predicciones para aplicaciones de HPC en varios sistemas de hardware.
― 7 minilectura
Tabla de contenidos
- ¿Qué es una Representación de Programa?
- La Necesidad de Representaciones Mejoradas
- Nuestro Enfoque
- ¿Por Qué Usar Redes Neuronales de Grafos?
- Cómo Construimos Nuestro Conjunto de Datos
- Experimentando con Nuestra Nueva Representación
- Resultados de Nuestros Experimentos
- Conclusión
- Direcciones Futuras
- Fuente original
- Enlaces de referencia
La Computación de Alto Rendimiento (HPC) es un área clave en el campo de la computación que se centra en usar computadoras poderosas para resolver problemas complejos. Estos problemas suelen surgir en investigaciones científicas, simulaciones y análisis de grandes datos. A medida que la tecnología avanza, más desarrolladores se interesan en crear aplicaciones que puedan funcionar de manera eficiente en distintos tipos de sistemas informáticos, incluyendo Unidades de Procesamiento Gráfico (GPUs) y Unidades de Procesamiento Central (CPUs).
Esta búsqueda de eficiencia significa que los desarrolladores a menudo utilizan herramientas y modelos de programación como OpenMP, que simplifican la escritura de código paralelo. El código paralelo permite que las tareas se ejecuten simultáneamente, lo que puede acelerar significativamente los tiempos de procesamiento. Sin embargo, averiguar cómo sacar el mejor provecho de diferentes sistemas informáticos aún puede ser un reto.
La introducción de métodos de Aprendizaje Automático (ML) ha ofrecido nuevas formas de optimizar aplicaciones HPC. Sin embargo, los métodos actuales a veces no cumplen porque no capturan completamente las características importantes del código paralelo que ayudan a mejorar el rendimiento.
¿Qué es una Representación de Programa?
En programación, una representación es cómo visualizamos la estructura y el comportamiento del código. Así como un arquitecto usa planos para diseñar un edificio, los desarrolladores de software utilizan representaciones de programas para entender cómo funcionará su código.
Una representación común es el Árbol de Sintaxis Abstracta (AST por sus siglas en inglés). Un AST descompone el código en una estructura de árbol donde cada nodo representa una parte del código. Sin embargo, los AST tradicionales tienen limitaciones a la hora de capturar las complejidades de los programas paralelos: aquellos diseñados para ejecutarse en múltiples núcleos o procesadores a la vez.
La Necesidad de Representaciones Mejoradas
La mayoría de las representaciones existentes se centran en programas de un solo hilo, lo que significa que no reflejan adecuadamente cómo operan los programas paralelos. Esta falta de detalle puede obstaculizar la eficiencia de los métodos de optimización que utilizan estas representaciones.
Para abordar este problema, podemos mejorar los AST con información adicional. Esto puede incluir características específicas de bucles y condicionales que son clave para el procesamiento paralelo. Al añadir esta información, podemos crear un nuevo tipo de representación de programa que apoye mejor la optimización del rendimiento.
Nuestro Enfoque
Presentamos una nueva forma de representar programas llamada representación de gráfico ponderado. Esta representación se basa en el AST tradicional y añade bordes extra, que son como conexiones entre diferentes partes del código. Cada borde puede llevar pesos que representan con qué frecuencia se utilizarán ciertas partes del código durante la ejecución.
Añadiendo Bordes al AST: Al introducir nuevos bordes, podemos ilustrar más claramente las relaciones entre los diferentes componentes del código. Por ejemplo, cuando tenemos un bucle, podemos mostrar con qué frecuencia se ejecutará el bucle y qué condiciones afectan su ejecución.
Usando Pesos: Los pesos en estos bordes proporcionan una forma de indicar cuántas veces se ejecutará un fragmento particular de código. Esto es crucial para entender el rendimiento porque no todas las partes del código se usan igual.
Al usar esta nueva representación, podemos alimentarla a Redes Neuronales de Grafos (GNNs), que son modelos especializados que pueden aprender de estructuras gráficas. Esto nos permite hacer mejores predicciones sobre cómo se comportará el código en varios sistemas de hardware.
¿Por Qué Usar Redes Neuronales de Grafos?
Las GNNs son herramientas poderosas para aprender de datos que están estructurados como gráficos. Dado que nuestra nueva representación se asemeja a un gráfico, podemos aprovechar las GNNs para encontrar patrones y relaciones que los métodos tradicionales podrían pasar por alto. Para aplicaciones HPC, esto significa que podemos predecir con precisión cuánto tiempo tomará ejecutar diferentes fragmentos de código en varios tipos de hardware.
Cómo Construimos Nuestro Conjunto de Datos
Crear un conjunto de datos para entrenar nuestra GNN es un paso crítico. Necesitamos una colección de diferentes códigos junto con información sobre su rendimiento. Esto implica varios pasos clave:
Generando Diferentes Kernels: Para nuestros experimentos, creamos varias versiones de aplicaciones llamadas kernels. Cada kernel es una tarea específica que el código realizará. Generamos diferentes versiones modificando cómo se pueden ejecutar en CPUs y GPUs.
Usando OpenMP Advisor: Esta herramienta ayuda a producir diferentes variantes de nuestros kernels. Nos permite crear kernels que pueden utilizar efectivamente los recursos paralelos.
Colectando Datos de Tiempo de Ejecución: Después de generar los kernels, ejecutamos cada uno y medimos cuánto tiempo tarda en ejecutarse. Estos datos de tiempo de ejecución son esenciales para enseñar a nuestra GNN cómo hacer predicciones.
Creando un Conjunto de Datos Robusto: Al final, terminamos con miles de kernels únicos y sus datos de tiempo de ejecución correspondientes, formando un conjunto de datos rico para entrenar.
Experimentando con Nuestra Nueva Representación
Una vez que tenemos nuestro conjunto de datos listo, podemos comenzar a entrenar nuestro modelo GNN usando la representación de gráfico ponderado de los códigos. El proceso de entrenamiento involucra varios desafíos, pero podemos aprovechar los datos que recopilamos para mejorar las predicciones.
Métricas de Evaluación
Para evaluar qué tan bien funciona nuestro modelo, necesitamos definir métricas para medir su precisión. Una métrica común es el Error Cuadrático Medio (RMSE), que compara los tiempos de ejecución predichos contra los tiempos reales que recopilamos. Un RMSE más bajo indica que nuestro modelo está haciendo predicciones precisas.
Resultados de Nuestros Experimentos
Después de entrenar nuestro modelo, realizamos una serie de experimentos usando diferentes tipos de hardware. Evaluamos qué tan bien funciona nuestra representación en predecir el tiempo de ejecución de aplicaciones en GPUs y CPUs.
Mejorando la Precisión de las Predicciones
Descubrimos que nuestra representación de gráfico ponderado ayuda a hacer predicciones más precisas en comparación con las representaciones tradicionales. Al incorporar bordes y pesos adicionales, podemos capturar mejor la complejidad del código paralelo, lo que lleva a una reducción significativa en el error de predicción.
Rendimiento en Diferentes Hardware
También analizamos qué tan bien se generaliza nuestro modelo a través de varios tipos de hardware. Los resultados indican que las predicciones siguen siendo estables y precisas, independientemente de si el código se ejecuta en una GPU o en una CPU. Esta versatilidad es crucial, ya que las aplicaciones HPC a menudo necesitan ejecutarse en múltiples tipos de sistemas.
Conclusión
En resumen, hemos establecido un nuevo enfoque para representar aplicaciones HPC que mejora los AST tradicionales con gráficos ponderados. Esta nueva representación captura características vitales del código paralelo, lo que lleva a predicciones mejoradas del rendimiento en tiempo de ejecución.
Nuestros experimentos confirman que este enfoque puede apoyar efectivamente a los desarrolladores en la optimización de sus aplicaciones en diversas plataformas de hardware. A medida que continuamos refinando este modelo, tiene el potencial de explorar más optimizaciones en diferentes entornos de programación paralela.
Direcciones Futuras
De cara al futuro, planeamos investigar varias vías para expandir este trabajo. Esto incluye explorar cómo nuestra representación puede mejorar otras áreas de programación paralela, como la optimización de estrategias de programación, tamaños de chunks de bucles y más. Además, buscamos adaptar nuestro marco para su uso con otros modelos de programación paralela, aumentando aún más su alcance y aplicabilidad en el campo de la computación de alto rendimiento.
A través de estos esfuerzos, aspiramos a contribuir a la evolución y mejora continua de las aplicaciones HPC, haciendo que sean más eficientes y efectivas para enfrentar los crecientes desafíos en computación.
Título: ParaGraph: Weighted Graph Representation for Performance Optimization of HPC Kernels
Resumen: GPU-based HPC clusters are attracting more scientific application developers due to their extensive parallelism and energy efficiency. In order to achieve portability among a variety of multi/many core architectures, a popular choice for an application developer is to utilize directive-based parallel programming models, such as OpenMP. However, even with OpenMP, the developer must choose from among many strategies for exploiting a GPU or a CPU. Recently, Machine Learning (ML) approaches have brought significant advances in the optimizations of HPC applications. To this end, several ways have been proposed to represent application characteristics for ML models. However, the available techniques fail to capture features that are crucial for exposing parallelism. In this paper, we introduce a new graph-based program representation for parallel applications that extends the Abstract Syntax Tree to represent control and data flow information. The originality of this work lies in the addition of new edges exploiting the implicit ordering and parent-child relationships in ASTs, as well as the introduction of edge weights to account for loop and condition information. We evaluate our proposed representation by training a Graph Neural Network (GNN) to predict the runtime of an OpenMP code region across CPUs and GPUs. Various transformations utilizing collapse and data transfer between the CPU and GPU are used to construct the dataset. The predicted runtime of the model is used to determine which transformation provides the best performance. Results show that our approach is indeed effective and has normalized RMSE as low as 0.004 to at most 0.01 in its runtime predictions.
Autores: Ali TehraniJamsaz, Alok Mishra, Akash Dutta, Abid M. Malik, Barbara Chapman, Ali Jannesari
Última actualización: 2023-04-07 00:00:00
Idioma: English
Fuente URL: https://arxiv.org/abs/2304.03487
Fuente PDF: https://arxiv.org/pdf/2304.03487
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.