QLora

QLora

zhuanlan.zhihu.com/…

QLora属于非线性量化,使用NF4量化策略。基于分块的分位数量化的量化策略;其次是双重量化,包含对普通参数的一次量化和对量化常数的再一次量化,可以进一步减小缓存占用;具有k-比特的有损最小熵编码具有如下特性:当将输入数据进行量化时,每个可能的k-bit的整数值出现的频率是相等的(k-bit 如4bit,16个整型数字出现的频率一样,所有数字被均匀分配到这16个数字,这样具有最小损失)。如果我们粗暴的使用round操作去低精度的更近的值,我们可能造成大量的数据都被量化到同一个数上,这样特征之间的差异性在量化过程中就被丢失了。

分位数量化

首先将参数进行分布统计,以下是正态分布图

img

x轴代表了参数范围,y轴代表了出现的概率,如果我们要量化成4bit,那么x轴应该分成16份。每一份的面积相等。下一步需要确定分为数值。预训练模型的参数往往是符合正态分布的,累积分布函数的反函数来简化分位数计算。

以下是累计分布函数,以4bit为例,讲y轴分成16份,求出x轴坐标。

img

i是指bin的边界(0 - 1)有17,16个区间,使用16个点来代表。每个点的值是两个边界的平均值。于是可以得到qi。0和1的CDF的反函数的解分别是负无穷和正无穷,因此我们不能将0和1代入式(3)。为了解决这个问题,我们可以设置一个偏移(offset)位。使用偏移位后我们计算的区间不再是[0,1],而是[1-offerset,offset]

量化步骤

  1. 对参数进行归一化,x/x_max
  2. 对参数找到最接近的qi
  3. 将i 整型代表浮点数,存储到张量中

分块

分块k位量化的策略是通过将张量分成若干个块,让每个块都有独立的量化常数c,从而解决模型参数的极大极小的异常值的问题。分块量化的另外一个好处是减少了核之间的通信,可以实现更好的并行性,并充分利用硬件的多核的能力。

存储

需要存储一个归一化参数C =x_max,以及一张整型到浮点数的映射表。

双重量化

双重量化就是除了上面的量化再量化一次,归一化参数C,可以进行8bit量化减小存储。

累计分布函数CDF:x轴如下从小到大表示数据分布,y轴代表了累计分布的概率

img

逆累计分布函数ICDF

所以“逆累积分布函数”的意思其实是“反累积分布函数”

累积分布:分位点->概率,

逆累积分布:概率->分位点。