12.2.5 : GPU



  • Connect with the Experts: High-performance Data Analytics on the GPU [CWE41542] (1h01min32s)
    • Comment Scaler les données sur plusieurs GPU ?
    • Il y a Joe (tout le monde s'en fou mais je le dis)
    • MPI + X n'est pas forcément une bonne solution quand on cherche de la performance et l'efficacité énergétique
    • Quand on scale sur plusieurs GPU, on peut traiter plus de données mais on pert en efficacité énergétique
    • NVShmem (parallélisme implicite, les threads sont lancés au runtime) a l'air d'être plus scalable que Cuda + OpenMP
      • Point to point communication (pas de all to all, car ce n'est pas scalable). Le gros point de cette bibliothèque est qu'elle est scalable.
      • C'est un algorithme par Graph
      • Bibliothèque de communication basée sur Open SHMEM
      • On dit quelle mémoire on veut accéder et la Bibliothèque se débrouille (NVLink, Infiniband, etc)
      • Certaines parties de la mémoire des GPU sont accéssibles à distance mais pas toutes
      • Le modèle mémoire est symétrique (même allocation sur tous les GPU)
      • Normalement les gens familier avec MPI peuvent utiliser NVShmem facilement
      • Pour le moment NVShmem n'est pas intégré dans Omniverse, mais ça viendra
      • Comme toujours le placement des données est le plus important pour avoir une application scalable
      • On peut aussi utiliser NVShmem sur 2 GPU autant que sur 100 sans changement de code
      • Des codes de QCD utilisent déjà NVShmem
      • Il y aura des backend NVShmem pour Tensorflow et Pytorch
      • NVShmem s'utilise avec les Cuda Stream
      • NVShmem s'occupe de l'aggrégation des nessages pour ne pas échanger des paquets trop petits
      • On peut utiliser NVShmem dans un contexte MPI
      • UCX supporte RAPIDS, mais pas NVShmem
      • Pour l'instant les communications via le réseau sont faites avec un thread CPU qui récupère la réquette du thread GPU. Mais la communication directe est en travaux
      • On peut utiliser Shmem (pour l'hôte) et NVShmem (pour les GPU) dans la même application
      • NVShmem supporte les V100, A100, x86, etc
  • Cost Effective Data Processing with Apache Spark and GPUs [S41159] (47min24s)
    • RAPIDS pour Apache Spark
    • Outils de monitoring
    • Optimisation de Spark ETL (ils vont beaucoup plus vite et à moindre coût 48x pour $4\%$ du coût, où 160x sur 8 V100)
    • Ils ont un plugin pour Python, Panda, Dask, Cython, pour utiliser cuDF
    • RAPIDS est très bon pour les Agregations, tri et join (avec Parquet comme format de données)
    • Ça fonctionne sur EGX (A100) et Google Cloud (T4)
    • Les timelines de monitoring sont en SVG
    • Pour démarer SPARK 3.X + RAPIDS
  • Enabling Python User-Defined Functions in Accelerated Applications with Numba [S41056] (55min26s)
    • Numba fait du GPU avec Python
    • cuDF en python (développé en C++, utilise numba pour l'intégration avec Python)
    • PyOptix : NVidia Optix pour python
    • Il faut utiliser un décorateur @cuda.jit pour faire du GPU avec Numba
    • Les types sont déterminés automatiquement
    • Le type retourné est unifié par rapport à toutes les possibilités si il y a des branchements
    • Si ce n'est pas possible (genre on a un tuple dans un cas et un float dans l'autre). Ça foire, il n'y a pas de conversion pour que la fonction renvoie toujours un tuple
    • L'assembleur généré ne diffère pas trop de celui du CUDA C++.
  • Improving GPU Utilization using Kubernetes Engine [S41022] (29min40s)
    • Kubernetes est scalable, suporte les GPU
    • Gère le partage de temps et MIG
    • On peut ajouter dynamiquement un conteneur à un GPU, mais pas avec le MIG car on reconfigure le Hardware
    • Le partage de temps n'a pas de limite contrairement au MIG, mais le MIG est plus utile pour les tests à plus petite échelle
  • Multi-GPU Programming with MPI (a Magnum IO Session) [S41018] (50min50s)
    • Magnum IO est basé sur NVShmem (https://developer.nvidia.com/magnum-io)
    • Beaucoup de choses de recoupent avec les présentations NVShmem (échange d'information, stockage, etc)
    • Peut fonctionner avec MVAPICH (MVAPICH 2 a été annoncé à la GTC 2021)
    • Fonctionne avec CUDA_VISIBLE_DEVICES pour sélectionner les GPU qui sont visibles par l'application
    • MPS : Multi Process Service pour les applications MPI
    • Et il y a un mode débug (-g pour CPU et -G pour device)
    • Fonctionne aussi avec Cuda-gdb
    • Fonction avec OPenACC
  • Connect with the Experts: nvCOMP: GPU Compression/Decompression [CWE41740] (40min37s)
    • CWE41740_Slide_Deck_1648076975326001TKn2.pdf
    • Il y a plein d'algo de compression (sans perte) : de LZ4 à Cascaded en passant par Snappy et GDeflate (basé sur LZ77) et compatibles avec leurs équivalents CPU
    • Les algo propriétaires Bitcomp (qui a aussi un mode avec perte), ANS (Asymetric Numeral System) et GDeflate
    • L'API haut niveau de nvCOMP 2.2 a été simplfiée
    • Ils ont en train de travailler sur ZStandard
    • Peut-être utilisé avec le GPU Direct Storage
    • Sur les données tests, la compression la plus lente est à 4 GB/s (sur une A100)
    • La Décompréssion la plus lente est à 18 GB/s (sur une A100)
    • Ils sont en train de faire des benchmarks pour les A30 et les autres cartes du genre
    • Il faut au moins des fichiers de quelques Mo pour avoir de bonnes performances en compression/décompression
    • Pour le moment on ne peut pas appeler une fonction de compression dans un kernel Cuda
    • Ils vont ajouter une passe de BitShuffle pour mieux compresser (séparer les exposants des mantisses dans les float, etc)
    • Il vont ajouter d'autres compresion avec perte
    • Utiliser des chunk de moins de 8kB n'est pas efficace en terme de perf
    • Les données à décompresser doivent être accessible par le GPU
  • Bringing GPU-accelerated Computing and AI to the Classroom [S42540](15min08s)
    • Pour les cours de AI, Calcul et Robotique
    • NVidia Deeplearning Institute (DLI)
    • Comment faire pour être prof
    • Kits prêts pour les cours