分享
(8)LLM模型量化世界观(上)
输入“/”快速插入内容
(8)
LLM模型量化世界观(上)
🔗 原文链接:
https://zhuanlan.zhihu.com/p/686232...
作者:小 A
更新记录
更新时间
更新内容
2024.03.10
完成第一版
开篇
大家好,我是小A。好久没见,前段时间确实太忙,拖更了1个Q。本系列会持续更新,绝不太监,立flag为证~废话不多说,坐稳我们发车~
上篇介绍了分布式相关的基础知识,这一篇开始,我们开始详细介绍部署相关的话题。本期将深入LLM量化过程的各个方面,主要围绕下面7个问题展开
•
浮点数和定点数本质区别是什么?
•
QAT是如何学习scale的?
•
Weight-only常规比特量化有什么常见方法,二阶导方法如何推导?
•
Weight-only极低比特量化有什么开脑洞的方法?
•
Activation+Weight量化中交叉维的均衡化都有哪些玩法?
•
FP8 量化效果究竟怎么样?
•
KV Cache量化都有哪些方法?
内容比较多,计划拆成上下两篇,上篇覆盖前3个问题,下篇覆盖后4个问题。
量化统一视角
量化(Quantization),一般指定点数量化,也就是小数点的位置是固定的,与之相对应的就是常见的浮点数。
为了更好的理解LLM定点量化的过程,本小节会拆成三部分
•
第一部分介绍浮点数的基本知识
•
第二部分介绍定点量化的过程
•
第三部分选择GEMM为切入点,详细介绍per-token/per-channel/per-group等量化都是怎么回事。并且尝试从数学角度对他们统一建模,让大家更好的理解定点量化的本质。
从浮点数聊起
浮点数是当今计算的carry王者,设计初衷是解决计算机不能表示任意实数的问题。其标准来源于IEEE 754,如下图所示(以FP32为例)
浮点数左边是高位,右边是低位。从高低到低一般由三部分组成,正负号(Sign),指数(Exponent)和尾数(Mantissa/Fraction)三部分组成
数学化表达为
其中
•
是符号位数,
是指数位数
•
是指数值
•
是指数的偏移,一般
,例如fp32就是127
•
是第
个尾数
原始二进制小数转化成尾数有几个额外规则
•
隐藏高位1。二进制的科学计数法,默认是
1.xxx
的方式,因此
1.
是固定的,一般省略
•
低位补0。尾数的低位用0补齐
因此
0100 1000 0000 0000 000
转换回二进制小数需要去掉低位补的0,还原高位隐藏的1,得到
1.01001
INTx量化入门
从浮点数的格式定义我们不难发现,浮点正如其名,小数点的实际位置是浮动的。如果我们从实数轴角度看,浮点数就是把数轴按
进行分段,相邻段的长度是指数增长的,但是每一段内是均匀切分的,切分段数由尾数位数决定。因此浮点数在靠近0的地方特别稠密,在远离0的地方比较稀疏。
相比之下,定点数量化,即INTx量化,是对实数轴进行平均采样,超出部分直接截断,如下所示。