qlora主要的出发点就是为了: 量化模型减少数据的存储空间.---》目的、q_lora产生的意义
fp16
数据格式:符号位(1bit) + 指数位 + 小数部分
指数位(5bit=2^5=32,全0或者全1表示正负inf,故最多能表示2^30,分为正负区间后表示的指数范围:2^-14~2^15)
小数部分(10bit,最小精度为1/2^10)
表示的最大正值为: (-1)^0 * 2^15 * (1+1023/1024) = 65504
表示的最小正值为: (-1)^0 * 2^-14 * (1+1/1024)
fp32
fp32是1个符号位+8个指数位+23个小数位,精度是最高的
bfloat16 和 fp16有什么区别?
bfloat16是1个符号位+8个指数位+7个小数位,所以它的表示范围比fp16大,但它的精度没有fp16高,小数位的精度为1/2^7=1/128
量化(absmax、量化因子)、反量化(为了在模型推理时使⽤这个量化的权重,我们需要将其反量化回浮点数)
归一化:x' = (x-min)/(max-min) 量化过程跟此过程类似
反归一化: x = x' * (max-min) + min 反量化过程跟此相似
seg: list = [0.123456789, 1],量化为int8,int8的范围是[-127, 127]
absmax=1,量化因子是127 整个list的数据除以absmax后--->[0.123456789, 1] --->乘以127---->[16, 127]
反量化(整个过程逆向计算回来)--->[0.1259, 1]
结论:通过反量化,量化的权重16被转换回浮点数 0.1216 ,这个值接近原始权重 0.123456789 ,但由于量化的精度损失,它并不完全相同
为什么要进行反量化
1、为了在模型推理时使⽤这个量化的权重,我们需要将其反量化回浮点数
2、在进行混合精度运算时,int8类型的数据和int8类型的数据算完了,接着需要和bfloat16类型的数据进行运算,此时也需要把int8类型的数据反量化回bfloat16
3、有些任务必须进行反量化,如机器学习的数据(身高、体重、年龄)在量化之后,看不出这些数据的实际意义,必须反量化回去
int4
int4是1个符号位 + 2个指数位 (假设最多能表示16,[-7,8]) + 1个小数位
nf4认为这种切分数据的方法太平均了,不够精细(比如0.01和0.02,这两个数字相差两倍,但是量化之后都变成了0)