全新的数字格式——‘BF16’,专为人工智能 (AI)/ 深度学习(DL) 应用优化发展而来,有时也称为‘BFloat16’或‘Brain Float 16’。它一开始是由 Google Brain 团队发明,并用于其第三代 Tensor Processing Unit (TPU),如今已被 Google、英特尔(Intel)、Arm 等许多公司的 AI 加速器广泛采用。
采用 16 位脑浮点 (brain floating point) 格式的 BF16,主要概念在于透过降低数字的精度,从而减少让张量 (tensor) 相乘所需的运算资源和功耗。「张量」是数字的三维 (3D) 矩阵;张量的乘法运算即是 AI 计算所需的关键数学运算。
如今,大多数的 AI 训练都使用 FP32,即 32 位浮点数。尽管这表示可以达到非常准确的计算,但需要强大的硬件而且极其耗电。推论一般使用 INT8¬¬,即 8 位整数精度的运算模式,虽然是较低精度的数字系统,但在相同硬件上提供了更高的传输效率,因而能够更省电,只是计算结果 (预测) 的准确性较低些。
BF16 的基本概念是为精度和预测准确性之间的权衡进行优化,从而提高吞吐量。
浮点数字解析
在运算中的二进制数字可以表示为:
尾数 x 基数指数,基数为 2
在 FP32 浮点格式中,每个数字都表示为:
1 位代表符号 (+ 或 -),其后为 8 位指数,接着是 23 位尾数 (总共 32 位数字)
至于 BF16 浮点格式,Google Brain 团队建议将 FP32 数字的尾数缩减到 7 位,以稍降低精度。
因此,BF16 数字则可表示为:
1 个符号位,然后 8 个指数位,接着是 7 个尾数位 (共 16 位数)
浮点数字格式(来源:Google)
由于指数大小相同,这些 16 位数字提供了 Google 所追求的更高吞吐量,同时又能保留 FP32 的近似动态范围 (该系统可以代表整个数字范围)。
使用 BF16 的算法预测准确度相当于 FP32——Google 解释这是因为神经网络对于指数的大小要比尾数更敏感)。对于大多数应用来说,这已经是可以被接受的折衷方案了。
为什么不使用 FP16?
目前普遍用于行动绘图应用中的 FP16,同样也是 16 位浮点数字格式。那么,为什么不直接使用呢?
FP16 包括:
1 个符号位,5 个指数位,然后 10 个尾数位 (共 16 位数字)
使用这种格式时,由于指数小于 FP32,因而动态范围大幅缩减。此外,将 FP32 数字转换为 FP16 比起转换为 BF16 更困难——相较于仅截去尾数,FP16 更麻烦,而 BF16 的操作相对上较简单。
另一个要点是计算所需要的芯片实体面积。由于硬件乘法器的实体尺寸会随着尾数宽度的平方而增加,因此从 FP32 转换到 BF16 可以大幅节省芯片面积——这也就是 Google 之所以为其 TPU 芯片选择使用 BF16。BF16 乘法器比 FP32 乘法器的尺寸更小 8 倍,而且也只有 FP16 同类型芯片约一半的尺寸。
还有哪些 DL 运算格式?
BF16 并不是唯一一种被提议用于深度学习的新数字格式。例如,AI 软件新创公司 Nervana 在 2017 年曾经提出一种称为‘Flexpoint’的格式。其概念是透过结合定点和浮点数字系统的优点,从而减少运算和内存的需求。
定点数 (fixed point number) 使用固定位数来代表整数和分数(小数点后的部分)——相较于上述的浮点格式,使用定点数字执行运算通常更简单,也更快捷。然而,针对特定的位数,定点数的动态范围比浮点数更小得多。
Flexpoint 数字共享相同的指数,让张量更易于相乘(来源:Nervana/NeurIPS)
Flexpoint 张量中的所有 (浮点) 数字都使用相同的指数(不只是相同的指数大小,而且是完全相同的指数值)。张量中的所有数字之间共享指数,从而可以在整个张量中共同分担指数的通讯。
然后就可以让张量相乘作为定点运算,因为每次计算的指数都是相同的——这比起浮点数所需的数学更简单。这些计算足以代表绝大多数的深度学习数学,因此所能节省的资源与功耗都相当可观。然而,管理这些指数极其复杂,而且动态范围 (可以表示的数字范围) 很低,因为所有的数字都拥有相同的指数。
然而,Flexpoint 却从未能起飞,甚至是 Nervana 在卖给英特尔之前,其自家芯片都一直使用 BF16。
(原文发表于 ASPENCORE 旗下 EDN 姐妹媒体 EETimes,参考链接:Artificial Intelligence Gets Its Own System of Numbers,编译:Susan Hong)
https://www.ednchina.com/news/202003061453.html