bfloat16 formát s plovoucí desetinnou čárkou - bfloat16 floating-point format

Bfloat16 ( Brain Floating Point ) ve formátu s plovoucí desetinnou čárkou je číslo počítačový formát zabírat 16 bitů v paměti počítače ; představuje široký dynamický rozsah číselných hodnot pomocí plovoucího bodu radix . Tento formát je zkrácenou (16bitovou) verzí 32bitového formátu IEEE 754 s jednoduchou přesností s plovoucí desetinnou čárkou (binary32) se záměrem zrychlit strojové učení a výpočetní techniku ​​s blízkým senzorem . Zachovává přibližný dynamický rozsah 32bitových čísel s plovoucí desetinnou čárkou zachováním 8 exponentních bitů , ale podporuje pouze 8bitovou přesnost, nikoli 24bitový význam formátu binary32. Více než 32bitová čísla s plovoucí desetinnou čárkou s jednoduchou přesností nejsou čísla bfloat16 vhodná pro celočíselné výpočty, ale toto není jejich zamýšlené použití. Bfloat16 se používá ke snížení požadavků na úložiště a zvýšení rychlosti výpočtu algoritmů strojového učení.

Formát bfloat16 byl vyvinut společností Google Brain , výzkumnou skupinou pro umělou inteligenci ve společnosti Google. Formát bfloat16 se používá v procesorech Intel AI , jako jsou Nervana NNP-L1000, procesory Xeon ( rozšíření AVX-512 BF16) a Intel FPGA , Google Cloud TPU a TensorFlow . ARMv8.6-A , AMD ROCm a CUDA také podporují formát bfloat16. Na těchto platformách lze bfloat16 použít také v aritmetice se smíšenou přesností , kde lze čísla bfloat16 provozovat a rozšiřovat na širší datové typy.

bfloat16 formát s plovoucí desetinnou čárkou

bfloat16 má následující formát:

  • Signální bit : 1 bit
  • Šířka exponentu : 8 bitů
  • Významná přesnost : 8 bitů (7 explicitně uložených), na rozdíl od 24 bitů v klasickém formátu s jednoduchou přesností s plovoucí desetinnou čárkou

Formát bfloat16, který je zkráceným 32bitovým floatem s jednoduchou přesností IEEE 754 , umožňuje rychlou konverzi do az 32bitového floatu s jednou přesností IEEE 754; při převodu do formátu bfloat16 jsou exponentní bity zachovány, zatímco významné pole může být redukováno zkrácením (tedy odpovídajícím zaokrouhlování směrem k 0 ), přičemž speciální případ NaN je ignorován . Zachováním exponentních bitů se udržuje rozsah 32bitového floatu ≈ 10 −38 až ≈ 3 × 10 38 .

Bity jsou rozloženy následovně:

16bitový plovák IEEE s poloviční přesností
podepsat exponent (5 bitů) zlomek (10 bitů)
  ┃ ┌───────┐ ┌───────────────────┐
 0   0   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
15 14 10 9 0
32bitový float s jednou přesností IEEE 754
podepsat exponent (8 bitů) zlomek (23 bitů)
  ┃ ┌──────────────┐ ┌────────────────────────---- - - - - - - - - - - - - - - - - -
 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
bfloat16
podepsat exponent (8 bitů) zlomek (7 bitů)
  ┃ ┌──────────────┐ ┌────────────┐
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0 
15 14 7 6 0
NVidia's TensorFloat
podepsat exponent (8 bitů) zlomek (10 bitů)
  ┃ ┌──────────────┐ ┌───────────────────┐
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
18 17 10 9 0
Formát AMD fp24
podepsat exponent (7 bitů) zlomek (16 bitů)
  ┃ ┌────────────┐ ┌─------
 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
Formát Pixar PXR24
podepsat exponent (8 bitů) zlomek (15 bitů)
  ┃ ┌──────────────┐ ┌─------
 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

Kontrast s bfloat16 a jednoduchou přesností

S E E E E E E E E F F F F F F F F F F F F F F F F F F F F F F F

