Aller au contenu

Format virgule flottante bfloat16

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Bfloat16)

Le format virgule flottante bfloat16 (en anglais brain floating point)[1],[2] est un format de nombre (en) binaire occupant 16 bits en mémoire informatique ; Il représente une large gamme dynamique de valeurs numériques en utilisant un système de virgule flottante. Ce format est une version raccourcie (16 bits) du format à virgule flottante simple précision IEEE 754 32 bits (binary32), dans le but d’accélérer l’apprentissage automatique et l’informatique des capteurs intelligents (en)[3]. Il préserve la plage dynamique approximative des nombres à virgule flottante 32 bits en conservant 8 bits d’exposant, mais ne supporte qu’une précision de 8 bits au lieu du significande de 24 bits du format binary32. Plus que les nombres à virgule flottante simple précision 32 bits, les nombres bfloat16 ne conviennent pas aux calculs sur entiers, mais ce n’est pas leur usage prévu. Bfloat16 est utilisé pour réduire les besoins en stockage et augmenter la vitesse de calcul des algorithmes d’apprentissage automatique[4].

Lee format bfloat16 a été développé par Google Brain, un groupe de recherche sur l'intelligence artificielle chez Google. Il est utilisé dans beaucoup de CPU, de GPU et de processeurs IA, tels que les processeurs Intel Xeon (extensions BF16 d'AVX-512), les GPU Data Center d'Intel, Nervana (en) NNP-L1000 d'Intel, les FPGA Intel[5],[6],[7], AMD Zen, AMD Instinct, Les GPU de Nvidia, les TPU de Google Cloud[8],[9],[10], AWS Inferentia, AWS Trainium, ARMv8.6-A[11], et les puces Apple M2[12], A15 et suivantes. Beaucoup de librairies supportent bfloat16, telles que CUDA[13], oneAPI Math Kernel Library (en) d'Intel, ROCm (en) d'AMD[14], AMD Optimizing CPU Libraries, PyTorch et TensorFlow[10],[15]. Sur ces plateformes, bfloat16 peut être utilisé en arithmétique à précision mixte (en), où des nombres bfloat16 peuvent être utilisés et étendus à des types de données plus larges.

Format virgule flottante bfloat16

[modifier | modifier le code]

bfloat16 suit le format suivant :

  • Bit de signe : 1 bit
  • Largeur de l'exposant : 8 bits
  • Précision du significande : 8 bits (7 explicitement stockés, avec un bit de poids fort implicite), à comparer aux 24 bits du format virgule flottante simple précision classique

Le format bfloat16, étant une version raccourcie du format flottant simple précision IEEE 754 32 bits, permet une conversion rapide de et vers un flottant simple précision 32 bits IEEE 754 ; dans la conversion vers le format bfloat16, les bits d'exposant sont conservés tandis que le champ du significande peut être réduit par troncature (correspondant à l'arrondi vers 0) ou par d'autres mécanismes d'arrondi, en ignorant le cas particulier NaN. La conservation des bits de l'exposant maintient la gamme dynamique des flottants 32 bits de ≈ 10−38 à ≈ 3 × 1038[16].

Les bits sont disposés de la façon suivante :

Demi-précision IEEE 754 flottant 16 bits
signe exposant (5 bits) significande (10 bits)
  ┃
 0   0   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
15 14 10 9 0
 
bfloat16
signe exposant (8 bits) significande (7 bits)
  ┃
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0 
15 14 7 6 0
 
TensorFloat-32 (en) de Nvidia (19 bits)
signe exposant (8 bits) significande (10 bits)
  ┃
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
18 17 10 9 0
 
Format ATI fp24 [17]
signe exposant (7 bits) significande (16 bits)
  ┃
 0   0   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
23 22 16 15 0
 
Format Pixar PXR24
signe exposant (8 bits) significande (15 bits)
  ┃
 0   0   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
23 22 15 14 0
 
Simple précision IEEE 754 flottant 32 bits
signe exposant (8 bits) significande (23 bits)
  ┃
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
31 30 23 22 0

Codage de l'exposant

[modifier | modifier le code]

L'exposant d'un nombre en virgule flottante bfloat16 est codé en utilisant une représentation binaire décalée, le décalage du zéro étant de 127 ; appelée également exposant biaisé dans la norme IEEE 754.

  • Emin = 01H−7FH = −126
  • Emax = FEH−7FH = 127
  • Exposant biaisé = 7FH = 127

Par conséquent, de façon à obtenir le vrai exposant comme défini par la représentation binaire décalée, le décalage de 127 doit être soustrait de la valeur du champ d'exposant.

Les valeurs minimale et maximale du champ d'exposant (00H et FFH) sont interprétées spécialement, comme dans les formats de la norme IEEE 754.

Exposant Significande = zéro Significande ≠ zéro Équation
00H zéro, −0 nombres dénormalisés (−1)bit de signe×2−126× 0.bits de la mantisse
01H, ..., FEH valeur normalisée (−1)bit de signe×2exposant−127× 1.bits de la mantisse
FFH ±infini NaN (silencieux, avertisseur)

La plus petite valeur positive normalisée est 2−126 ≈ 1,18 × 10−38 et la plus petite valeur positive (dénormalisée) est 2−126−7 = 2−133 ≈ 9,2 × 10−41.

Arrondi et conversion

[modifier | modifier le code]

