人工智能有数字系统
扫描二维码
随时随地手机看文章
BF16是为深度学习而优化的新数字格式,它保证了计算能力和计算量的节省,而预测精度的降低幅度最小
BF16,有时也被称为BFloat16或Brain Float16,是一种针对人工智能/深度学习应用程序进行优化的新数字格式。它在谷歌Brain上获得了广泛的应用,包括谷歌、英特尔、Arm和许多其他公司的人工智能加速器。
BF16背后的想法是通过降低数字的精度来减少计算能力和将张量相乘所需的能源消耗。张量是一个三维的数字矩阵;张量的乘法是计算人工智能所需的关键数学运算。
现在大多数人工智能训练都使用FP32, 32位浮点数。虽然这意味着计算非常准确,但它需要强大的硬件和大量的电力。推理通常使用INT8, 8位整数(整数)。虽然使用诸如INT8这样的较低精度的数字系统可以在相同的硬件上提供更高的吞吐量,从而节省电力,但是计算(预测)的结果却不那么准确。
BF16的目的是优化精度和预测精度之间的权衡,以增加吞吐量。
解剖FP
计算中的二进制数表示为:
底数是2,尾数是x的基指数,
在FP32中,每个数字都表示为:
1位表示符号(+或-),后跟8位的指数,在后面是23位的尾数(总共32位)。
对于BF16,谷歌Brain提出通过将FP32的尾数截断为7位来降低精度。
因此,BF16数字表示为:
1个符号位+ 8个指数位+7个尾数位(总共16位)。
这些16位数字提供了谷歌所追求的高吞吐量需求,同时保留了FP32的近似动态范围(该系统可以表示的数字的整个范围),因为指数是相同的大小。
使用BF16算法的预测精度与FP32相似,但不如FP32精确(谷歌曾说过,这是因为神经网络对指数的大小比尾数敏感得多)。对于大多数应用程序,这种折衷还是被认为可以接受。
为什么不用FP16?
现有的FP16格式(在移动图形应用程序中很流行)也是16位浮点数格式。为什么不用它呢?
FP16包括:
1个符号位,5个指数位,10个尾数位(共16位)。
使用这种格式,指数比FP32小,因此动态范围大大缩小。此外,将FP32数字转换成FP16比转换成BF16要困难得多——这比直接截断尾数要多得多,而尾数截断是一个相对简单的操作。
另一个重点是计算所需的硅物理面积。由于硬件乘法器的物理大小随尾数宽度的平方而增加,因此从FP32切换到BF16可以显著节省硅面积(这足以说服谷歌在其张量处理单元(TPU)芯片中使用BF16)。BF16乘法器比FP32乘法器小8倍,但仍然是FP16的一半。