BF16 是对FP32单精度浮点数截断数据,即用8bit 表示指数,7bit 表示小数。
FP16半精度浮点数,用5bit 表示指数,10bit 表示小数
与32位相比,采用BF16/FP16吞吐量可以翻倍,内存需求可以减半。但是这两者精度上差异不一样,BF16 可表示的整数范围更广泛,但是尾数精度较小;FP16 表示整数范围较小,但是尾数精度较高。
IEEE 浮点运算标准的 2008 年修订版引入了半精度 16 位浮点格式(称为 fp16)作为存储格式。各种制造商都采用了 fp16 进行计算,使用 fp32(单精度)和 fp64(双精度)格式规则的明显扩展。例如,NVIDIA P100和V100 GPU和AMD Radeon Instinct MI25 GPU以及为Fujitsu Post-K 百万兆次级计算机提供动力的A64FX Arm处理器支持fp16。
Bfloat16
Fp16 在科学计算中具有有限范围的缺点,其最大正数为 6.55 times 10^4。这导致了另一种 16 位格式的开发,该格式以精度换取范围。bfloat16格式被谷歌在其张量处理单元中使用。英特尔计划在其即将推出的 Nervana 神经网络处理器中支持 bfloat16,最近(2018 年 11 月)发布了一份白皮书,对该格式进行了精确定义。
此表显示了 bfloat16、fp16 和 fp32 的指数和有效位数的位分配,其中归一化数的隐式前导位计入有效数。
Bfloat16 的有效位数比 fp16 少三个位,但指数多三个位。它具有与 fp32 相同的指数大小。因此,从 fp32 转换为 bfloat16 很容易:指数保持不变,有效数从 24 位四舍五入或截断为 8;因此,在转换中不可能溢出和下溢。
另一方面,当我们从 fp32 转换为更窄的 fp16 格式时,溢出和下溢很容易发生,因此需要在转换前开发重新缩放的技术——请参阅我和 Sri Pranesh 最近的 EPrint 将矩阵压缩为半精度,以及求解线性系统的应用。
bfloat16 的缺点是精度较低:基本上是 3 位有效的十进制数字,而 fp16 的精度为 4。下表显示了三种格式的单位舍入 u、最小正(次正规)数 xmin、最小规范化正数 xmin 和最大有限数 xmax。
Harmonic Series
比较这些不同精度的一个有趣方法是求和调波级数 1 + 1/2 + 1/3 + cdots。序列发散,但是当在浮点运算中以自然顺序求和时,它会收敛,因为部分和增长而加法减少,最终加法足够小,以至于它不会改变部分和。下表显示了不同精度的谐波级数的计算总和,以及在总和变为常数之前添加的项数。