大模型量化概述
量化简介
定义
模型量化是指以较低的推理精度损失将连续取值(通常为float32或者大量可能的离散值)的浮点型权重近似为有限多个离散值(通常为int8)的过程。
量化分类
根据应用量化压缩模型的阶段,可以将模型量化分为:
- 量化感知训练(Quantization Aware Training,QAT)
在模型训练过程中加入伪量化算子通过训练时统计输入输出的数据范围可以提升量化后模型的精度,适用于对模型精度要求较高的场景;其量化目标无缝地集成到模型的训练过程中。这种方法使LLM在训练过程中适应低精度表示,增强其处理由量化引起的精度损失的能力。这种适应旨在量化过程之后保持更高性能。
- 量化感知微调(Quantization-Aware Fine-tuning,QAF)
在微调过程中对LLM进行量化主要目标是确保经过微调的LLM在量化为较低位宽后仍保持性能,通过将量化感知整合到微调中,以在模型压缩和保持性能之间取得平衡。
- 训练后量化(Post Training Quantization,PTQ)
在LLM训练完成后对其参数进行量化,只需要少量校准数据,适用于追求高易用性和缺乏训练资源的场景。主要目标是减少LLM的存储和计算复杂性,而无需对LLM架构进行修改或进行重新训练。PTQ的主要优势在于其简单性和高效性。但PTQ可能会在量化过程中引入一定程度的精度损失。
线性量化分类
对称量化中,量化前后的 0 点是对齐的,因此不需要记录零点,将参数量化到(-127,127)。它适合对分布良好且均值为 0 的参数进行量化。因此对称量化常用于对 weight 量化。
非对称量化(如右图所示)中,量化前后 0 点不对齐,需要额外记录一个 offset,也就是零点,将参数量化到(0,255)。非对称量化常用于对 activation 做量化。
QLoRA
QLoRA 同时结合了模型量化 Quant 和 LoRA 参数微调两种方法。QLoRA 针对模型权重(weight)做量化,采用的是对称量化算法。
量化部分的创新点:
- 采用新的 NF(NormalFloat)数据类型,它是对于正态分布权重而言信息理论上最优的数据类型,同时,NF 类型有助于缓解异常值的影响;
(1)int4 的格点分布是均匀的,然而模型的权重通常服从均值为 0 的正态分布,因此格点的分布和数据的分布不一致。
(2)NF4 的格点按照正态分布的分位数截取,格点分布两端稀疏,中间密集,格点分布与数据分布一致。这样格点分配的效率就大大增加了,同时精度受损也不会太大。
- Double Quant,对于量化后的 scale 数据做进一步的量化;
QLoRA 将每 64 个参数为做一个 block,即 block_size = 64,每个 block 计算一个 Scale。由于量化后的 Scale 通常以 FP32 存储,在 block 数众多的情况下,Scale 占用的显存也不可忽视。因此,QLoRA 对 Scale 进一步量化成 FP8,取 Double Quant 的 block size = 256,因而进一步降低了显存消耗。
Double Quant 前,每个参数做量化会需要额外的 32/64 = 0.5 bits 显存;
Double Quant 后,每个参数做量化只需要额外的 8/64 + 32 / (64*256) = 0.127 bits 显存。