您的位置首页>业界>

ARM将BF16深度学习数据格式带到ARMv8-A

导读 ARM将在其Project Trillium ML平台下的ARMv8-A体系结构的下一版本中添加对BFloat16的支持。它标志着年轻数据格式被广泛采用的一个新的重

ARM将在其Project Trillium ML平台下的ARMv8-A体系结构的下一版本中添加对BFloat16的支持。它标志着年轻数据格式被广泛采用的一个新的重要里程碑,该格式正席卷深度学习社区。在本文中,我们将深入探讨该格式的起源和好处。

数字格式

这看起来似乎很明显,但是如果您想从头开始构建计算机芯片,将会遇到的基本问题之一是:如何表示数字?对于整数,解决方案非常简单:使用与十进制数字等效的二进制数。(我们将忽略负数,为之设计了稍微复杂一些的方案以简化硬件中的计算。)但是,有理数,不用担心非理性数,需要多加注意。

解决方法是在计算机科学中使用(二进制)科学表示形式,即浮点数。用科学计数法将数字表示为有理数-称为尾数-,然后将此尾数乘以底数,得到指数。需要注意的是,尾数在该点之前仅包含一个数字,因此二进制科学计数法中的第一个数字始终为1,因此实际上它不是由计算机存储的。一个例子是1.11 * 21111。其值为1.75 * 215或57,344。尾数的计算结果为1.75,因为该点后的第一个数字表示值0.5,第二个数字表示0.25,依此类推。因此二进制1.101等于十进制的1.625。

总之,这样的数字包含三部分信息:其符号,其尾数(其尾数可以为正或负)和指数。为简单起见,IEEE已为计算机标准化了这些浮点数格式中的几种,其中最常使用的是binary32(或FP32)和binary64(或FP64)。数字是指用于表示数字的位数总数,其中大多数数字分配给了尾数,因为这提供了更高的精度。它们也称为单精度(SP)和双精度(DP)。如前所述,尾数的第一位不包含在格式中,因为它始终为1。

当谈到芯片的性能时,用的说法是每秒浮点运算或FLOPS。这通常指的是单精度。在高性能计算(HPC)中,例如经典的TOP500列表中,关注的数字是双精度性能。但是,对于移动图形,尤其是在最近的深度学习中,半精度(FP16)也已成为时尚。英伟达很早就意识到了这一趋势(当时可能受到其移动技术的支持),并于2014年在Maxwell中引入了半精度支持,其吞吐量是FP32的两倍(FLOPS)。由于它是较小的数字格式,因此精度和范围都降低了,但是对于深度神经网络而言,事实证明这是实现更高性能的可行折衷。

BFloat16

当然,原则上可以自由选择在尾数和指数之间如何分割位。指数使用更多的比特意味着可以表示的数字的动态范围更大或更小,而尾数使用的更多比特将提高表示的准确性。后者通常是优选的。例如,要尽可能使用浮点表示法近似pi,则需要将大多数位用于尾数。

这就是为什么要使用IEEE标准来标准化尾数和指数位之间的这种划分(以及用于在硬件之间一致地处理舍入,上溢和下溢之类的异常)的原因。尽管SP的位数增加了一倍(多了16位),但只将其中的三个赋予了指数,尽管这确实使最大值从〜65,000大大增加到〜1038。从FP16到FP32的机器精度提高了约10,000倍。下图显示了单精度和半精度格式,以及新的bfloat16格式。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。