00:00
不做马上教程,只能讲知识的自己。大家好,我是会学盖板你会唱歌的戴先生。兄弟姐妹们,如果你折腾过本地部署大模型,那应该或多或少听过一个词量化。那量化是什么呢?用大模型炒股稿钱no,此量化非比量化,指的是大模型瘦身。本期主要聊的是对称印是印8量化原理,它是g p t q aw q、拉马点、CPP这些主流量化方案的底层基石。打个比方吧,量化就像把4K高清视频压成720P,文件小了,硬盘省了,内存也省了,虽然画质有点损失,但大部分时候你看剧根本感觉不到差别。那具体怎么压缩的呢?核心思路就是把位数多的浮点数,比如FP16。
01:00
第设成位数更少的整数,比如INT8 int4来存储,不了解2P16的同学可以先去看上期的视频大模型参数存储格式揭秘别不是男朋友那怎么映射的呢?假设有一组浮点数,他们的指的范围是-0.2~0.2,现在又把它们映射到5个整数编码怎么做呢?给你们3秒钟的思考时间,好,到时间了我来揭晓答案。先把-0.2~0.2的区间进行五等份,每份交界处打个刻度,再给每个刻度贴上整数标签。位置很简单,每个浮点数看自己离哪个刻度最近,就贴上那个刻度的整数标签,这样每个浮点数都可以用整数来代替存储会省不少空间。那怎么把?
02:00
把整数还原成浮点数呢?大模型推理时,大部分情况下的确需要把整数权重反量化为浮点数来计算。这个大会讲到公式时再细聊原理,大概听懂了吗?那我们再深入一点讲讲对称INT4INT8具体的量化计算过程。下面我通过一个完整的演算示例带你们走一遍。假设我们有一组FP16格式的权重参数范围是-0.2~0.2,准备用in是量化4BIT有符号整数用二进制补码表示,那它们的编码范围就是-8~7。为什么是-8~7而不是-7~8呢?因为这是二进制补码的硬件标准,具体自己去问AI版这里就不展开了。然后0偏移等于0,这正是对称的含义,0走2。
03:00
次的编码范围相对0点完全对称因式。我们的目标只有一个,算出scale缩放因子,通过它才能让INT4和FP16之间互转。我猜你们目前为止听得云里雾里的,莫急,接下来会一步一步讲解,听不懂算我的第一步简单先找出权重参数的最大值和最小值,这个例子最小值等-0.2,最大值等于0.2。第二步求刚刚找到的那两个原始权重极值的最大绝对值A,那这里A算出来就等于0.2。第三步采用行业标准公式S=A÷7。有没有同学有疑问的,为什么是7 N的是编码不是-8~7吗?关键就在这7是最大的正编码。
04:00
我们想让最大的浮点数权重A完美对应到Q=7,这样正方向不浪费任何编码空间。我们套公式看一下S=0.2÷7,验证一下反量化Q=7,推导出反量化后的权重参数等于7×S=7×0.2÷7=0.2刚好对上。那为什么不能拿-8来算scale呢?比如S=A÷8行不行?我们也来试一把,S=0.2÷8=0.025正向最大编码还是7 7×0.025就等于0.175,但我们真实的权重最大值是0.2 0.2>0.175,正向直接溢出权重就会直接失真。
05:00
所以scale的分母只能用7。代价呢来看最小值Q等于-8对应多少?-8×0.02857,优势约等于负的0.22857下线-0.2857比最小值-0.2还多出来一截。-8这个编码档位其实是闲置的,因为没有权重,参数会落到这个区间,这就是对称量化的一个小代价。正数次最大可用编码只有7 scale分母只能用7,必然有一个编码用不上scale有点像一把尺子上的刻度之间的距离,相邻刻度之间的距离就是scale。有了scale就可以来计算浮点数到整数编码的转换了。公式如下,公式看着犯困,其实很简单,就三步,除scale。
06:00
四舍五入截段除scale就是把浮点值按scale切分,算出它落在哪一段,四舍五入就是算出它离这一段的两个头尾的整数编码哪个更近。截段就是防御性编程,确保结果落到合法范围。比如IN4的合法区间就是-8~7,小于最小值就取最小值,大于最大值就取最大值,对称量后的场景下,截段基本不会触发。接下来我们拿正负两个浮点数作为示例来计算一下。例1 W=0.1第一步除scale w÷S≈3.5,第二步四舍五入,Q就等于4,第三步截断,那因为4在区间内,就无需截断。例2 W等于负的0.18啊,第一步除。
07:00
Scale w÷S约等于负的6.3,第二步45入就等于-6,那第三步截断,那-6在区间内就无需截断,这样就完成了FP16到A点4的量化,是不是so easy? 那量化往后推理时怎么把整数变为浮点数呢?直接用重建公式一步搞定。用刚刚的例子我们来反量化一下,例1W=4×S≈0.11428,例2W等于-6×S约等于负的0.17143,咦,0.1回去变成了0.1428,负的0.18变成了负的0.17143,好像有点误差哦,这就是量化的代价,In的是总共就16个取值单位精度。
08:00
有限。比如0.1恰好落在Q=3和4的正中间,往4靠就有了这个误差,但是bit能做到这个精度已经相当难打了。这种量化方式会有哪些问题呢?我举些例子,你们随便听听就好。比如权重分布如果不相对0轴对称,像0~0.2区间这种全是正数的对称量化,会让-8到-1这8个编码直接荒废掉,这时就得用非对称量化了。再比如权重里混进了极端离群值,比如这样的值全局scale会被0.8撑大,0.1附近的参数全集到统一段。解决方案就是分组量化各组独立算字值的scale,把极端值的影响控制在一个小组内,醒醒,别睡了,讲完了,拜拜。
我来说两句