文章标题:用于深度学习的FP8格式
作者/机构
- Paulius Micikevicius, Dusan Stosic, Patrick Judd, John Kamalu, Stuart Oberman, Mohammad Shoeybi, Michael Siu, Hao Wu (NVIDIA)
- Neil Burgess, Sangwon Ha, Richard Grisenthwaite (Arm)
- Naveen Mellempudi, Marius Cornea, Alexander Heinecke, Pradeep Dubey (Intel)


A1 主要贡献

本文针对深度学习训练和推理加速的需求,提出了一种8位浮点数(FP8)的二进制交换格式。随着深度学习模型规模和训练所需计算资源的持续增长,例如GPT-3、Turing-Megatron等大型语言模型需要在数千个处理器上训练数周,低精度数值表示已成为加速的关键。FP8被视为从现有的16位浮点格式(如FP16、bfloat16)自然演进的下一步。

核心问题与研究目标
现有的16位浮点格式在加速深度学习训练和推理方面已广泛应用,但为了进一步降低计算和内存带宽需求,需要探索更低位宽的格式。虽然INT8定点格式在推理中很流行,但有时难以维持必要的模型精度,且需要额外的量化校准或量化感知训练。本文旨在设计一种8位浮点格式,使其能够在不改变模型或优化器超参数的情况下,匹配16位格式训练所达到的模型质量,并简化8位推理的部署流程。

主要创新点与贡献
1. 提出双编码FP8格式:本文提出了一种包含两种编码的8位浮点(FP8)二进制交换格式:
* E4M3:4位指数,3位尾数。
* E5M2:5位指数,2位尾数。
2. 格式设计与权衡
* E5M2遵循IEEE 754标准关于特殊值(无穷大、NaN)的表示约定。
* E4M3通过不表示无穷大并将NaN的编码减少到一种,扩展了其动态范围,使其更适用于权重和激活值的表示。
3. 广泛的实证验证
* 在多种图像(CNNs、Transformers)和语言(RNNs、Transformers)任务上验证了FP8格式的有效性,证明FP8训练能够匹配16位训练的结果质量,且无需修改任何超参数。
* 实验覆盖了从标准尺寸到高达1750亿参数的大型语言模型,证明了该格式在不同规模模型上的普适性。
4. FP8在推理中的优势
* 研究了FP8在后训练量化(Post-Training Quantization, PTQ)中的应用,表明对于一些难以用INT8量化的16位预训练语言模型,FP8能够更好地保持模型精度。


A3 背景知识/关键Observation/设计原则

FP8在深度学习中的使用考量
FP8的某些使用方式影响了其二进制交换格式的选择。例如,不同网络所需的动态范围决定了需要两种格式,并且倾向于在软件中处理缩放因子而非通过指数偏差(exponent bias)。其他方面,如类型转换的具体细节,则与二进制格式本身是正交的。

FP8运算与精度
对FP8输入的数学运算预计会产生更高精度的输出,并可选择在将结果写回内存前将其转换回FP8。这在当今CPU、GPU和TPU上对16位浮点格式(FP16和bfloat16)来说是常见做法【索引3, Bfloat16 processing for neural networks, 2017, 26th IEEE Symposium on Computer Arithmetic, ARITH 2019】【索引14, Mixed precision training, 2017, arxiv】。例如,矩阵乘法或点积指令会产生单精度输出,而算术密集度较低的操作通常在将16位输入转换为单精度后执行。因此,FP8张量是通过从更宽的类型(如单精度浮点数)转换而生成的。

