FP64、FP32、FP16、BFLOAT16、TF32和动物园的其他成员

2020-05-17 11:12:09

在深度学习的上下文中,您可以听到许多浮点格式。以下是它们的用途和用途的摘要。

x86实现中通常已知的80位IEEE 754扩展精度二进制浮点格式始于Intel 8087数学协处理器(以前CPU不支持浮点计算,而FPU是单独的协处理器)。在此实现中,它包含:

许多(但不是所有)C/C++实现使用这种80位(10字节)格式实现long Double。

本机受x86 CPU支持。默认情况下,X87处理器在内部都使用80位双扩展精度。

大多数GPU,特别是包括RTX系列在内的游戏GPU,都严重限制了FP64的性能(通常是FP32性能的1/32,而不是1/2,有关更多详细信息,请参阅有关GPU的文章)。

在最近无限支持FP64的GPU中,有特斯拉P100/P40/P4和Quadro GP100中的GP100/102/104,特斯拉V100/Quadro GV100/Titan V中的GV100,以及最近发布的A100中的GA100(有趣的是,新的安培架构具有支持FP64的第三代张量核心,A100张量核心包括新的符合IEEE的FP64处理,提供V100的FP64性能的2.5倍)。

这种格式在很长一段时间内一直是深度学习的主力。另一种IEEE 754格式,单精度浮点格式,具有:

长期以来,神经网络计算的标准类型。长期以来,神经网络中的权重、激活和其他值一直默认用FP32表示。

范围:~5.96E−8(6.10E−5)…。65504,4位有效小数位精度。

DL中有一种趋势是使用FP16而不是FP32,因为较低精度的计算似乎对神经网络并不重要。更高的精确度不会带来任何效果,但速度较慢,会占用更多内存并降低通信速度。

目前不在C/C++标准中(但有一个简短的浮动提议)。某些C/C++系统支持__FP16类型。否则,可以与特定库一起使用。

在较旧的游戏GPU上支持较差(FP32的1/64性能,有关更多详细信息,请参阅有关GPU的帖子)。目前已在现代GPU(例如NVIDIA RTX系列)上获得良好支持。

另一种最初由Google开发的16位格式被称为“脑浮点格式”,简称为“bflat16”。这个名字来源于“谷歌大脑”,这是谷歌的一个人工智能研究小组,这种形式的想法就是在这里构思出来的。

最初的IEEE FP16在设计时没有考虑深度学习应用,其动态范围太窄。BFLOAT16解决了这一问题,提供与FP32相同的动态范围。

bfloat16格式是截短的IEEE754FP32,允许快速转换为IEEE754FP32或从IEEE754FP32快速转换。在转换为bfloat16格式时,指数位被保留,而有效位域可以通过截断来减少。

现在似乎正在取代FP16。与通常需要通过损耗缩放等技术进行特殊处理的FP16不同,BF16在训练和运行深度神经网络时几乎是FP32的临时替代品。

CPU:采用AVX-512 BF16扩展、ARMv8-A的现代英特尔至强x86(库珀湖微体系结构)支持。

GPU:在NVIDIA A100中支持(第一个支持的),将在未来的AMD GPU中支持。

ASIC:在Google TPU v2/v3(不是v1!)中支持,在Intel Nervana NNP(现已取消)中支持。

Flexpoint是由Intel的Nervana开发的一种紧凑数字编码格式,用于表示标准浮点值。后来,Nervana改用BFLOAT,然后,甚至更晚,英特尔取消了Nervana处理器。

Flexpoint通过拆分尾数和指数部分结合了定点和浮点的优点,指数部分在所有算术执行元素之间共享。通过仅传递整数值,降低了内存和带宽要求。此外,这还降低了硬件复杂性,降低了功耗和面积要求。

TF32使用与半精度(FP16)数学相同的10位尾数,显示出对于AI工作负载的精度要求有足够的余量。TF32采用与FP32相同的8位指数,因此可以支持相同的数值范围。因此,TF32具有:

TF32的优点是格式与FP32相同。使用TF32计算内积时,输入操作数的尾数从23位四舍五入到10位。四舍五入的操作数被精确相乘,并在普通FP32中累加。

TF32张量内核对FP32输入进行操作,无需更改代码即可在FP32中产生结果。非矩阵运算继续使用FP32。这为在DL框架和HPC中加速FP32输入/输出数据提供了一条简单的途径。

TF32的最大优势在于,只有在最深层(即CUDA编译器内部)才需要编译器支持。其余代码只看到精度较低的FP32,但动态范围相同。利用TF32在很大程度上是调整库的调用者以指示TF32是否正常的问题。TF32作为一个可以快速插入以利用张量核心速度的东西而存在,而不需要做太多的工作。

FP16和BFLOAT16等格式需要更多工作,因为它们涉及不同的位布局。使用这些格式是值得的,因为它们减少了内存带宽,因此允许更快的执行。(来源)