什么是分块量化(Block-wise Quantization)?——让 8 位优化器保持 32 位性能的关键技术
分块量化是一种把输入张量切成小块、对每块独立做量化的数值压缩方法。arXiv 论文《8-bit Optimizers via Block-wise Quantization》提出用它配合动态量化与稳定嵌入层,使 8 位优化器状态在多项任务上保持 32 位优化器的性能,同时大幅降低显存占用。
分块量化(Block-wise Quantization)是一种数值压缩方法:它把输入张量切分成若干个较小的块,每个块独立进行量化,各块之间并行处理。它要解决的问题是,当把优化器状态、梯度统计等张量从 32 位压缩到 8 位时,量化误差与数值不稳定会让训练效果下降;分块量化通过缩小每块内的数值范围,让低比特表示仍能保持较高精度。
为什么重要
在深度学习训练中,带状态的优化器(stateful optimizer)会随时间维护梯度统计量,例如 SGD with momentum 维护过去梯度的指数平滑和,Adam 维护梯度平方的指数平滑和。这些状态能加速优化,但会占用本可以分配给模型参数的内存,从而限制实际可训练的模型规模。
在分块量化出现之前,优化器状态通常以 32 位浮点保存,内存开销与参数量成正比。若直接把状态压到 8 位,会遇到三类困难:量化带来的精度损失、量化本身的计算开销,以及低比特表示下的训练稳定性问题。论文指出,正是为了克服这些计算、量化与稳定性挑战,作者才提出分块动态量化(block-wise dynamic quantization)。
工作机制
按论文的描述,分块量化的核心做法可以拆成以下几点:
- 切块:把输入张量划分为更小的块,每个块独立量化。块内的数值范围比整个张量窄,因此同样的 8 位位宽能表达得更精细。
- 并行处理:每个块在不同核心上并行处理,论文称这带来更快的优化速度与高精度量化。
- 动态量化:论文把分块量化与动态量化结合。动态量化被描述为一种非线性优化形式,对大数值与小数值都能保持精确。
- 稳定嵌入层:论文还引入稳定的嵌入层(stable embedding layer),用于降低语言模型中输入 token 分布高度不均匀所带来的梯度方差。
论文将上述组合的产物称为首批使用 8 位统计量、同时保持 32 位优化器状态性能水平的优化器。作者强调,使用这些 8 位优化器时不需要改动原有的优化器超参数。
典型例子
论文给出的验证场景包括:15 亿参数的语言建模、GLUE 微调、ImageNet 分类、WMT'14 机器翻译、MoCo v2 对比学习式 ImageNet 预训练加微调,以及 RoBERTa 预训练。论文称,在这些任务上 8 位优化器以很小的内存占用保持了 32 位性能。
在工程落地方面,论文作者将 8 位优化器开源,作为可直接替换(drop-in replacement)的方案,只需改动两行代码。该论文为 ICLR 2022 spotlight 版本,作者为 Tim Dettmers、Mike Lewis、Sam Shleifer、Luke Zettlemoyer。
边界与常见误解
首先需要区分概念:分块量化本身是一种通用的张量量化手段,而论文所验证的是「分块量化 + 动态量化 + 稳定嵌入层」这一组合在优化器状态上的效果。把论文的结论直接推广为「任何 8 位量化都不损失精度」并不成立,论文的结论范围限定在其所述的优化器与任务集合内。
其次,分块量化并非没有代价。切块意味着需要为每块维护独立的量化尺度等元数据,块越小元数据开销占比越高;同时,量化与反量化本身带来额外计算,论文正是把计算开销列为需要克服的挑战之一。分块与并行处理能否真正提速,取决于硬件与实现。
第三,论文中「保持 32 位性能」的表述来自作者在特定任务与设置下的实验,属于该论文的主张,不应被理解为在所有模型、所有任务、所有硬件上都成立的普遍结论。此外,稳定嵌入层是针对语言模型 token 分布不均匀问题引入的组件,它与分块量化是两个可以分开讨论的设计,不宜混为一谈。
最后,分块量化压缩的是优化器状态等张量,并不等同于对模型权重本身做量化;两者目标相近但作用对象不同,实际部署中需要分别评估。