缩放因子的应用
高精度值在转换为FP8之前需要乘以一个缩放因子,以便将它们移动到一个能与相应FP8格式的可表示范围更好地重叠的区间。这与损失缩放(loss-scaling)在FP16混合精度训练中的目非常相似,即将梯度移动到FP16可表示的范围内【索引14, Mixed precision training, 2017, arxiv】【索引13, Mixed precision training: theory and practice, 2018, https://on-demand.gputechconf.com/gtc/2018/presentation/ s8923-training-neural-networks-with-mixed-precision-theory-and-practice.pdf】。然而,由于FP8的动态范围不足以覆盖所有张量重要值的并集,一些网络需要逐张量(per-tensor)的缩放因子(详见3.2节)。选择缩放因子的启发式方法细节超出了本文范围,但基本思想是选择一个缩放因子,使得张量中的最大绝对值接近相应格式所能表示的最大绝对值。溢出的值会被饱和(saturate)到可表示的最大值。在FP16自动混合精度训练中使用的溢出时跳过权重更新(并减小缩放因子)的方法【索引13, Mixed precision training: theory and practice, 2018, https://on-demand.gputechconf.com/gtc/2018/presentation/ s8923-training-neural-networks-with-mixed-precision-theory-and-practice.pdf】对于FP8来说不是一个好选择,因为其动态范围更窄,溢出可能性大得多,会导致过多的更新被跳过。高精度的值通过乘以缩放因子的倒数来进行反向缩放(unscaled),这可以在从FP8转换后进行,也可以在线性运算的算术指令产生更高精度输出后进行。两种情况下都只需要极少的额外算术开销。对于矩阵乘法,反向缩放对每个点积应用一次,因此被许多使用FP8输入的乘加操作分摊。算术密集度较低的操作(如非线性、归一化或优化器的权重更新)通常受内存带宽限制,对每个值增加一个额外的算术指令不敏感。

类型转换机制
虽然类型转换的机制与二进制格式是正交的,但为了完整性,本文简要介绍一些深度学习使用中的方面。将一个特殊值从更宽的精度转换为FP8,会得到FP8中相应的特殊值。对于转换为E4M3,这意味着更宽类型(例如单精度)中的无穷大(infinities)和NaNs都会变成FP8中的NaN。当使用涉及FP8和FP16类型的混合精度训练时,这种对特殊值的处理是必要的,因为自动混合精度【索引13, Mixed precision training: theory and practice, 2018, https://on-demand.gputechconf.com/gtc/2018/presentation/ s8923-training-neural-networks-with-mixed-precision-theory-and-practice.pdf】运行时调整损失缩放依赖于引发和检测溢出。此外,可以提供非饱和转换模式,用于可能需要严格处理溢出的用例。舍入模式(例如,四舍六入五成双、随机舍入等)的选择与交换格式正交,留给软件和可能的硬件实现,以获得最大的灵活性。


A2 方法细节

FP8 二进制交换格式
FP8包含两种编码——E4M3和E5M2,其名称明确指出了指数(E)和尾数(M)的位数。本文使用通用术语“尾数”(mantissa)作为IEEE 754标准中尾数有效数域(trailing significand field)的同义词(即不包括正规浮点数隐含的前导1位的比特)。FP8编码的推荐用法是:E4M3用于权重和激活张量,E5M2用于梯度张量。虽然有些网络仅使用E4M3或E5M2类型就能训练,但也有网络需要同时使用这两种类型(或者必须将更少的张量保存在FP8中)。这与【索引20, Hybrid 8-bit floating point (hfp8) training and inference for deep neural networks, 2019, Advances in Neural Information Processing Systems】【索引16, 8-bit numerical formats for deep neural networks, 2022, arXiv preprint arXiv:2206.02915】的研究发现一致,即推理和训练的前向传播使用E4M3的变体,而训练的反向传播中的梯度使用E5M2的变体。

FP8 编码细节
FP8编码的详细信息在表1中指定。本文使用S.E.M表示法来描述表中的二进制编码,其中S是符号位,E是指数域(包含偏置指数的4位或5位),M是3位或2位的尾数。下标为2的值是二进制,否则是十进制。

Table 1: FP8二进制格式细节

FP8 格式设计原则
这些FP8格式的设计遵循了与IEEE-754惯例保持一致的原则,仅在预期对深度学习应用精度有显著益处时才偏离。因此,E5M2格式遵循IEEE 754关于指数和特殊值的惯例,可以看作是尾数位数更少的IEEE半精度(类似于bfloat16和TF32可以看作是位数更少的IEEE单精度)。这使得E5M2和IEEE FP16格式之间的转换非常直接。相比之下,E4M3的动态范围通过回收大部分用于特殊值的位模式来扩展,因为在这种情况下,获得的更大范围远比支持特殊值的多种编码有用得多。

3.1 特殊值表示

E4M3 对特殊值的处理
我们通过减少表示的特殊值数量来扩展E4M3格式狭窄的动态范围,将其位模式用于表示正规值。无穷大不被表示(溢出处理细节见第2节),并且我们只为NaNs保留一种尾数位模式。这一修改将动态范围扩展了一个额外的2的幂次,从17个binade增加到18个。我们获得了七个额外量值(256, 288, 320, 352, 384, 416, 448)的表示,对应于偏置指数值$1111_2$。若无此修改,最大可表示的量值为240。为了与IEEE 754惯例保持一致,我们保留了零和NaN的正负表示。虽然通过只为零和NaN各保留一种编码可以获得一个额外的可表示量值480,但这需要打破IEEE 754格式中固有的正负表示对称性,从而使依赖此属性的算法实现复杂化或失效。例如,IEEE浮点格式允许使用整数运算对浮点值进行比较和排序。对于深度学习而言,将最大值从448增加到480的好处并不足以证明偏离IEEE惯例并失去依赖于它的软件实现是值得的。

