2021: 8-BIT OPTIMIZERS VIA BLOCK-WISE QUANTIZATION---通过块级量化的8位优化器---待续!!!
- Abstract
- 1 BACKGROUND
- 2 8-BIT OPTIMIZERS(8bit优化器)
- 3 8-BIT VS 32-BIT OPTIMIZER PERFORMANCE FOR COMMON BENCHMARKS(8位和32位优化器的性能)
- 4 ANALYSIS
- 5 RELATED WORK(相关工作)
- 6 DISCUSSION & LIMITATIONS
- 7 BROADER IMPACT(更广泛的影响)
- ==MSF Finally==
Abstract
(Stateful optimizers)有状态优化器随着时间的推移保持梯度统计,例如,过去梯度值的指数平滑和(动量SGD)或平方和(Adam)。// 与普通随机梯度下降相比,这种状态可用于加速优化,但使用的内存可能会分配给模型参数,从而限制了在实践中训练的模型的最大大小。// 在本文中,我们开发了第一个使用8位统计信息的优化器,同时保持使用32位优化器状态的性能水平。为了克服由此产生的计算、量化和稳定性方面的挑战,我们开发了块级动态量化。// 分块量化将输入张量分成独立量化的小块。每个块在核之间并行处理,产生更快的优化和高精度量化。为了保持稳定性和性能,我们将块级量化与两个额外的变化相结合:
(1)动态量化是一种非线性优化的形式,对大大小值都很精确,
(2)是一种稳定的嵌入层,以减少来自语言模型中输入标记高度不均匀分布的梯度方差。因此,我们的8位优化器保持32位性能的一小部分的内存占用的一系列任务,包括1.5b参数语言建模,灰色微调,ImageNet分类,WMT‘14机器翻译,MoCov2对比图像网预训练+微调,和RoBERTa预训练,没有改变原始优化器超参数。我们将8位优化器开源,作为替换,只需要修改两行代码。
对于给定的资源,增加模型大小是获得更好性能的有效方法(Kaplan等人,2020;Henighan等,2020;rafel等人,2019;Lewis等人,2021年)。然而,训练这样大的模型需要存储模型、梯度和优化器的状态(例如,为Adam的先前梯度的指数平滑和平方和),所有这些都在固定的可用内存中。尽管有大量研究聚焦于通过减少或有效分配模型参数所需的内存来实现更大规模的模型训练(Shoeybi等人,2019;Lepikhin等,2020;Fedus等人,2021年;Brown等人,2020年;Rajbhandari等人,2020),减少优化器梯度统计的内存占用很少被研究。这是一个重大的机会,因为这些优化器状态在训练期间使用了总内存占用的33-75%。例如,Adam优化器表示,最大的GPT-2 (Radford等人,2019年)和T5 (Raffel等人,2019年)模型的大小分别为11 GB和41 GB。在本文中,我们开发了一种快速、高精度的非线性量化方法——按块动态量化——它使稳定的8位优化器(如Adam、AdamW和Momentum)能够在一小部分内存占用下保持32位性能,并且对原始超参数没有任何改变。
虽然目前的大多数工作使用32位优化状态,但最近使用16位优化状态的高调努力对于参数超过1B的大型模型报告了困难(Rameshetal.,2021)。从16位优化器减少到8位优化器,将可能值的范围从2 的16次方 =65536值减少到仅2的8次方=256。据我们所知,这在以前没有尝试过。
有效地使用这个非常有限的范围是具有挑战性的,原因有三:
1、量化精度、计算效率和大规模稳定性。为了保持精度,关键是引入某种形式的非线性量化,以减少常见小幅度值和罕见大幅度值的误差。2、然而,在实际操作中,8位优化器需要足够快才能不降低训练速度,这对于需要更复杂数据结构来维护量化桶的非线性方法来说尤其困难。3、最后,为了在超过1B参数的大型模型中保持稳定,量化方法不仅需要有良好的平均误差,而且需要有优秀的劣例性能,因为单个较大的量化误差会导致整个训练运行的发散。
我们引入了一种新的以块为单位的量化方法,可以解决所有这三个挑战。分块量化将输入张量分成块,并对每个块独立地进行量化。这种逐块划分减少了异常值对量化过程的影响,因为它们被隔离到特定的块中,从而提高了稳定性和性能,特别是对于大规模模型。块级处理还允许高优化器吞吐量,因为每个归一化可以在每个核心中独立计算。这与张量范围的规范化形成了对比,后者需要缓慢的跨核同步,高度依赖于任务核心调度。我们将块级量化与两种稳定高性能的8位优化器相结合:动态量化和稳定的嵌入层。动态量化是对无符号输入数据的动态树量化的扩展。稳定嵌入层是标准词嵌入层的变体,通过对输入的高度非均匀分布进行规范化,以避免极端梯度变化,从而支持更积极的量化。
我们的8位优化器在原始内存占用的一小部分上保持了32位的性能。我们将其应用于广泛的任务:1.5B和355M参数语言建模、GLUE微调、ImageNet分类、WMT ’ 14+WMT ’ 16机器翻译、MoCo v2对比图像预训练+微调和RoBERTa预训练。我们还报告了额外的消融和敏感性分析,表明所有组件——块级量化、动态量化和稳定嵌入层——对这些结果至关重要,8位Adam可以作为32位Adam的简单替代,不需要超参数的改变。我们开源了我们的定制CUDA内核,并提供了一个PyTorch实现,通过改变两行代码来实现8位优化。
1 BACKGROUND
1.1 STATEFUL OPTIMIZERS
n优化器更新参数w梯度的神经网络通过对重量损失gt =∂L∂w t。有状态更新迭代优化计算统计的梯度对每个参数在时间加速优化。两个最常用的状态优化器是Adam (Kingma and Ba, 2014)和SGD (Qian, 1999) -或简称momentum。在没有阻尼和缩放常数的情况下,这些优化器的更新规则如下:
1.2 NON-LINEAR QUANTIZATION(非线性量化)
量化压缩数字表示,以牺牲精度为代价节省空间。量化是将k位整数映射到D中的实元素,即Qmap:[0,2k−1]7→D。例如,IEEE32位浮点数据类型将索引0…2 32 −1映射到域[-3.4e38,+3.4e38]。我们使用以下符号:Qmap(i)=Qmapi=qi,例如Qmap(231+131072)=2.03125,用于IEEE32位浮点数据类型。
为了执行从一种数据类型到另一种数据类型的一般量化,我们需要执行三个步骤。(1)计算标准化常数N转换输入张量T的域D目标量化数据类型Qmap,(2)为每个元素的T/N找到最近的对应值气域D,(3)存储指数我对应气量化输出张量TQ。为了接收去量化的张量TD,我们查找指数并去正化:TDi=Qmap(TQi)·N。
为了执行这个动态量化的过程,我们首先通过除以绝对最大值:N=max(|T|)来归一化到范围[-1,1]。
然后,我们通过二进制搜索找到最接近的值:
1.3 DYNAMIC TREE QUANTIZATION(动态树量化)
动态树量化(Dettmers,2016)是一种对小值和大值产生低量化误差的方法。与具有固定指数和分数的数据类型不同,动态树量化使用了具有动态指数和分数的数据类型,它可以随着每个数字而变化。它由四个部分组成,如图2所示:
(1)数据类型的第一位被保留为一个符号。
(2)后续的零位的数量表示指数的大小。
(3)第一个设置为1的位表示以下所有值都保留给
(4)线性量化。通过移动指示器位,数字可以有一个很大的指数10−7或精度高达1/63。
与线性量化相比,动态树量化在非均匀分布下具有更好的绝对量化误差和相对量化误差。动态树的量化被严格定义为量化在[-1.0,1.0]范围内的数字,这是通过执行张量级的绝对最大归一化来保证的。
2 8-BIT OPTIMIZERS(8bit优化器)
3 8-BIT VS 32-BIT OPTIMIZER PERFORMANCE FOR COMMON BENCHMARKS(8位和32位优化器的性能)
4 ANALYSIS
5 RELATED WORK(相关工作)
6 DISCUSSION & LIMITATIONS
7 BROADER IMPACT(更广泛的影响)
我们的8位优化器支持以前无法在各种gpu上进行训练的训练模型,如表2所示。此外,尽管存在许多选项来通过并行性减少内存占用(Rajbhandari等人,2020;Lepikhin等人,2020)我们的8位优化器是少数可以不降低性能而显著减少单个设备优化器内存占用的选项之一。因此,我们的8位优化器很可能会改善对更大模型的访问——特别是对于拥有资源最少的用户。
MSF Finally
这篇文章知乎解说:如何看待FAIR提出的8-bit optimizer:效果和32-bit optimizer相当?
再次需要安静的细品!2022 / 5 / 6