15 points par GN⁺ 2025-02-22 | 1 commentaires | Partager sur WhatsApp
  • Les GPU sont des processeurs massivement parallèles dotés de milliers de cœurs, conçus pour traiter de nombreuses tâches simultanément
  • Les CPU excellent dans les tâches complexes et séquentielles, mais le nombre d’opérations qu’ils peuvent traiter en parallèle reste limité
  • À l’inverse, les GPU traitent les tâches en parallèle via des milliers de threads, ce qui les rend particulièrement efficaces pour traiter rapidement de gros volumes de données
  • Par exemple, le GPU NVIDIA RTX 4090 dispose de 16 384 cœurs CUDA, à comparer aux 16 à 24 cœurs d’un CPU haut de gamme
  • Chaque cœur GPU est plus lent qu’un cœur CPU, mais le traitement parallèle d’un très grand nombre de cœurs le rend adapté aux calculs massifs comme les opérations matricielles

CUDA et Python

  • CUDA (Compute Unified Device Architecture) de NVIDIA est à la fois une plateforme et une extension de C++ qui permet d’écrire des programmes s’exécutant sur GPU
  • CUDA fournit un modèle de programmation et des API permettant aux développeurs d’écrire du code exécuté directement sur GPU
  • Cela permet de déporter du CPU vers le GPU les tâches pouvant être parallélisées afin d’améliorer les performances
  • Les développeurs Python peuvent exploiter l’accélération GPU avec des outils comme Numba
  • Numba est un compilateur Python capable de compiler du code Python pour l’exécuter sur des GPU compatibles CUDA
  • Grâce à cela, les développeurs Python peuvent se lancer facilement dans le calcul accéléré par GPU avec un minimum de nouvelle syntaxe et de nouveaux concepts
  • CUDA Python fournit des wrappers Cython/Python pour les API du pilote CUDA et du runtime, afin de permettre aux développeurs Python de tirer parti du calcul parallèle sur GPU
  • CUDA Python peut être installé via PIP et Conda

Structure des threads et des blocs dans CUDA

  • Dans CUDA, un kernel est une fonction exécutée sur le GPU ; lorsqu’un kernel est lancé, des centaines ou des milliers de threads parallèles s’exécutent simultanément pour traiter des données différentes
  • Ce modèle est appelé SIMT (Single-Instruction Multiple-Thread)
  • Les threads sont organisés en warps (groupes de 32 threads), eux-mêmes regroupés en blocs
  • Chaque bloc s’exécute sur un Streaming Multiprocessor (SM), qui dispose de ressources limitées (registres, mémoire partagée, etc.)
  • La taille des blocs influe sur l’allocation de ces ressources et sur le nombre de warps pouvant s’exécuter en même temps (occupancy)
  • En définissant correctement le nombre et la taille des blocs de threads, il est possible d’utiliser efficacement les ressources du GPU

Gestion mémoire et optimisation

  • En programmation CUDA, il faut gérer explicitement la mémoire entre le CPU (hôte) et le GPU (device)
  • Le flux habituel est le suivant :
    • allocation de mémoire GPU (cudaMalloc)
    • copie des données de l’hôte vers le device (cudaMemcpy)
    • exécution du kernel
    • copie des résultats du device vers l’hôte (cudaMemcpy)
    • libération de la mémoire GPU (cudaFree)
  • La mémoire partagée est une mémoire on-chip qui permet aux threads d’un même bloc de partager rapidement des données, ce qui améliore la vitesse d’accès mémoire
  • La synchronisation entre threads s’implémente avec __syncthreads(), ce qui permet d’éviter les race conditions

Kernels CUDA personnalisés pour les LLM

  • Pour les charges de travail liées aux grands modèles de langage (LLM), des kernels CUDA personnalisés sont développés afin de fusionner plusieurs opérations en un seul kernel, réduire la surcharge mémoire et améliorer l’efficacité
  • Par exemple, FlashAttention optimise le self-attention des Transformers en réduisant les lectures et écritures mémoire, ce qui améliore fortement l’efficacité
  • FlashAttention exploite la mémoire partagée pour tuiler les calculs, ce qui permet d’obtenir une efficacité élevée même sur de longues séquences
  • Ces optimisations permettent de résoudre les problèmes de bande passante mémoire qui deviennent un goulot d’étranglement en deep learning

Comparaison entre PyTorch et une implémentation CUDA

  • Dans PyTorch, les opérations GPU peuvent être effectuées facilement grâce à des abstractions de haut niveau
  • Par exemple, l’addition de deux vecteurs peut être implémentée très simplement comme suit :