E5M2 对特殊值的处理
如前所述,E5M2以与IEEE惯例一致的方式表示所有特殊值(无穷大、NaNs和零)。我们广泛的实证研究(第4节)表明,5位指数为深度学习提供了足够的每张量动态范围(32个binade,包括次正规值)。此外,对于E5M2来说,减少特殊值表示的好处远小于E4M3——由于尾数更小,只会增加3个额外的量值,当E5M2已经提供32个binade时,增加一个binade的影响远没有E4M3(在调整前为17个)那么大。

3.2 指数偏差

指数偏差与缩放因子
E4M3和E5M2都保留了类似IEEE的指数偏差:分别为7和15。指数偏差控制了可表示范围在实数轴上的位置。为每个张量维护一个缩放因子可以达到同样的效果。我们的实验表明,有些神经网络不能对给定类型的所有张量使用相同的指数偏差,需要进行逐张量的调整。第4.3节讨论了这样一个例子。因此,我们选择不偏离IEEE关于指数偏差的惯例。将逐张量的缩放留给软件实现,比可编程指数偏差方法提供了更大的灵活性——缩放因子可以取任何实数值(通常用更高精度表示),而可编程偏差仅相当于允许使用2的幂次作为缩放因子。


A4 实验环境

  • 实验方法
    • 所有FP8训练实验均通过模拟完成。张量值被裁剪(clipped)到FP8可表示的范围内(包括应用缩放因子和饱和操作)。
    • 例如,在全连接层的矩阵乘法之前,输入的激活值和权重张量都会被转换为FP8,然后再转换回更宽的表示(FP16或bfloat16)。
    • 算术运算本身使用更宽的表示(FP16或bfloat16)进行,原因有二:一是本文重点是交换格式而非特定硬件实现;二是硬件不支持的算术模拟对于训练大型模型来说速度过慢。
  • 数据集
    • 图像分类:ImageNet ILSVRC12。
    • 语言翻译:WMT 2016 English->German。
    • 语言建模:Wikipedia数据集,以及一个包含The Pile【索引6, The Pile: An 800gb dataset of diverse text for language modeling, 2020, arXiv preprint arXiv:2101.00027】、Common Crawl及其衍生数据集的变体(与【索引18, Using deepspeed and megatron to train megatron-turing NLG 530b, A large-scale generative language model, 2022, arXiv】中描述的相同)。
  • 模型架构
    • 图像分类:ResNet-50, EfficientNet-B0, Swin-T, DeiT (Transformer-based), MobileNet v2。
    • 语言翻译:Transformer, GNMT (LSTM-based)。
    • 语言建模:Transformer-based模型, GPT系列模型(参数量从1.26亿到1750亿)。
  • 硬件配置
    • 论文未明确提供具体的硬件配置信息。但考虑到训练模型的规模(如1750亿参数的GPT模型),可以推断实验是在大规模GPU集群上进行的。
  • 软件配置
    • 论文未明确说明使用的深度学习框架或软件库。实验采用与FP16或bfloat16基线训练完全相同的模型架构、权重初始化和优化器超参数。

A5 实验结果

实验的核心结论是,使用本文提出的FP8格式进行训练,可以在不修改任何超参数的情况下,达到与16位浮点数(FP16或bfloat16)训练相当的模型精度。

FP8训练实验