Le cas d’usage le plus courant est la conversion entre IEEE 754 binary32 et bfloat16. La section suivante décrit le processus de conversion et son schéma d’arrondi dans la conversion. On notera qu’il existe d’autres scénarios possibles de conversion de formats vers ou depuis bfloat16. Par exemple entre int16 et bfloat16.

  • De binary32 à bfloat16. Lorsque le format bfloat16 a été introduit pour la première fois comme format de stockage[15], la conversion du format virgule flottante binary32 (IEEE 754) en bfloat16 est une troncature (arrondi vers 0). Plus tard, lorsqu’elle devient l’entrée des unités de multiplication matricielle, la conversion peut avoir divers mécanismes d’arrondi selon les plateformes matérielles. Par exemple, pour les TPU de Google, le schéma d’arrondi dans la conversion est l'arrondi au pair le plus proche[18] ; ARM utilise le mode arrondi vers impair non IEEE[19] ; pour Nvidia, la conversion du nombre flottant binary32 en bfloat16 s'effectue en mode arrondi au plus proche[20].
  • De bfloat16 à binary32. Puisque le binary32 peut représenter toutes les valeurs exactes du bfloat16, la conversion ajoute simplement 16 zéros dans les bits du significande[18].

Références

[modifier | modifier le code]
  1. (en) Paul Teich, « Tearing Apart Google's TPU 3.0 AI Coprocessor », sur The Next Platform, (consulté le ) : « Google a inventé son propres format virgule flottante appelé "bfloat" pour "brain floating point" (d'après Google Brain). »
  2. (en) Shibo Wang et Pankaj Kanwar, « BFloat16: The secret to high performance on Cloud TPUs », sur Google Cloud, (consulté le ) : « This custom floating point format is called "Brain Floating Point Format," or "bfloat16" for short. The name flows from "Google Brain", which is an artificial intelligence research group at Google where the idea for this format was conceived. »
  3. (en) Giuseppe Tagliavini, Stefan Mach, Davide Rossi, Andrea Marongiu et Luca Benin, 2018 Design, Automation & Test in Europe Conference & Exhibition (DATE), , 1051–1056 p. (ISBN 978-3-9819263-0-9, DOI 10.23919/DATE.2018.8342167, arXiv 1711.10374, S2CID 5067903), « A transprecision floating-point platform for ultra-low power computing »
  4. (en-US) Dr. Ian Cutress, « Intel': Cooper lake Plans: Why is BF16 Important? », (consulté le ) : « The bfloat16 standard is a targeted way of representing numbers that give the range of a full 32-bit number, but in the data size of a 16-bit number, keeping the accuracy close to zero but being a bit more loose with the accuracy near the limits of the standard. The bfloat16 standard has a lot of uses inside machine learning algorithms, by offering better accuracy of values inside the algorithm while affording double the data in any given dataset (or doubling the speed in those calculation sections). »
  5. Khari Johnson, « Intel unveils Nervana Neural Net L-1000 for accelerated AI training », VentureBeat, (consulté le ) : « ...Intel will be extending bfloat16 support across our AI product lines, including Intel Xeon processors and Intel FPGAs. »
  6. Michael Feldman, « Intel Lays Out New Roadmap for AI Portfolio », TOP500 Supercomputer Sites, (consulté le ) : « Intel plans to support this format across all their AI products, including the Xeon and FPGA lines »
  7. Lucian Armasu, « Intel To Launch Spring Crest, Its First Neural Network Processor, In 2019 », Tom's Hardware, (consulté le ) : « Intel said that the NNP-L1000 would also support bfloat16, a numerical format that’s being adopted by all the ML industry players for neural networks. The company will also support bfloat16 in its FPGAs, Xeons, and other ML products. The Nervana NNP-L1000 is scheduled for release in 2019. »
  8. « Available TensorFlow Ops | Cloud TPU | Google Cloud », Google Cloud (consulté le ) : « This page lists the TensorFlow Python APIs and graph operators available on Cloud TPU. »
  9. (en) Elmar Haußmann, « Comparing Google's TPUv2 against Nvidia's V100 on ResNet-50 », RiseML Blog, (consulté le ) : « For the Cloud TPU, Google recommended we use the bfloat16 implementation from the official TPU repository with TensorFlow 1.7.0. Both the TPU and GPU implementations make use of mixed-precision computation on the respective architecture and store most tensors with half-precision. »
  10. a et b Tensorflow Authors, « ResNet-50 using BFloat16 on TPU », Google, (consulté le )
  11. (en) « BFloat16 extensions for Armv8-A », sur community.arm.com, (consulté le )
  12. (en) « AArch64: add support for newer Apple CPUs · llvm/llvm-project@677da09 », sur GitHub (consulté le )
  13. (en) « CUDA Library bloat16 Intrinsics »
  14. (en) « ROCm version history », sur github.com (consulté le )
  15. a et b (en) Joshua V. Dillon, Ian Langmore, Dustin Tran, Eugene Brevdo, Srinivas Vasudevan, Dave Moore, Brian Patton, Alex Alemi, Matt Hoffman, Rif A. Saurous, TensorFlow Distributions, (Bibcode 2017arXiv171110604D, arXiv 1711.10604)
  16. (en) « Livestream Day 1: Stage 8 (Google I/O '18) - YouTube », Google, (consulté le ) : « In many models this is a drop-in replacement for float-32 »
  17. (en) Ian Buck, GPU Gems, Addison-Wesley, (ISBN 0-321-33559-7), « Chapter 32. Taking the Plunge into GPU Computing ».
  18. a et b (en) « The bfloat16 numerical format », sur Google Cloud (consulté le ) : « On TPU, the rounding scheme in the conversion is round to nearest even and overflow to inf. »
  19. (en) « Arm A64 Instruction Set Architecture », sur developer.arm.com (consulté le ) : « Uses the non-IEEE Round-to-Odd rounding mode. »
  20. (en) « 1.3.5. Bfloat16 Precision Conversion and Data Movement », sur docs.nvidia.com (consulté le ) : « Converts float number to nv_bfloat16 precision in round-to-nearest-even mode and returns nv_bfloat16 with converted value. », p. 199