Brain Floating 16
Bfloat16是由Google Brain开发的数据格式 [1]。如今在很多AI处理中得到应用,比如Nervana NNP-L1000,Xeon processors (AVX-512 BF16 extensions) 以及Intel FPGAs,Google Cloud TPUs,[9][10]和TensorFlow。ARMv8.6-A,AMD ROCm和CUDA也同样支持bfloat16数据精度。在训练时,可以使用混合加速,即使用FP16/BF16做乘法以及存储,使用FP32做加法。
引入BF16的原因 [2]
- 提高了16bit数值的dynamic range(5->8)
- 硬件乘法器的面积(晶体管数量)大致与mentissa数据宽度的平方成正比,因此,mentisa由10降低为7之后,乘法器的面积减少约50%
以下复习一下FP16/32并于BF16作比较。
type | sign bit | exponent bit | fraction/mentissa bit |
---|---|---|---|
FP16 | 1 | 5 | 10 |
FP32 | 1 | 8 | 23 |
BF16 | 1 | 8 | 7 |
FP16的计算方法
v
a
l
u
e
F
P
16
=
(
−
1
)
s
i
g
n
×
2
(
e
x
p
o
n
e
n
t
−
15
)
×
(
1
+
f
r
a
c
t
i
o
n
1024
)
value_{FP16} = (-1)^{sign}\times 2^{(exponent-15)}\times (1+\frac{fraction}{1024})
valueFP16=(−1)sign×2(exponent−15)×(1+1024fraction)
BF16的计算方法
v
a
l
u
e
B
F
16
=
(
−
1
)
s
i
g
n
×
2
(
e
x
p
o
n
e
n
t
−
127
)
×
(
1
+
f
r
a
c
t
i
o
n
128
)
value_{BF16} = (-1)^{sign}\times 2^{(exponent-127)}\times (1+\frac{fraction}{128})
valueBF16=(−1)sign×2(exponent−127)×(1+128fraction)
两个特例
- 当exponent全为0时,BF16浮点数值得计算方法改为
v a l u e = ( − 1 ) s i g n × 2 ( e x p o n e n t − 126 ) × ( 0 + f r a c t i o n 128 ) value = (-1)^{sign}\times 2^{(exponent-126)}\times (0+\frac{fraction}{128}) value=(−1)sign×2(exponent−126)×(0+128fraction) - 当exponent全为1时,
(a) 当fraction全为0时,BF16表示+inf或者-inf
(b) 当fraction不全为0时,表示NaN
Denormalized Number
此处还有一个normal number和subnormal (denormalized) number的概念。引入denormalized数的原因:
- 是用来表示数值0,因为normal数的表示方式里是用1+fraction部分,这样就无法表达0,因此在exponent全部为0的特例中,使用了0+fraction的方式。但是这种情况会产生+0和-0两种数值0的表达方式
- 另一个功能是表示非常接近于0的数,可能的数值分布均匀的接近0.0
denormalized数的精确度要比normalized数更高。因此,可以避免非常小的数值被认为是0的情况发生。但是从硬件角度出发,denormalized需要额外的硬件支持(或者软件支持)。因为处理denormalized数的效率比较低。
其他
Facebook对于深度学习的数值表示精度也有一篇文章《Rethinking floating point for deep learning》。感兴趣的读者可以去了解一下。
参考文献
[1] Abadi, Martín; Barham, Paul; Chen, Jianmin; Chen, Zhifeng; Davis, Andy; Dean, Jeffrey; Devin, Matthieu; Ghemawat, Sanjay; Irving, Geoffrey; Isard, Michael; Kudlur, Manjunath; Levenberg, Josh; Monga, Rajat; Moore, Sherry; Murray, Derek G.; Steiner, Benoit; Tucker, Paul; Vasudevan, Vijay; Warden, Pete; Wicke, Martin; Yu, Yuan; Zheng, Xiaoqiang (2016). “TensorFlow: A System for Large-Scale Machine Learning” (PDF). arXiv:1605.08695.
[2] BFloat16: The secret to high performance on Cloud TPUs
[3] 你应该知道的浮点数基础知识