在训练实验中,主要对计算密集型操作(卷积和矩阵乘法,统称GEMM)的输入张量(激活、权重、激活梯度)进行FP8量化。

  1. 图像分类(ILSVRC12)

    • 实验内容:在ImageNet数据集上训练了多种CNN和Transformer模型(ResNet-50, EfficientNet-B0, Swin-T, DeiT, MobileNet v2)。与以往研究不同,本次实验将所有GEMM操作的输入都量化为FP8,包括第一层卷积和最后一层全连接层。
    • 实验结果:如表2所示,除MobileNet v2外,所有模型的FP8训练Top-1准确率都在16位基线训练的随机波动范围内。MobileNet v2的精度损失仍在研究中。
    • 结论:FP8训练在主流图像分类模型上能有效匹配16位训练的精度。

    Table 2: 图像分类模型,ILSVRC12验证集Top-1准确率

  2. 语言翻译(WMT 2016 En->De)

    • 实验内容:在WMT 2016英德翻译任务上训练了Transformer和基于LSTM的GNMT模型。
    • 实验结果:如表3所示,FP8训练得到的模型在newstest2014测试集上的BLEU分数与16位基线训练结果在随机波动范围内一致。
    • 结论:FP8训练适用于基于Transformer和RNN的翻译模型。

    Table 3: 语言翻译模型,英->德,BLEU分数

  3. 语言建模

    • 实验内容:在Wikipedia和The Pile变体数据集上训练了多种规模的Transformer和GPT模型,最大规模达到1750亿参数。
    • 实验结果:如表4和图1所示,FP8训练的最终困惑度(Perplexity)与16位基线训练结果在随机波动范围内一致。对于1750亿参数模型,在训练进行到75%时,FP8的困惑度与bfloat16基线持平,并且其训练损失曲线表现出成功的收敛趋势。
    • 结论:FP8训练能够成功扩展到超大规模语言模型,并匹配16位训练的性能。

    Table 4: NLP模型,困惑度


    Figure 1: 不同GPT-3模型的训练损失(困惑度)曲线。x轴是归一化的迭代次数。

FP8推理实验(后训练量化)

FP8训练简化了8位推理的部署,因为它避免了INT8推理所需的后训练量化(PTQ)校准或量化感知训练(QAT)。实验还评估了将16位训练的模型直接进行FP8 PTQ的效果。

  1. 与INT8 PTQ对比

    • 实验内容:将在FP16中训练的BERT和GPT模型分别量化到INT8和E4M3格式进行推理。
    • 实验结果:如表5所示,对于BERT在SQuAD数据集上的F1分数,FP8 PTQ能保持精度,而INT8 PTQ导致精度显著下降。对于GPT模型在wikitext103上的困惑度,FP8 PTQ的表现远优于INT8 PTQ。
    • 结论:FP8在后训练量化方面比INT8更有优势,尤其对于一些对量化敏感的模型。

    Table 5: 16位浮点训练模型的后训练量化。F1指标越高越好,困惑度越低越好。最佳8位结果已加粗。

逐张量缩放因子的必要性

  1. 实验内容:使用一个13亿参数的GPT-3模型进行推理实验,评估全局缩放(等同于固定指数偏差)与逐张量缩放的效果。
  2. 实验结果:如图2所示:
    • 当只量化GEMM操作的输入时,使用一个全局的指数偏差(在[7, 10]范围内)可以达到与bfloat16基线相当的困惑度。
    • 但如果同时量化残差连接(Add操作的输入),没有任何一个单一的全局指数偏差能维持足够的精度,困惑度从10.19恶化到12.59。
    • 然而,如果采用逐张量/逐通道的缩放因子(类似于INT8量化),无论是只量化GEMM输入还是同时量化残差连接,都能将困惑度恢复到接近基线的水平(10.29和10.44)。
  3. 结论:逐张量缩放因子对于在FP8中维持模型精度至关重要,尤其是在希望将更多张量(而不仅仅是GEMM输入)量化到FP8时。


    Figure 2: 13亿参数GPT3模型在bfloat16训练后,其权重和激活输入张量被转换为具有不同指数偏差的E4M3格式时的困惑度,无逐张量缩放。


A6 结论

本文提出了一种FP8二进制交换格式,包含E4M3和E5M2两种编码。该格式的设计原则是最小化地偏离IEEE-754惯例,以确保软件实现可以继续依赖IEEE浮点数的特性(如使用整数运算进行比较和排序)。提出此格式的主要动机是通过启用更小、更节能的数学计算流水线以及减少内存带宽压力,来加速深度学习的训练和推理。

本文通过实验证明,对于图像和语言任务中的各种神经网络模型,使用FP8进行训练可以在不改变模型、优化器和训练超参数的情况下,达到与16位训练相当的模型精度。使用FP8不仅能加速训练并减少所需资源,还通过在训练和推理中使用相同的数据类型,简化了8位推理的部署。在FP8出现之前,8位推理通常需要对浮点训练的模型进行INT8的校准或微调,这增加了部署的复杂性,并且在某些情况下无法维持模型精度。