import torch  
  
# Création de deux grands vecteurs sur le GPU  
a = torch.rand(1000000, device='cuda')  
b = torch.rand(1000000, device='cuda')  
  
# Addition élément par élément  
c = a + b  
  • Cependant, lorsqu’une optimisation des performances est nécessaire, il est possible d’écrire des kernels personnalisés en utilisant directement CUDA
  • CUDA permet d’ajuster finement les schémas d’accès mémoire, l’organisation des threads, l’utilisation de la mémoire partagée, etc., afin de maximiser les performances
  • Par exemple, l’implémentation CUDA de FlashAttention optimise les accès mémoire et tuile les calculs dans la mémoire partagée pour améliorer les performances
  • Ce type d’optimisations bas niveau permet d’atteindre des performances supérieures à celles de l’implémentation haut niveau de PyTorch

Conclusion

  • En exploitant les capacités de traitement parallèle des GPU, il est possible d’effectuer efficacement des traitements de données massifs et des calculs complexes
  • CUDA est une plateforme qui permet d’exploiter au maximum les performances des GPU, et les développeurs Python peuvent eux aussi en tirer parti avec des outils comme Numba
  • Comprendre la structure des threads et des blocs dans CUDA, ainsi que les techniques de gestion mémoire, permet de programmer plus efficacement sur GPU
  • En particulier, dans des domaines comme le deep learning, l’écriture de kernels CUDA personnalisés permet de pousser les performances au maximum
  • Même en utilisant des frameworks de haut niveau comme PyTorch, il reste possible de viser de meilleures performances grâce à des optimisations CUDA bas niveau lorsque c’est nécessaire

1 commentaires

 
GN⁺ 2025-02-22
Commentaires Hacker News
  • Question idiote : en tant qu’ingénieur, est-il possible d’explorer en profondeur les aspects bas niveau de CUDA ou de l’architecture GPU sans apprendre les aspects mathématiques de l’IA ? Si oui, par où commencer ? J’ai l’impression qu’il faut apprendre l’optimisation et les raisons pour lesquelles on utilise les GPU pour certains calculs

    • Question parallèle : en travaillant comme data engineer, je me suis toujours demandé s’il était possible d’entrer dans le MLE ou l’ingénierie des données pour l’IA sans connaître l’IA/ML. Je pensais qu’il suffisait de connaître la forme des données, mais dans toutes les fiches de poste MLE que j’ai vues jusqu’à présent, un background en IA est requis
  • Très bon article. Les quiz intégrés en ligne (QnA), qui semblent générés par l’IA, sont très utiles pour tester la compréhension. J’aimerais que tous les tutoriels incluent cette fonctionnalité

  • Je me demande si tous les tutoriels CUDA visent l’IA, ou s’il en existe aussi, par exemple, pour le calcul scientifique général. Ce serait amusant d’essayer des choses comme l’écoulement de l’air sur une aile pour le calcul haute performance

  • Merci pour le partage, j’ai pris plaisir à le lire. J’ai une petite question connexe : je me demande s’il existe des éclairages sur la manière dont DeepSeek a contourné CUDA pour rendre l’exécution plus efficace

    • J’ai toujours trouvé surprenant qu’une bibliothèque fondamentale comme CUDA, développée depuis si longtemps, ait encore une marge d’amélioration. Surtout au point qu’une nouvelle équipe de développeurs puisse combler l’écart par elle-même
  • Quand Jensen donne, Guido reprend

  • Ce livre : "Programming Massively Parallel Processors" semble conçu sur mesure pour les personnes qui passent de l’architecture CPU à l’architecture GPU

  • Regardez aussi https://github.com/rust-gpu/rust-gpu et https://github.com/rust-gpu/rust-cuda

  • Liens connexes : https://sakana.ai/ai-cuda-engineer/ et https://reddit.com/r/MachineLearning/…

  • Je me demande si quelqu’un a une idée de ce qui a changé récemment pour qu’il soit désormais possible d’exécuter de bout en bout sur GPU des simulations qui, auparavant, n’étaient possibles que sur CPU (par ex. isaac sim)

  • Comme c’est sur le site de PySpur, je me demande si quelqu’un a de l’expérience avec des outils UI pour agents IA comme PySpur et n8n. Je cherche quelque chose qui pourrait m’aider à prototyper quelques idées pour le plaisir. Il faudra que ce soit auto-hébergé ($), donc je préférerais quelque chose de relativement simple à configurer, comme Open Hands