4-bit 标准浮点数量化
常见的量化技术是最大绝对值量化:
X I n t 8 = r o u n d ( 127 a b s m a x ( X F P 32 ) X F P 32 ) = r o u n d ( c F P 32 , X F P 32 ) 式(1) X^{Int8}=round(\frac{127}{absmax(X^{FP32})}X^{FP32}) = round(c^{FP32},X^{FP32}) \qquad \qquad \text{式(1)} XInt8=round(absmax(XFP32)127XFP32)=round(cFP32,XFP32)式(1)
其中 c 是量化常数,为这个张量特征的绝对值最大值。
反量化为:
d e q u a n t ( c F P 32 , X I n t 8 ) = X I n t 8 c F P 32 = X F P 32 式(2) dequant(c^{FP32},X^{Int8})=\frac{X^{Int8}}{c^{FP32}}=X^{FP32} \qquad \qquad \text{式(2)} dequant(cFP32,XInt8)=cFP32XInt8=XFP32式(2)
分位数量化
分位数 数学上的定义为把顺序排列 的一组数据分割为若干个相等块的分割点的数值。在标准正态分布中,对于分布 X 给定的概率 α \alpha α ,如果存在 u a u_a ua ,使得他的分布函数(CDF) P ( X < u a ) = α P(X<u_a)=\alpha P(X<ua)=α ,则称 u a u_a ua 为标准正态分布的 α \alpha α 分位数,显然他是严格递增的,故存在反函数。CDF 的反函数的一个重要作用是用来生成该随机分布的随机变量。
Time Dettmers 认为 k-bit 的有损最小熵编码具有以下特性:当将输入数据进行量化时,每个可能的 k-bit 整数值出现的概率是相等的 。
那么对于预训练模型(参数符合正态分布),可以通过 CDF 的反函数 Q X = F X − 1 Q_X=F_X^{-1} QX=FX−1 简化分位数计算。对于两个分位点的中心 q i q_i qi 有:
q i = 1 2 ( Q X ( i 2 k + 1 ) + Q x ( i + 1 2 k + 1 ) ) q_i=\frac{1}{2}(Q_X(\frac{i}{2^k+1})+Q_x(\frac{i+1}{2^k+1})) qi=21(QX(2k+1i)+Qx(2k+1i+1))
然后量化计算得到:
- 归一化常数 N = m a x ( ∣ T ∣ ) N=max(|T|) N=max(∣T∣),将输入张量映射到目标范围
- 对于 T / N T/N T/N 的每个元素,采用二进制搜索找到最接近阈值的 q i q_i qi
T i Q = a r g m i n j = 0 2 n ∣ Q j m a p − T i N ∣ 式(3) T_i^Q=argmin_{j=0}^{2^n}|Q_j^{map}-\frac{T_i}{N}| \qquad \qquad \text{式(3)} TiQ=argminj=02n∣Qjmap−NTi∣式(3)
分块 k 位量化
在式(1)中 127 a b s m a x ( X F P 32 ) \frac{127}{absmax(X^{FP32})} absmax(XFP32)127 如果是个异常的极大值或者极小值,那么会造成整个张量的绝大多数值在量化后在 0 附近,破坏了量化特征的均匀性。
分块 k 位量化通过将张量分成若干个块,让每个块有独立量化常数 c,解决了异常值问题,并减少了核之间的通信,有更好的并行性。
4-bit 标准浮点数量化通过将数据分为负数和正数两部分分别量化:负数部分用7位表示(8个值,含0),正数部分用8位表示(9个值,含0)。合并时去掉一个重复的0,最终占满4比特的16个值。这种方法确保零点精确映射到0,并充分利用了4比特的全部信息
双重量化
当我们保存模型时我们不仅要保存量化后的结果,还要保存每个块的量化常数。虽然量化后的参数只有4bit的精度,但是这个量化常量的精度是 float32。在 QLoRA 中,每个块的大小是 64,因为块中的每个值占 4 比特。这相当于为了存储量化常数,模型要额外占用 32/(64∗4)=12.5% 的显存。QLoRA 的双重量化就是对这个量化常数再做一次 8 bit 的量化。
分页优化
分页优化是针对梯度检查点做的进一步优化,以防止在显存使用峰值时发生显存OOM的问题。QLoRA分页优化其实就是当显存不足是,将保存的部分梯度检查点转移到CPU内存上。
QLoRA 核心工作在于模型量化,通过定义 4NF 的精度单位,大幅节约了训练时所用显存。因其作为 LoRA 系列被得到广泛应用,尽管本人对模型量化并没有太多研究,仅以此记录,如果有不对地方,还请各位给予批评指正。
实验结果
