Aller au contenu principal

Les Tensor Cores

Introduction

Toutes les unités de calcul sont conçues pour prendre en charge des opérations arithmétiques et logiques. Certaines de ces opérations demandent néanmoins plus de calcul élémentaire que d'autres. La multiplication de matrices/tenseurs et la convolution font partie de ces opérations très gourmandes en calcul. Il se trouve qu'elles sont aussi très souvent utilisées en IA.

La simple multiplication de 2 matrices 4x4 va nécessiter 64 opérations de multiplication et 48 opérations d'addition. De plus, la complexité de calcul de ce type d'opération augmente très rapidement à mesure que la taille et les dimensions de la matrice augmentent1.

Pour répondre à ce problème, NVIDIA propose depuis son architecture Volta une unité de calcul spécifique : Le Tensor Core

C'est une unité de calcul spécialisée (de façon matérielle) dans la multiplication de tenseur. Là où les CUDA cores doivent réaliser une suite d'opérations élémentaires (multiplications et additions), les tensor cores réalisent la même chose en une seule fois. Le gain de temps peut alors être extrêmement important suivant la précision employée et le GPU utilisé. On parle d'un gain compris entre x2 et x3 sur la grande majorité des modèles de Deep Learning.

Utiliser et profiter de l'accélération des Tensor cores

Comme indiqué dans le paragraphe précédent, l'usage des tensor cores pour les opérations de multiplication permet un gain de performance très important. C'est donc une étape obligée pour ceux qui souhaitent optimiser leurs temps d'apprentissages (ou inférences).

Jean-Zay dispose de GPU NVIDIA V100, A100 et H100. Ces trois modèles disposent de tensor core. L'usage ainsi que l'implémentation diffèrent néanmoins entre les trois modèles.

Les tensor cores fonctionnent généralement avec des précisions plus faibles (critère matériel). Plus la précision est faible, plus le calcul va s'exécuter rapidement. Les précisions disponibles dépendent de l'architecture et du modèle de GPU.

Quelques exemples de précisions (et les performances associées) disponibles sur les tensor cores des GPU de Jean Zay :

Performance en TFLOPS par précision et GPU
GPU \ Précision FP64TF32FP16BF16INT8FP8
V100 x x 112 x x x
A100 19.5 156 312 x 624 x
H100 51.2 378 756 756 1513 1513

Utilisation sur les GPU NVIDIA V100 :

L’architecture V100 est la première à implémenter les Tensor Cores (640 tensor cores). En raison de leur conception matérielle, ces tensor cores réalisent des calculs uniquement avec une précision en Float16. La plupart des modèles d'IA sont en Float32. Si l'on souhaite profiter de l'accélération permise par les tensor cores, il faut donc réduire la précision des variables du modèle 2.

Pour ce faire, il y a deux solutions possibles :

  • Mettre l'ensemble des éléments de notre modèle en Float16
  • Mettre en place l'AMP (precision mixte) => Très recommandé

Utilisation sur les GPU NVIDIA A100 :

Les GPU A100 - plus récents et performants que les V100 - disposent de la 3ème génération de tensor core (432 tensor cores). Ils permettent l'usage des tensor cores avec les précisions couramment utilisées mais aussi avec des nouvelles. Les A100 peuvent gérer eux même l'usage de leurs tensor cores. Ainsi, sans ligne de code supplémentaire, le matériel va pouvoir convertir intelligemment certaines variables afin de réaliser des calculs sur tensor cores. On profite de l'accélération sans effort.

attention

L'architecture a des limites. Si l'on constate un usage automatique des tensor cores celui-ci est relativement faible.

astuce

L'AMP est toujours recommandée. Elle permet une utilisation plus importante des tensor cores par rapport à un usage sans indication. De plus l'AMP a d'autres avantages notamment concernant l'usage de la mémoire.

Utilisation sur les GPU NVIDIA H100 :

La dernière extension de Jean-Zay dispose de GPU NVIDIA H100. Encore plus récents et performants, ils disposent de la 4ème génération de tensor core (528 tensor cores). Les H100 supportent les même précisions que les A100, mais proposent également des tensor cores en BF16 et en FP8.

Footnotes

  1. Une multiplication de 2 matrices 8x8, c'est 512 multiplications et 448 additions

  2. Le terme précision se réfère aux nombres de bit utilisés pour stocker la variable