查阅了大量资料,都是将脑浮点数或者半精度浮点数和单精度、双精度进行对比,却没有发现将bf16和f16进行对比的资料。因此对二者进行网络资料的归纳总结。
1.半精度浮点fp16
Half-precision floating-point format
1.1定义
我们已经学过两种浮点数,双精度double,64位和单精度float,32位。
所谓的半精度浮点数则为16位,使用2个字节来进行存储。半精度浮点数是一种计算机使用的二进制浮点数数据类型。在IEEE 754-2008中,它被称作binary16。这种类型只适合用来存储那些对精度要求不高的数字,而不适合用来计算。
一个fp16数据占据两个字节,其中1位符号位,5位指数位,10位有效精度。
1.2特点
1.2.1优点
“The advantage over 8-bit or 16-bit binary integers is that the
increased dynamic range allows for more detail to be preserved in
highlights and shadows for images. The advantage over 32-bit
single-precision binary formats is that it requires half the storage
and bandwidth (at the expense of precision and range).”
(来源:wiki)
查阅wiki,和CSDN的结果,发现半精度的优点都指向同一个——动态范围高,使高对比度图片中更多细节得以保留。
具体到使用来说:双精度和单精度是为了计算,而半精度更多是为了降低数据传输和存储成本。因此,单精度浮点数相比,它能节省一半的储存空间和带宽。
很多应用场景对于精度的要求并没有那么高。在分布式深度学习中,模型可能会有成千上万个参数,体积很大,如果能把所有常量值都用16位浮点数而不是32位浮点数来存储,那么模型大小就能压缩至一半,还是相当可观的。
1.2.2缺点
体积压缩了,会损失部分精确度。表示的有效位数,要比单精度和双精度小得多。但是实际证明,降低浮点数精度,当然会带来精确度的损失,但是这样的损失小到可以忽略不计。
1.2.3应用
CUDA7.5开始,支持16位浮点数的存储和计算,添加了half和half2两种数据类型,并内置了用来操作它们的函数。16位“半精度”浮点类型在应用程序中很有用,这些应用程序可以处理更大的数据集,也可以通过存储和操作更低精度的数据来获得性能。例如对一些规模比较大的神经网络模型来说,它们可能会受限于有限的GPU存储;一些信号处理内核(signal processing kernels 如FFTs)受限于存储的带宽。
许多应用都会得益于使用半精度来储存数据,然后用32位的单精度来处理这些数据。Pascal架构的GPU将会全面支持这