Simple Science

La science de pointe expliquée simplement

# Informatique# Apprentissage automatique# Intelligence artificielle# Langages de programmation

Avancées dans l'optimisation des programmes tensoriels

Une nouvelle méthode améliore l'efficacité des réseaux de neurones profonds grâce à une optimisation automatisée.

― 8 min lire


Percée dansPercée dansl'optimisation destenseursdes DNN.performance et l'efficacité d'exécutionDe nouvelles techniques boostent la
Table des matières

L'optimisation des réseaux de neurones profonds (DNNs) est super importante pour améliorer la performance des applications modernes d'apprentissage machine. Les frameworks DNN utilisent généralement des Programmes Tensoriels, qui sont des représentations graphiques des calculs impliquant des tenseurs. Les tenseurs, c'est en gros des tableaux de données, et ces représentations permettent au système d'exécuter efficacement des opérations complexes.

Le défi de l'optimisation

Des frameworks traditionnels comme PyTorch et TensorFlow utilisent des stratégies d'optimisation manuelles pour convertir les programmes tensoriels en noyaux GPU performants. Ces méthodes demandent souvent beaucoup de travail d'ingénierie, ce qui peut faire rater des opportunités d'optimisation. C'est là que les techniques d'optimisation automatisée entrent en jeu. Récemment, on a essayé d'automatiser le processus d'optimisation des programmes tensoriels en explorant différentes transformations pour améliorer les Performances sur le matériel cible.

Ces approches automatisées tombent généralement dans deux catégories. La première catégorie se concentre sur la séparation des algorithmes et de leurs plannings d'exécution. La deuxième catégorie se concentre sur les transformations algébriques, qui exploitent les relations mathématiques entre différents algorithmes.

Malgré des avancées significatives, les méthodes d'optimisation automatisées actuelles exigent que les programmeurs spécifient manuellement un ensemble de noyaux. Cette limitation signifie que des Optimisations de performance plus complexes, qui peuvent impliquer plusieurs niveaux de calcul (comme les niveaux de noyaux, de blocs de threads et de threads), nécessitent toujours une mise en œuvre manuelle.

Présentation d'un Superoptimiseur multi-niveaux

On propose une nouvelle approche avec un superoptimiseur multi-niveaux spécialement conçu pour les programmes tensoriels. Ce nouveau système intègre une méthode unifiée pour trouver et vérifier automatiquement des optimisations tensoriels sophistiquées. En opérant à plusieurs niveaux de la hiérarchie de calcul GPU, il peut découvrir des optimisations qui étaient auparavant hors de portée.

Le concept clé ici est une représentation hiérarchique des programmes tensoriels. Cette structure permet à l'optimiseur de traiter les calculs à différents niveaux de manière uniforme. Cela inclut les noyaux, les blocs de threads et les threads, ce qui lui permet de capturer différents types de transformations.

Le superoptimiseur multi-niveaux améliore non seulement les transformations algébriques et le scheduling, mais introduit aussi de nouveaux noyaux personnalisés, élargissant ainsi la gamme d'optimisations qui peuvent être découvertes automatiquement.

Réduire l'espace de recherche

Un des principaux défis de l'optimisation est de naviguer dans un vaste espace de recherche de transformations possibles. Pour y remédier, le nouveau superoptimiseur utilise une technique de pruning novatrice basée sur des représentations abstraites. Ce pruning aide à limiter le nombre d'options à considérer tout en garantissant que les solutions trouvées sont optimales.

De plus, l'optimiseur emploie une procédure de vérification d'équivalence probabiliste qui garantit que le programme optimisé reste équivalent au programme d'entrée original. Cette étape est cruciale car elle assure que les gains de performance ne se font pas au détriment de l'exactitude.

Évaluation des performances

En évaluant notre nouvelle approche, on l'a comparée aux frameworks d'optimisation existants sur plusieurs benchmarks communs utilisés dans les DNNs. Notamment, notre optimiseur a montré des améliorations de performance allant jusqu'à 3,5 fois, même pour des DNNs ayant déjà subi une optimisation approfondie.

L'importance d'une exécution haute performance

Générer des programmes tensoriels efficaces pour les DNNs sur GPU est essentiel pour les tâches modernes d'apprentissage machine. Les frameworks DNN traditionnels décrivent des calculs complexes en utilisant des programmes tensoriels, qui peuvent être visualisés comme des graphes acycliques dirigés. Chaque nœud dans ces graphes représente des opérations tensoriels comme des multiplications de matrices, et les arêtes représentent les tenseurs qui circulent entre eux.

Pour optimiser un programme tensoriel, les frameworks existants s'appuient souvent sur des règles élaborées manuellement qui associent ces opérations tensoriels à des noyaux GPU écrits par des experts. Cependant, ces approches peuvent être chronophages et risquent de rater des optimisations potentielles.

Approches automatisées

Des travaux récents se sont concentrés sur l'automatisation de l'optimisation des programmes tensoriels en explorant un large éventail de transformations. Ces transformations peuvent significativement améliorer les performances en modifiant la façon dont les calculs sont effectués sur le GPU.

Il y a généralement deux types d'approches automatisées. Le premier type fonctionne en séparant l'algorithme de son planning d'exécution, qui décrit comment exécuter le calcul sur le matériel. Cette méthode permet à l'optimiseur de se concentrer sur l'optimisation du plan d'exécution indépendamment des calculs effectués.

