GPU Ampere : NVIDIA détaille son architecture

GPU Ampere : NVIDIA détaille son architecture

Bonne lecture !

Avatar de l'auteur
David Legrand

Publié dans

Hardware

20/05/2020 2 minutes
10

GPU Ampere : NVIDIA détaille son architecture

La semaine dernière, Jen Hsun Huang a levé le voile sur sa nouvelle puce A100 de la génération Ampere, et les produits qui vont l'exploiter, tant dans les serveurs que l'embarqué. Peu à peu, de nouveaux détails sont dévoilés sur cette architecture qui servira de base aux prochaines GeForce.

L'A100 est un monstre de plus de 54 milliards de transistors, gravé en 7 nm et accompagné de 40 Go de HBM 2 à 1,6 To/s. Mais il apporte surtout de nombreuses évolutions techniques.

Amélioration globale des performances, format de données TF32, accélération des matrices creuses, segmentation du GPU pour les environnements  virtualisés, nouveaux Tensor Core, PCIe 4.0 et interconnexion de nouvelle génération. Tant d'éléments qui font de cette puce une bête pour datacenters. 

Si aucun RT Core n'est intégré, c'est que l'A100 se destine principalement aux centres de calcul, à tout ce qui touche à l'IA, au machine learning plus qu'au simple rendu 3D en temps réel. 

Depuis l'annonce de sa puce, NVIDIA avait livré de nouveaux détails sur sa composition, ses caractéristiques ou son organisation interne. Nous avions néanmoins décidé d'attendre avant de nous y pencher, plusieurs présentations et échanges avec leurs équipes étant prévus dans les jours à venir. 

On apprend ce matin que le White paper détaillant Ampere, ses Streaming Multiprocessor et autres unités est désormais disponible à tous. 83 pages de données techniques... qui restent à décortiquer. 

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Le brief de ce matin n'est pas encore là

Partez acheter vos croissants
Et faites chauffer votre bouilloire,
Le brief arrive dans un instant,
Tout frais du matin, gardez espoir.

Fermer

Commentaires (10)


Je viens de voir que les tensor core de l’A100 permettent de faire un produit matriciel en 848 (un produit entre une matrice 88 et une matrice 48, pour un résultat dans une matrice 48) en FP16 là où les V100 ne faisait que du 44*4.



Pour l’utilisation des TF32, d’après ce que je lis, ça serait utilisait par défaut (j’imagine que c’est géré au niveau de cuDNN et que la modification d’une variable système modifie ce comportement). C’est à voir, ça devrait normalement être bien dans la plupart des cas.



J’avoue cependant que ce format est vachement tordu, ça fait un truc sur 19bit (8 d’exposant, 10 mantice, 1 de signe) ça ne ressemble à rien, je ne vois même pas comment ça peut fonctionner matériellement (ça fait entre 2 et 3 octet), 19, c’est un nombre premier, il faut donc en coller 8 ensemble pour que ça rentre dans un truc en octet (152bit).



tazvld a dit:


Je viens de voir que les tensor core de l’A100 permettent de faire un produit matriciel en 8_4_8 (un produit entre une matrice 8_8 et une matrice 4_8, pour un résultat dans une matrice 4_8) en FP16 là où les V100 ne faisait que du 4_4*4.Pour l’utilisation des TF32, d’après ce que je lis, ça serait utilisait par défaut (j’imagine que c’est géré au niveau de cuDNN et que la modification d’une variable système modifie ce comportement). C’est à voir, ça devrait normalement être bien dans la plupart des cas.J’avoue cependant que ce format est vachement tordu, ça fait un truc sur 19bit (8 d’exposant, 10 mantice, 1 de signe) ça ne ressemble à rien, je ne vois même pas comment ça peut fonctionner matériellement (ça fait entre 2 et 3 octet), 19, c’est un nombre premier, il faut donc en coller 8 ensemble pour que ça rentre dans un truc en octet (152bit).




Bonjour @tazvld,
Je ne suis pas sûre d’avoir compris la moitié de ce que tu décrit. Mais cela m’interpelle; une tel scientificité d’architecture, pourrait-elle permettre la génération d’algorithme spécifiques, très performants, mais quasiment inexploitables sur les autres architectures ?


@tazvld il y a pas mal d’infos ici : https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/
mon petit doigt me dit qu’ils le stockeront sur 20 bits, ce qui est beaucoup plus simple à gérer.



ferreol a dit:


Bonjour @tazvld, Je ne suis pas sûre d’avoir compris la moitié de ce que tu décrit. Mais cela m’interpelle; une tel scientificité d’architecture, pourrait-elle permettre la génération d’algorithme spécifiques, très performants, mais quasiment inexploitables sur les autres architectures ?




TL:DR



Pas plus que ça en général. Mais si tu veux faire du réseau de neurone, la question du matos aujourd’hui ne se pose pas : utilise du matos NVidia, C’est ce qu’il y a de plus performant et accessible (une carte grand publique fait déjà l’affaire).



Detail :



