NVIDIA ajoute une prise en charge native de Python à CUDA
(thenewstack.io)- CUDA s’étend au-delà de son écosystème centré sur le C/C++ pour permettre aux développeurs Python de travailler plus directement avec le calcul sur GPU NVIDIA
- Cette nouvelle prise en charge ne se limite pas à de simples bindings : elle vise à intégrer des interfaces Python et des flux de scripting à l’ensemble de la boîte à outils CUDA
- La pile CUDA Python comprend des bindings de base, un compilateur d’exécution, cuPyNumeric, CUDA Core, NVMath Python, ainsi que des outils de profilage et d’analyse de code
- NVIDIA cherche à améliorer la productivité en Python tout en gardant un faible écart de performance grâce à la compilation JIT et à l’intégration avec du code C++ existant
- L’interface CuTile est un modèle conçu pour aider les développeurs Python à comprendre et déboguer les traitements GPU en termes de tableaux et de tuiles plutôt que de threads
Python natif arrive dans CUDA
- Selon l’enquête open source 2024 de GitHub, Python est devenu le langage de programmation le plus populaire au monde, devant JavaScript
- La boîte à outils logicielle CUDA de NVIDIA n’a pas proposé de prise en charge native de Python pendant des années, mais une prise en charge native et une intégration complète ont été annoncées lors de la GTC
- Les développeurs peuvent désormais écrire directement en Python du calcul algorithmique exécuté sur les GPU NVIDIA
- L’architecte CUDA Stephen Jones a indiqué qu’il travaillait à faire de l’« accelerated Python » une prise en charge de premier plan dans la pile CUDA
- La nouvelle orientation ne consiste pas à transposer le C dans une syntaxe Python, mais à créer un CUDA Python naturel pour les développeurs Python
Élargissement à la base des développeurs Python
- CUDA exigeait jusqu’ici des connaissances en C++ ou en Fortran, et même s’il existait certains outils Python, ils n’étaient pas natifs
- La prise en charge native de Python ouvre les outils de développement CUDA à des millions de développeurs Python
- Selon The Futurum Group, le nombre d’utilisateurs de CUDA est passé de 2 millions en 2020 à 4 millions en 2023
- Python est un langage en forte croissance, et NVIDIA peut désormais toucher aussi les développeurs Python des pays émergents comme l’Inde et le Brésil
- Une grande partie des GPU NVIDIA se trouve aux États-Unis et en Europe, mais des entreprises indiennes des télécoms et des infrastructures construisent actuellement de grandes installations GPU qui seront exploitées à l’avenir
- NVIDIA investit fortement dans le recrutement de programmeurs et veut prendre en charge davantage de langages, dont Rust et Julia
Composition de la pile CUDA Pythonic
- CUDA comprend des bibliothèques, des SDK, des compilateurs, un runtime hôte, des outils, ainsi que des logiciels et algorithmes pré-packagés
- NVIDIA ajoute des composants à l’ensemble de la pile CUDA Pythonic
- L’objectif principal est d’apporter une accélération GPU sans quitter Python
- Selon Jones, CUDA Python ne doit pas se limiter à fournir des kernels : il faut une exécution fluide à travers toute la pile
- Il doit être possible d’écrire un kernel et de l’intégrer à PyTorch
- Il doit aussi être possible d’appeler des bibliothèques Pythonic et d’autres composants
- La couche compilateur est en pratique construite autour de la compilation JIT, ce qui réduit fortement l’arbre de dépendances de la pile GPU
- L’interopérabilité entre les couches est essentielle pour les gains de productivité qu’apporte un usage de Python de bout en bout
CUDA Core, cuPyNumeric, NVMath Python
- NVIDIA a d’abord construit des bindings Python de base, un compilateur d’exécution et des bibliothèques Python
- cuPyNumeric est un remplaçant drop-in de NumPy, la bibliothèque de calcul largement utilisée en Python
- Il suffit de modifier une seule instruction
importpour que du code NumPy s’exécute sur GPU au lieu du CPU
- Il suffit de modifier une seule instruction
- Au cours de l’année écoulée, NVIDIA a créé CUDA Core, que Jones considère comme une réinvention du runtime CUDA en un Python naturel et natif
- CUDA Core suit le flux d’exécution de Python, fonctionne entièrement dans le processus et repose fortement sur la compilation JIT
- NVIDIA a également créé NVMath Python, qui fournit une interface unifiée pour les appels de bibliothèques côté hôte et côté device
- Selon Jones, la capacité à fusionner les appels de bibliothèques conduit à de fortes améliorations de performance
- Des bibliothèques ont aussi été créées pour accéder directement depuis du code Python à des bibliothèques C++ accélérées
- Il ne s’agit pas de les réimplémenter en Python, mais de raccorder du code C++ existant déjà finement optimisé
- Jones estime qu’avec cette approche, l’écart de performance devient négligeable
- Des outils ont également été ajoutés pour les profileurs et les analyseurs de code
Modèle de programmation CuTile
- Python facilite l’écriture de code sans trop se soucier des détails matériels, et NVIDIA ajoute une couche de programmation adaptée à des abstractions de plus haut niveau pour l’exécution sur GPU
- Le nouveau modèle de programmation, l’interface CuTile, est d’abord développé pour CUDA Pythonic, avant une extension future vers CUDA C++
- CuTile est conçu en partant du principe que les développeurs Python, contrairement aux développeurs C++, pensent davantage en tableaux qu’en threads
- Il n’est pas possible d’exporter magiquement du code Python pour l’accélération GPU
- CUDA découpe généralement un problème en milliers de petits blocs
- Les blocs sont divisés en tuiles plus petites
- À l’intérieur des tuiles, des milliers de threads traitent des éléments individuels
- Les threads se regroupent pour exécuter une seule opération
- La grande capacité de calcul des GPU vient de leur aptitude à paralléliser le traitement jusqu’au niveau des éléments individuels via les threads
- NVIDIA estime que l’exécution GPU n’a pas nécessairement besoin de descendre jusqu’au niveau des threads et peut aussi être traitée au niveau intermédiaire des tuiles
- CuTile mappe efficacement les tableaux sur le GPU à un niveau moins granulaire, ce qui facilite la compréhension du code et le débogage
- Selon Jones, cette approche aboutit fondamentalement aux mêmes performances
- Les données d’une tuile peuvent se présenter sous forme de vecteurs, tenseurs ou tableaux
- Le compilateur peut mieux mapper des opérations sur des tableaux complets vers le GPU via des blocs de threads, et Jones estime qu’il fait souvent mieux que lui-même parce qu’il comprend en profondeur les détails de l’exécution GPU
- Python, contrairement au C++, n’est pas un langage finement granulaire par conception, et Jones cite Triton d’OpenAI comme un bon exemple d’adaptation naturelle à un programme Python
2 commentaires
Est-ce que ce sera finalement plus rapide que les wrappers CUDA existants comme CuPy ou PyTorch ? L’avantage de CuPy et de torch, c’est que leur API est presque identique à celle de NumPy, ce qui permettait de porter sans trop d’effort du code de test écrit avec NumPy ; il faudra voir à l’usage ce qu’il en est pour celui-ci.
La première vitesse, c’est réel ? C’est beaucoup trop lent...