Legenda

  •   S: podepsat
  •   E: exponent
  •   F: zlomek (koncový význam ) v obou formátech
  •   f: zlomek (koncový význam) v 32bitové jednoduché přesnosti (srovnávací)

Kódování exponentů

Bfloat16 binární exponent s plovoucí desetinnou čárkou je kódován pomocí offset-binární reprezentace, přičemž nulový offset je 127; také známý jako zkreslení exponentu ve standardu IEEE 754.

Aby se tedy získal skutečný exponent definovaný ofsetovou binární reprezentací, musí být offset 127 odečten od hodnoty pole exponent.

Minimální a maximální hodnoty pole exponent (00 H a FF H ) jsou interpretovány speciálně, jako ve standardních formátech IEEE 754.

Exponent Významná nula Významné nenulové Rovnice
00 H nula , -0 subnormální čísla (−1) signbit × 2 −126 × 0. signifikantní bitů
01 H , ..., FE H normalizovaná hodnota (−1) signbit × 2 exponentbits −127 × 1. signifikantní bity
FF H ± nekonečno NaN (tichý, signalizace)

Minimální kladná normální hodnota je 2 −126 ≈ 1,18 × 10 −38 a minimální kladná (subnormální) hodnota je 2 −126−7 = 2 −133 ≈ 9,2 × 10 −41 .

Kódování speciálních hodnot

Pozitivní a negativní nekonečno

Stejně jako v IEEE 754 jsou kladné a záporné nekonečno reprezentovány odpovídajícími znaménkovými bity , všemi 8 exponentními bity (FF hex ) a všemi významnými bity nula. Výslovně,

val    s_exponent_signcnd
+inf = 0_11111111_0000000
-inf = 1_11111111_0000000

Není to číslo

Stejně jako v IEEE 754 , NaN hodnoty jsou představovány buď bit znaménka, všech 8 bitů exponent sada (FF hex ) a ne všechny significand bity nula. Výslovně,

val    s_exponent_signcnd
+NaN = 0_11111111_klmnopq
-NaN = 1_11111111_klmnopq

kde alespoň jeden z k, l, m, n, o, p nebo q je 1. Stejně jako u IEEE 754 mohou být hodnoty NaN tiché nebo signalizační, i když od září 2018 není známo použití signalizace bfloat16 NaN.

Dosah a přesnost

Bfloat16 je navržen tak, aby udržoval číselný rozsah od 32bitového formátu IEEE 754 s jednoduchou přesností s plovoucí desetinnou čárkou (binary32), přičemž snižuje přesnost z 24 bitů na 8 bitů. To znamená, že přesnost je mezi dvěma a třemi desetinnými číslicemi a bfloat16 může představovat konečné hodnoty až do přibližně 3,4 × 10 38 .

Příklady

Tyto příklady jsou uvedeny v bitové reprezentaci hodnoty s plovoucí desetinnou čárkou , v hexadecimálním a binárním formátu. To zahrnuje znaménko, (zkreslený) exponent a význam.

3f80 = 0 01111111 0000000 = 1
c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (28 − 1) × 2−7 × 2127 ≈ 3.38953139 × 1038 (max finite positive value in bfloat16 precision)
0080 = 0 00000001 0000000 = 2−126 ≈ 1.175494351 × 10−38 (min normalized positive value in bfloat16 precision and single-precision floating point)

Maximální kladná konečná hodnota normálního čísla bfloat16 je 3,38953139 × 10 38 , mírně pod (2 24 - 1) × 2 −23 × 2 127 = 3,402823466 × 10 38 , maximální konečná kladná hodnota je reprezentovatelná jednoduchou přesností.

Nuly a nekonečna

0000 = 0 00000000 0000000 = 0
8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = infinity
ff80 = 1 11111111 0000000 = −infinity

Zvláštní hodnoty

4049 = 0 10000000 1001001 = 3.140625 ≈ π ( pi )
3eab = 0 01111101 0101011 = 0.333984375 ≈ 1/3

NaNs

ffc1 = x 11111111 1000001 => qNaN
ff81 = x 11111111 0000001 => sNaN

Viz také

Reference