Alors, tout d’abord, les tensor core et tout ce qui y ressemblent ne sont destinés qu’aux réseaus de neurone (deep learning). En effet, l’opération de base qui est faite tout le temps est le produit de matrice matriciel. De plus il a été démontré que dans la grande majorité des cas, la précision du calcule n’est pas très important, on peut donc trifouillé avec des valeurs encoder sur très peut de bit.



L’unité de base d’un réseau de neurones sont les “couches de neurones” : c’est une opération qui transforme un table (tenseur) de nombres en une nouvelle table de nombre (de taille pas forcément identique). Le type d’opération, les (hyper-)paramètres pour les opérations, la taille de la table de sortie, la façon de combiner ces couches… tout ça fait le cœurs du réseau de neurone, son architecture.



L’apprentissage permet de trouver des valeurs de paramètres internes au couche que sont les poids et les biais.



Si tu as l”architecture plus les poids, tu peut recréer avec n’importe quelle solution le réseau de neurone fonctionnel (si tu veux le refaire en C sur CPU avec les instruction AVX2, tu peux le faire).



Il n’y a donc pas forcément de spécificité algorithmique plus que ça.



Cependant, si tu as l’architecture et la base de donnée, tu peux appliquer des modifications (type utilisé) pour optimiser et adapté le réseau pour certain matériel. Mais ça demande un certain travaille et parfois même un retravaille de l’architecture. C’est assez typique comme phase dès lors que tu veux adapté une réseau de neurone pour un téléphone portable. Mais si t’es encore un phase de Proof Of Concept, tu ne t’amuse pas trop avec ça, tout au plus tu optimises pour le matos que tu utilises (NVidia).



Toutes les opérations nécessaire pour un réseau de neurones sont possible sur CPU (mais ça c’est lent) et sur GPU (plus intéressant).



Il existe pour l’instant plusieurs solution matérielle spécialisé pour les réseau de neurones dont le but est vraiment d’être utltra spécifique à certaine opération :




  • tensor core (V1 dans les V100, V2 dans les RTX 20XX et V3 pour les A100) de NVidia

  • Tensor Process Unit (TPU) de Google/Alphabet

  • Neural Process Unit (NPU) de Qualcomm (Snapdragon) -> c’est le genre de truc qui sont utilisé par les appli constructeur de smartphone pour améliorer les photos.

  • Neural Process Unit (NPU) de Kirin (pareil pour des smarphone chinois)

  • Apple Neural Engine de Apple (pareil pour les appareil Apple)

  • ….



Et rien n’est vraiment standardisé niveau matériel, capacité…. Cependant chacun des constructeur fournissent une bibliothèque qui offre des opérations de base généraliste qui permet d’utiliser simplement les solutions matériels. Pour NVidia par exemple, par dessus CUDA (la bibliothèque de calcul sur GPU de NVidia), il propose la bibliothèque cuDNN (cuda Deep Neural Network) offrant une interface pour les opération essentielle des réseau de neurones. Derrière la bibliothèque se démerde avec le matos (il faut quand même avoir une CG NVidia compatible) pour faire tourner ça. J’ai cru par exemple lire que l’on peut demander d’utiliser prioritairement une solution plutôt qu’une autre (tu peux forcer l’utilisation des Cuda Core à la place des Tensor Core même si l’opération été compatible)



Mais généralement, tu n’utilise pas ce type de bibliothèque à la main, tu utilise une autre bibliothèque qui va elle gérer tout ça et offrir un ensemble d’outils plus simple à manipuler. Tu vas trouver 2-3 grandes bibliothèque :




  • Tensorflow : le mastodonte de google/Aphabet


    • Keras : un peu à part, c’était une bibliothèque qui permettait d’écrire en une poigné de ligne un réseau de neurone et de l’entrainé. Elle pouvait utiliser plusieurs bibliothèque plus bas niveau dont Tensorflow comme “moteur”. Elle a été racheté par Google et depuis l’année dernière est totalement intégré à Tensorflow (plus de possibilité d’utiliser autre chose que TF, ce qui en soit ne se faisait déjà plus trop)


  • PyTorch : la bibliothèque de Facebook, populaire pendant longtemps car elle était en quelque sorte plus simple à appréhender que Tensorflow, jusqu’à que cette derniere propose elle aussi l’eager exécution (exécution en direct) l’année dernière. Caffe/Caffe2 a fusionné avec PyTorch.



Tout ça t’abstrait pas mal des problèmes matériels. Sur tensorflow, le même code tournera aussi bien sur un GPU NVIdia (si tout est bien installé) que sur le CPU à défaut.



Cependant, comme dit plus haut,pour pouvoir utiliser le matériel spécialisé, tu va devoir un peu bidouiller, faire attention à certain point (type utilisé, dimension…) voir demander explicitement à la bibliothèque d’utiliser ce matériel (typiquement pour les TPU dans le Cloud de Google).



