Avancées de l'IA dans la programmation parallèle automatisée
Un nouvel outil d'IA améliore l'automatisation de la programmation parallèle avec les pragmas OpenMP.
― 8 min lire
Table des matières
- Le besoin de parallélisation
- Compilateurs Source-à-Source
- Défis avec les outils IA existants
- Le modèle proposé
- Évaluation du modèle
- Utilisation de l'augmentation de données
- Comparaison entre la classification multi-label et binaire
- Tests dans le monde réel
- Conclusion et travaux futurs
- Source originale
- Liens de référence
Avec la montée des processeurs multi-cœurs, il y a un besoin grandissant d'utiliser la programmation parallèle. C'est là que plusieurs tâches sont effectuées en même temps. OpenMP est un outil super utilisé qui aide les programmeurs à écrire du Code parallèle. Cependant, rédiger ce type de code manuellement peut être compliqué et long. Pour simplifier la chose, beaucoup d'outils automatisés appelés compilateurs source-à-source (S2S) ont été créés pour convertir le code normal en code parallèle. Mais des études récentes montrent que ces outils font souvent face à des défis et ne sont pas toujours efficaces.
Cet article parle d'une nouvelle méthode qui combine les techniques modernes d'IA avec la grande quantité de code source disponible pour améliorer le processus de parallélisation automatisée. Plus précisément, un nouvel outil est proposé pour aider à identifier et suggérer comment utiliser les pragmas OpenMP-des instructions spéciales qui indiquent où le code peut s'exécuter en parallèle. La méthode utilise un type de modèle IA connu sous le nom de Transformer, qui organise le code d'une manière qui met en valeur sa structure.
Le besoin de parallélisation
La demande pour plus de puissance de calcul continue de grandir, menant à des configurations informatiques complexes. Un développement significatif a été le passage à l'informatique haute performance comme service (HPCaaS). Ce service offre aux utilisateurs un accès à des ressources informatiques avancées. Avec les CPU devenant plus puissants et ayant plus de cœurs, l'importance d'écrire des applications parallèles efficaces est devenue encore plus pressante.
Cependant, créer du code parallèle n'est pas simple. Les programmeurs doivent comprendre en profondeur la structure du code et comment les différentes parties interagissent entre elles. Si ce n'est pas fait correctement, des problèmes peuvent survenir, comme des conditions de concurrence, où plusieurs parties du code essaient d'accéder à la même variable en même temps, causant des erreurs. De plus, distribuer les tâches équitablement entre plusieurs processeurs, connu sous le nom d'équilibrage de charge, est un autre défi.
En raison de la complexité impliquée, il y a relativement peu d'experts en programmation parallèle par rapport au nombre de personnes qui pourraient en bénéficier. Ce fossé met en évidence le besoin d'outils qui simplifient le processus de programmation.
Compilateurs Source-à-Source
Les compilateurs S2S aident les programmeurs en convertissant automatiquement le code sériel (celui qui s'exécute étape par étape) en code parallèle. Ces outils analysent le code pour repérer des éléments qui pourraient entraver la parallélisation et insèrent les directives OpenMP appropriées. Cependant, ils ont plusieurs inconvénients. Ils peuvent être lents, parfois produire des résultats sous-optimaux, et nécessitent un entretien continu pour s'adapter aux nouveaux langages de programmation ou normes de programmation parallèle.
Les avancées en IA, en particulier dans le traitement du langage naturel (NLP), montrent des promesses pour surmonter certaines limites rencontrées par les compilateurs S2S traditionnels. Les grands modèles linguistiques peuvent apprendre et comprendre les langages de programmation, ce qui les rend potentiellement adaptés aux tâches de codage.
Défis avec les outils IA existants
Les outils IA actuels qui assistent les programmeurs négligent souvent les subtilités de la programmation parallèle. Bien qu'ils puissent être utiles, il y a un manque d'outils spécifiquement conçus pour aider à écrire du code parallèle en utilisant OpenMP. Les modèles IA existants abordent généralement le problème en traitant les tâches comme des parties séparées, ce qui n'est peut-être pas la méthode la plus efficace.
La recherche introduit une nouvelle approche qui améliore ces limitations en utilisant une méthode plus intégrée pour prédire à la fois le besoin de pragmas OpenMP et les attributs de mémoire partagée associés. Ce nouveau modèle est conçu pour mieux traiter les connexions entre ces tâches.
Le modèle proposé
Le nouveau modèle se base sur des architectures existantes basées sur Transformer et est adapté aux tâches de programmation. Il utilise plusieurs représentations de code, comme les arbres de syntaxe abstraite (AST) et les Graphes de flux de données (DFG), pour améliorer sa compréhension de la structure du code.
Le modèle accepte les entrées sous deux formes : sous la forme d'une séquence de tokens représentant le code réel et comme le graphe de flux de données sérialisé décrivant comment les variables interagissent. Cette configuration permet au modèle de mieux comprendre les relations entre les différentes parties du code, ce qui est essentiel pour faire des prédictions correctes de parallélisation.
La capacité du modèle à tirer parti de différentes représentations de code conduit à des prédictions plus précises et robustes concernant la nécessité des pragmas OpenMP et les clauses privées ou de réduction nécessaires.
Évaluation du modèle
Pour tester le nouveau modèle, des expériences approfondies ont été menées en utilisant un ensemble de données de plus de 54 000 extraits de code C et C++ spécifiquement conçus pour l'analyse OpenMP. Cet ensemble de données a été soigneusement élaboré pour s'assurer qu'il contenait des exemples pertinents de code parallèle, maximisant ainsi son efficacité pour l'entraînement et l'évaluation.
Les résultats indiquent que le modèle proposé surpasse significativement les approches traditionnelles et les modèles IA existants dans la prédiction du besoin de pragmas OpenMP. Il atteint une meilleure précision et réduit les chances de faux négatifs, ce qui signifie qu'il identifie plus correctement les situations où la parallélisation est faisable.
Le modèle montre également des améliorations basées sur le contexte, indiquant que prendre en compte un champ plus large du code entourant une boucle for mène à de meilleures prédictions.
Utilisation de l'augmentation de données
Des techniques d'augmentation de données ont été appliquées pour améliorer encore les performances du modèle. Dans ce contexte, les variables ont été renommées pendant l'entraînement pour créer un ensemble de données plus diversifié. Cette méthode visait à empêcher le modèle de trop s'appuyer sur des noms de variables spécifiques, lui permettant de mieux généraliser à de nouveaux exemples.
L'introduction de l'apprentissage par curriculum, où l'augmentation de données est progressivement augmentée, s'est avérée bénéfique. Cela a aidé le modèle à maintenir un bon niveau de performance même face à des entrées modifiées.
Comparaison entre la classification multi-label et binaire
Un aspect notable de la recherche était une comparaison entre le traitement des tâches de prédiction individuellement (classification binaire) versus collectivement (classification multi-label). Les résultats suggèrent qu'une approche multi-label, qui considère les tâches de prédiction des pragmas OpenMP et des attributs de mémoire partagée ensemble, donne de meilleurs résultats.
En reconnaissant les relations entre les tâches, la méthode multi-label permet une stratégie de prédiction plus intégrée, conduisant à moins de faux négatifs et à une meilleure performance globale dans l'identification du besoin de parallélisation.
Tests dans le monde réel
Le modèle a également été appliqué à des benchmarks du monde réel, tels que NAS, SPEC et PolyBench, qui consistent en des codes scientifiques conçus pour utiliser OpenMP efficacement. Les performances du modèle proposé étaient nettement meilleures que celles des approches existantes, montrant son applicabilité dans des scénarios pratiques.
Pour mieux contextualiser ses capacités, le modèle a été comparé à ChatGPT, un outil IA bien connu. Bien que ChatGPT excelle dans de nombreuses tâches de traitement du langage naturel, il n'a pas bien performé dans la prédiction des pragmas OpenMP, soulignant la nature spécialisée du design du modèle proposé.
Conclusion et travaux futurs
Cette recherche souligne l'importance de tirer parti des modèles multimodaux pour prédire avec précision le besoin de parallélisation dans le code. En utilisant diverses représentations du code, comme les AST et DFG, le modèle proposé atteint des performances supérieures par rapport aux modèles basés uniquement sur le code original.
Les résultats révèlent qu'une approche collaborative pour prédire le besoin de parallélisation et les attributs de mémoire partagée offre des améliorations notables. S'appuyant sur ce succès, les futurs travaux se concentreront sur l'amélioration encore plus des performances du modèle en le pré-entraînant sur des ensembles de données qui mettent l'accent sur le code C et C++.
De plus, la recherche explorera la génération directe de pragmas OpenMP, offrant un meilleur contrôle sur les tâches de parallélisation et améliorant la correction globale des modifications de code suggérées.
En résumé, ce travail ouvre de nouvelles pistes dans le domaine de la programmation assistée par IA, visant à combler le fossé entre la demande croissante de calcul parallèle et la complexité d'écrire un code parallèle efficace.
Titre: Advising OpenMP Parallelization via a Graph-Based Approach with Transformers
Résumé: There is an ever-present need for shared memory parallelization schemes to exploit the full potential of multi-core architectures. The most common parallelization API addressing this need today is OpenMP. Nevertheless, writing parallel code manually is complex and effort-intensive. Thus, many deterministic source-to-source (S2S) compilers have emerged, intending to automate the process of translating serial to parallel code. However, recent studies have shown that these compilers are impractical in many scenarios. In this work, we combine the latest advancements in the field of AI and natural language processing (NLP) with the vast amount of open-source code to address the problem of automatic parallelization. Specifically, we propose a novel approach, called OMPify, to detect and predict the OpenMP pragmas and shared-memory attributes in parallel code, given its serial version. OMPify is based on a Transformer-based model that leverages a graph-based representation of source code that exploits the inherent structure of code. We evaluated our tool by predicting the parallelization pragmas and attributes of a large corpus of (over 54,000) snippets of serial code written in C and C++ languages (Open-OMP-Plus). Our results demonstrate that OMPify outperforms existing approaches, the general-purposed and popular ChatGPT and targeted PragFormer models, in terms of F1 score and accuracy. Specifically, OMPify achieves up to 90% accuracy on commonly-used OpenMP benchmark tests such as NAS, SPEC, and PolyBench. Additionally, we performed an ablation study to assess the impact of different model components and present interesting insights derived from the study. Lastly, we also explored the potential of using data augmentation and curriculum learning techniques to improve the model's robustness and generalization capabilities.
Auteurs: Tal Kadosh, Nadav Schneider, Niranjan Hasabnis, Timothy Mattson, Yuval Pinter, Gal Oren
Dernière mise à jour: 2023-05-16 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2305.11999
Source PDF: https://arxiv.org/pdf/2305.11999
Licence: https://creativecommons.org/licenses/by/4.0/
Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.
Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.