Le deuxième type d'approche met l'accent sur les transformations algébriques, manipulant les expressions mathématiques représentant les calculs pour trouver de meilleures alternatives en termes de performance. Cependant, les deux méthodes nécessitent encore des retours des programmeurs pour définir les noyaux disponibles, ce qui limite leur efficacité.

Une nouvelle représentation

Le superoptimiseur multi-niveaux introduit une nouvelle représentation capable de décrire les programmes tensoriels à travers divers niveaux de hiérarchie de calcul GPU. Cette représentation capture les calculs aux niveaux de noyaux, de blocs de threads et de threads, permettant à la fois des transformations algébriques et de scheduling.

En décomposant les calculs en sous-programmes, l'optimiseur peut réduire l'espace de recherche tout en tirant parti de nombreuses opportunités d'optimisation. Cette partition rend plus facile l'exploration des optimisations potentielles sans submerger le processeur avec trop d'options à la fois.

Génération d'optimisations candidates

Pour découvrir des optimisations potentielles, le superoptimiseur multi-niveaux emploie une recherche guidée par expression. Ce processus génère des graphes de noyaux et de blocs de manière incrémentale en considérant une gamme d'opérateurs potentiels.

L'optimiseur utilise également une approche basée sur des règles pour former des graphes de threads qui représentent les calculs au niveau le plus bas. Cette hiérarchie simplifie non seulement la recherche d'optimisations candidates, mais garantit aussi que l'optimiseur peut explorer une plus large gamme de possibilités.

Techniques de pruning

Une grande partie de l'efficacité de l'optimiseur provient de ses techniques de pruning. En abstrait certains détails, l'optimiseur peut rapidement éliminer les options qui sont peu susceptibles d'offrir de bonnes performances. Cette abstraction aide à maintenir un espace de recherche gérable tout en évaluant un nombre suffisant d'alternatives.

De plus, l'optimiseur utilise un cadre théorique pour s'assurer que le processus de pruning ne passe pas à côté de solutions potentiellement optimales. La conception équilibre le besoin de minutie dans la recherche avec le besoin pratique de rapidité dans la recherche de solutions.

Garantir l'équivalence

La vérification est une étape essentielle qui garantit que le programme optimisé se comporte de la même manière que l'original. Pour y parvenir, le superoptimiseur multi-niveaux utilise une méthode de vérification d'équivalence probabiliste. Cette approche vérifie l'équivalence de deux programmes en créant des cas de test aléatoires et en comparant leurs sorties sur ces entrées.

Cette méthode évite non seulement les erreurs qui peuvent survenir à cause des calculs en virgule flottante, mais fournit aussi de fortes garanties théoriques de correction. En effectuant plusieurs tests, le processus de vérification peut minimiser le risque de faux positifs dans ses contrôles.

Évaluation des performances

On a évalué le superoptimiseur multi-niveaux à l'aide de douze benchmarks couramment utilisés dans les applications DNN d'aujourd'hui. Ces benchmarks incluaient diverses configurations de mécanismes d'attention et de perceptrons multicouches, qui sont des composants fondamentaux dans de nombreux modèles de langage modernes.

Les résultats de l'évaluation ont montré que notre optimiseur surpassait constamment les systèmes existants, atteignant des accélérations allant jusqu'à 3,5 fois dans certains cas d'utilisation. Cette amélioration de la performance est cruciale pour des applications où la rapidité et l'efficacité sont primordiales, notamment dans les tâches d'apprentissage machine en temps réel.

Conclusion

En résumé, le superoptimiseur multi-niveaux représente une avancée significative dans le domaine de l'optimisation des programmes tensoriels. En empruntant une représentation hiérarchique unique, il peut découvrir et vérifier automatiquement des optimisations sophistiquées qui étaient auparavant difficiles à mettre en œuvre.

Cette nouvelle approche améliore non seulement les performances, mais garantit aussi que les programmes restent corrects et fiables. À mesure que la demande pour un apprentissage machine haute performance continue de croître, des innovations comme le superoptimiseur multi-niveaux joueront un rôle vital dans l'avenir de l'exécution des DNN sur GPU.

Source originale

Titre: Mirage: A Multi-Level Superoptimizer for Tensor Programs

Résumé: We introduce Mirage, the first multi-level superoptimizer for tensor programs. A key idea in Mirage is $\mu$Graphs, a uniform representation of tensor programs at the kernel, thread block, and thread levels of the GPU compute hierarchy. $\mu$Graphs enable Mirage to discover novel optimizations that combine algebraic transformations, schedule transformations, and generation of new custom kernels. To navigate the large search space, Mirage introduces a pruning technique based on abstraction that significantly reduces the search space and provides a certain optimality guarantee. To ensure that the optimized $\mu$Graph is equivalent to the input program, Mirage introduces a probabilistic equivalence verification procedure with strong theoretical guarantees. Our evaluation shows that Mirage outperforms existing approaches by 1.1-2.9$\times$ even for DNNs that are widely used and heavily optimized. Mirage is publicly available at https://github.com/mirage-project/mirage.

Auteurs: Mengdi Wu, Xinhao Cheng, Oded Padon, Zhihao Jia

Dernière mise à jour: 2024-12-23 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2405.05751

Source PDF: https://arxiv.org/pdf/2405.05751

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.

Plus d'auteurs

Articles similaires