Maintenant tu as remarqué que je n’ai parlé que de NVidia, mais jamais d’AMD. Tout simplement car AMD est totalement inexistant dans le domaine. Il n’ont pratiquement rien investie dans le calcul sur GPU là où NVidia sont les pionners et leader du domaine. Depuis 2008 avec les 8800GTX et la sortie des Cuda Core, la seul solution viable pour faire du calcul sur GPU est NVidia. OpenCL peine à convaincre face à Cuda. Et comme tu peux le voir, NVIdia est toujours super agressive la dessus. En fouillant sur le net, il existe bien des solutions pour utiliser AMD, mais ça reste assez pauvre.


Une seconde génération de GPU totalement orienté IA et ML, et qui ne propose qu’un maigrichon gain de 25% par rapport à la génération précédente en terme de performances de calcul flottant en FP64.



Il y a tout un tas de domaines de la recherche scientifique, et beaucoup de R&D industrielles qui n’ont pas besoin de Tensor core, mais de CUDA cores, c’est-à-dire de la puissance de calcul flottante double-précision : du FP64.



Je comprends la hype autour de l’IA, mais si NVIDIA délaisse le FP64, qui va bien pouvoir les remplacer sur ce créneau ?


bonsoir,




Nozalys a dit:


Une seconde génération de GPU totalement orienté IA et ML, et qui ne propose qu’un maigrichon gain de 25% par rapport à la génération précédente en terme de performances de calcul flottant en FP64.Il y a tout un tas de domaines de la recherche scientifique, et beaucoup de R&D industrielles qui n’ont pas besoin de Tensor core, mais de CUDA cores, c’est-à-dire de la puissance de calcul flottante double-précision : du FP64.Je comprends la hype autour de l’IA, mais si NVIDIA délaisse le FP64, qui va bien pouvoir les remplacer sur ce créneau ?




Et il y a eu quelques news (que j ai lu dans le premier trimestre 2020) qui indiquent que pour certains domaines les IA sont plus un frein qu’un progrès.



Je ne dis pas qu’il faut pas utiliser les IA, je me demande seulement si c’est bien utile des les utilisées pour tout et n’importe quoi ??????


Pour tout est n’importe quoi, non c’est certain. Il faut considérer le machine learning comme un outil supplémentaire pour résoudre certains problèmes. Et comme tout outil, il fonctionne bien dans certains cas, et mal dans d’autres.



Seulement, ces quelques dernières années, il y a un énorme intérêt porté autour de la découverte des nouvelles possibilités de cet outil, et pour être efficace, on peut faire mieux que les CPU et les GPU “d’avant”, donc NVIDIA sort ses Tensor cores.



Problème : les enjeux économiques qui découlent de la fabrication d’un GPU de ce genre sont tels, que NVIDIA se focalise sur ce qui est ultra demandé en ce moment. Et par conséquent, ils ne peuvent pas assurer la montée en puissance de calcul “traditionnel” en FP64.



Ils proposent bien un mode FP64 tensor core qui multiplie la puissance de calcul par 2,5, mais je n’ai pas vu d’explication dans leur whitepaper à ce sujet, ce qui laisse penser que pour exploiter ça il ne suffira pas de remplacer une V100 par une A100, mais qu’il faudra (lourdement?) adapter le code existant. peut-être même que ça ne concerne que certains types de calcul..



Nozalys a dit:


Ils proposent bien un mode FP64 tensor core qui multiplie la puissance de calcul par 2,5, mais je n’ai pas vu d’explication dans leur whitepaper à ce sujet, ce qui laisse penser que pour exploiter ça il ne suffira pas de remplacer une V100 par une A100, mais qu’il faudra (lourdement?) adapter le code existant. peut-être même que ça ne concerne que certains types de calcul..




Pour les tensor core, de ce que j’ai lu, ça ne permet que de réaliser des produits matriciels.
(si tu veux des détail technique, j’ai trouvé ce lien qui explique plus son fonctionnement)



Sans dire que l’algèbre linéaire est inutile, mais ça ne correspond généralement qu’à des problèmes très mathématiques (ou que des mathématiciens se soient penchés dessus).


C’est aussi ce que je comprends à la lecture de l’article.



Autant dire que les FFT n’en tireront aucun bénéfice, et continueront d’être exécutées sur les CUDA cores. Donc pas de “gain” avec cette génération pour ce besoin. En revanche, si ça peut faire passer les V100 sous le seuil des 10 K€, ça sera au moins ça de pris (aujourd’hui il faut compter 12 K€).



Nozalys a dit:


C’est aussi ce que je comprends à la lecture de l’article.Autant dire que les FFT n’en tireront aucun bénéfice, et continueront d’être exécutées sur les CUDA cores. Donc pas de “gain” avec cette génération pour ce besoin. En revanche, si ça peut faire passer les V100 sous le seuil des 10 K€, ça sera au moins ça de pris (aujourd’hui il faut compter 12 K€).




Je viens de faire une recherche rapide, je suis tombé sur cette article qui décrit comment utiliser les tensor core pour faire une FFT en mixte precision (input en 16bit, output en 32bit, c’est un calcul qui est justement permit par les tensor core). Même si ce n’est pas exactement ce que tu cherches à faire, il y a a priori une possibilité d’utiliser les tensor core pour faire du FFT, mais ça sera à implémenter à la main.