Format virgule flottante bfloat16
From Wikipedia, the free encyclopedia
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
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
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
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].