LLVM Creator développe un nouveau langage de programmation Mojo

Chris Lattner, fondateur et architecte en chef de LLVM et créateur du langage de programmation Swift, et Tim Davis, ancien responsable de projets d'IA de Google tels que Tensorflow et JAX, ont présenté un nouveau langage de programmation, Mojo, qui allie facilité d'utilisation pour le développement de la recherche et prototypage rapide avec le potentiel de formuler des produits finaux hautes performances. Le premier est obtenu grâce à l'utilisation de la syntaxe familière du langage Python et le second grâce à la capacité de compiler en code machine, à des mécanismes de sécurité de la mémoire et à l'utilisation d'outils d'accélération matérielle.

Le projet est axé sur l'utilisation pour le développement dans le domaine de l'apprentissage automatique, mais est présenté comme un langage à usage général qui étend les capacités de Python avec des outils de programmation système et convient à un large éventail de tâches. Par exemple, le langage est applicable à des domaines tels que le calcul haute performance, le traitement et la transformation des données. Une fonctionnalité intéressante de Mojo est la possibilité de spécifier le caractère emoji « 🔥 » comme extension pour les fichiers de code (par exemple, « helloworld.🔥 »), en plus de l'extension de texte « .mojo ».

Actuellement, le langage est au stade de développement intensif et seule l'interface en ligne est proposée aux tests. Il est promis que des assemblys séparés destinés à être exécutés sur des systèmes locaux seront publiés ultérieurement, après avoir reçu des commentaires sur le fonctionnement de l'environnement Web interactif. Le code source du compilateur, du JIT et d'autres développements liés au projet devrait être ouvert une fois l'architecture interne terminée (le modèle de développement d'un prototype fonctionnel à huis clos rappelle la phase initiale de développement de LLVM, Clang et Rapide). Étant donné que la syntaxe Mojo est basée sur le langage Python et que le système de types est proche du C/C++, ils prévoient de développer à l'avenir des outils pour simplifier la traduction de projets existants écrits en C/C++ et Python vers Mojo, ainsi que pour développer des projets hybrides combinant du code Python et Mojo.

Le projet est conçu pour impliquer les ressources matérielles disponibles de systèmes hétérogènes dans la réalisation de calculs. Par exemple, les GPU, les accélérateurs d'apprentissage automatique spécialisés et les vecteurs d'instructions de processeur (SIMD) peuvent être utilisés pour exécuter des applications Mojo et paralléliser les calculs. Les raisons invoquées pour développer un sous-ensemble distinct du langage Python plutôt que de rejoindre le travail d'optimisation CPython existant incluent l'accent mis sur la compilation, l'intégration des capacités de programmation système et l'utilisation d'une architecture interne fondamentalement différente qui permet au code de s'exécuter sur des GPU et divers. accélérateurs matériels. Cependant, les développeurs de Mojo entendent rester autant que possible compatibles avec CPython.

Mojo peut être utilisé à la fois en mode interprétation à l'aide de JIT et pour la compilation en fichiers exécutables (AOT, en avance). Le compilateur intègre des technologies modernes pour l'optimisation automatique, la mise en cache et la compilation distribuée. Les textes sources en langage Mojo sont convertis en code intermédiaire de bas niveau MLIR (Multi-Level Intermediate Representation), développé par le projet LLVM et offrant des capacités supplémentaires pour optimiser le traitement du graphe de flux de données. Le compilateur vous permet d'utiliser divers backends prenant en charge MLIR pour générer du code machine.

L'utilisation de mécanismes matériels supplémentaires pour accélérer les calculs permet d'obtenir des performances supérieures aux applications C/C++ lors de calculs intensifs. Par exemple, lors du test d'une application de génération de l'ensemble de Mandelbrot, une application compilée en langage Mojo lorsqu'elle est exécutée dans le cloud AWS (r7iz.metal-16xl) s'est avérée 6 fois plus rapide que l'implémentation en C++ (0.03 sec. vs . 0.20 sec.), et également 35 3.10.9 fois plus rapide qu'une application Python lors de l'utilisation du standard CPython 0.03 (1027 s contre 1500 0.03 s) et 46.1 XNUMX fois plus rapide lors de l'utilisation de PYPY (XNUMX s contre XNUMX s). .

Lors de l'évaluation des performances dans le domaine de la résolution de problèmes d'apprentissage automatique, le moteur d'inférence modulaire de la pile AI, écrit dans le langage Mojo, par rapport à une solution basée sur la bibliothèque TensorFlow, était 3 fois plus rapide lors du traitement d'un modèle de langage sur un système avec un processeur Intel, 6.4 fois plus rapide lors du traitement de l'exécution du modèle de génération de recommandations et 2.1 fois plus rapide lors du travail avec des modèles de traitement des informations visuelles. Lors de l'utilisation de processeurs AMD, les gains lors de l'utilisation de Mojo étaient respectivement de 3.2, 5 et 2.2 fois, et lors de l'utilisation de processeurs ARM de 5.3, 7.5 et 1.7 fois. La solution basée sur PyTorch était en retard de 1.4, 1.1 et 1.5 fois sur les processeurs Intel, de 2.1, 1.2 et 1.5 fois sur les processeurs AMD et de 4, 4.3 et 1.3 fois sur les processeurs ARM.

LLVM Creator développe un nouveau langage de programmation Mojo

Le langage prend en charge le typage statique et des fonctionnalités de bas niveau de sécurité de la mémoire qui rappellent Rust, telles que le suivi de la durée de vie des références et le vérificateur d'emprunt. En plus des fonctionnalités permettant de travailler en toute sécurité avec des pointeurs, le langage fournit également des fonctionnalités pour le travail de bas niveau, par exemple l'accès direct à la mémoire en mode non sécurisé à l'aide du type Pointer, l'appel d'instructions SIMD individuelles ou l'accès à des extensions matérielles telles que TensorCores et AMX. .

LLVM Creator développe un nouveau langage de programmation Mojo

Pour simplifier la séparation du code Python classique et optimisé pour les fonctions avec des définitions de type explicites pour toutes les variables, il est proposé d'utiliser un mot-clé distinct « fn » au lieu de « def ». De même pour les classes, si vous avez besoin de regrouper statiquement des données en mémoire lors de la compilation (comme en C), vous pouvez utiliser le type « struct » au lieu de « class ». Il est également possible d'importer simplement des modules dans des langages C/C++, par exemple, pour importer la fonction cos depuis la bibliothèque math, vous pouvez spécifier « from « math.h » import cos ».

Source: opennet.ru

Ajouter un commentaire