微信扫码
与创始人交个朋友
我要投稿
一共四篇。
其中,第一篇FP8是高通的文章,22年8月份,第二篇FP8是Nvidia、ARM、Intel三家联合发布,22年9月份,这简直就是神仙打架,已经说不好谁先提出来的了。FP4则是香港科技大学和Meta合作的,23年10月份新鲜的,是将FP8的思想应用到了FP4上面。番外篇(也叫MoFQ)是微软23年5月份的混合量化论文。另外本文阅读过程中还涉及了LLM.int8()和SmoothQuant两篇INT量化的相关知识。
不同于INT8、INT4的方法,当下FP8和FP4相对来说用的少一些,不过最近关注和应用程度都在上升。一种简单的说法是,相比INTx对数值的均匀分布表示,FPx则是采用了指数式的,FPx是比INTx更有"表达力"的格式,同时INTx是FPx的一种特例。下面来一起了解一下这个量化技术。量化技术是个比较深的研究和实践领域,这一篇博客是很难完全覆盖到每个技术点的,以此为开始吧。
什么是FP8、FP4?
FP8和我们直接用的FP16,有什么区别?
FPx和INTx的联系是什么?
FP16量化为FP8与量化为INT8,过程上有什么区别?
FPx的优势是什么?为什么?
LLM-FP4论文的创新在哪里?
写这篇博文的时候还是思考了很久如何进行表达才更能讲的清楚,我是觉得论文中的公式不够直观,那么该如何将整个逻辑讲清楚。
NVIDIA H100 Hopper FP8 Tensor Core - ServeTheHome 。除此之外还有一个TF32,使用了FP32的指数位和FP16的尾数位。BF16 格式是 Google 在 TensorFlow 中引入的新数据类型。那么我们可以按FP8中的表示方法看一下这几种格式:
类型 | ExMx表示 |
---|---|
FP32 | E8M23 |
TF32 | E8M10 |
FP16 | E5M10 |
BF16 | E8M7 |
所以FP8中M2E5/M3E4/M4E3/M5E2的意思也就比较好理解了,本质上是一样的。
我们再以FP4的E2M2/E1M3和INT4(E0M4)来举例(这个总数只有16,一个表能写得完):
E2 | 2^e | M2 | 1+d1/2+d2/4 |
---|---|---|---|
00 | 1 | 00 | 4/4 |
01 | 2 | 01 | 5/4 |
10 | 4 | 10 | 6/4 |
11 | 8 | 11 | 7/4 |
4个E2和4个M2相乘的结果就是:4/4,5/4,6/4,7/4,4/2,5/2,6/2,7/2,4,5,6,7,8,10,12,14。当偏移等于-2时,4/16,5/16,6/16,7/16,4/8,5/8,6/8,7/8,4/4,5/4,6/4,7/4,4/2,5/2,6/2,7/2。就是如下图第二行的分布。
可以发现的是图中xxxx的部分数据是不和规律的。这部分被称为 subnormal numbers ,也就是指数处于最小值时的M2=4个数,为什么要单独说这部分值,是因为公式2是无法表达0的,有趣吧,毕竟两数相乘为0只能是至少一个数为0,2^x>0,尾数为0的话,几个不同的指数不管等于几结果都为0了,也就是说一共就16个数,4个直接为0,太浪费了。所以 subnormal number 在定义中进行了修改,p=0 时公式2中的等比数列第一项被修改为了0,且修改p=1,也就是
,也就是说 4/16,5/16,6/16,7/16 会变为 0/8,1/8,2/8,3/8。整体数列变为:0/8,1/8,2/8,3/8,4/8,5/8,6/8,7/8,4/4,5/4,6/4,7/4,4/2,5/2,6/2,7/2。但是,这个设置让这个规则和数列都不整齐了,需要再运算时增加一个判断,不过,这是在 IEEE 754 standard 标准中的表达方法,硬件都可以直接支持,不用担心。交叉验证一下:在另外一篇fp8论文中,max normal 110 使用公式:1+1/2+1/4=1.75,而max subnormal 111 使用公式:0+1/2+1/4+1/8=0.875,没问题。
另外,MoQF中还提到了复用nan和inf标志位的思路,FP16/32时候都不算什么,但是FP4时占用的表示空间已经有1/4了,所以这些都是在很小的表示空间中不要浪费带宽的思路。这块硬件上如果不支持的话,用weights only的量化时,activation时候通过dequant恢复为高带宽数值再计算,也就没有关系了。
再进一步,INT8,也可以用这种形式表示:有正负号表示的时候是1E0M7(-127,127),有的方法没有正负号就是0E0M8(0,255),本质上也没有什么区别。
以上都是基础知识了。
从原理层面说,INTx和FPx对应的数值分布是不同的,换言之,INT下一个数值无论处在max和min之间任意一个位置,距离最近的量化后数值的距离都是均匀的,对比之下FP下一个数值处在0附近和远离0时,距离最近的量化后数值的距离是不同的,在0附近的时候就比较小。从整个网络的数据来说,不论是参数还是激活值,如果统计意义上数据都集中在0附近,那么FP分布下总的距离也就是loss就会比较小。毕竟虽然有些离得远但是他们总数量上比较少。FP8中的图说明了这一点。
从实践层面说,FP8论文中认为,在各种网络的PTQ方法中,FP8格式在准确性方面优于INT8。同时FP8中的指数位数实际上是取决于网络中异常值程度的。在混合精度MoFQ中作者则认为,对于不同情况(the static/dynamic nature of tensors, outlier distribution, and quantization bit-width等)下INTx和FPx不存在哪一个有绝对优势,所以可以根据不同的层的实际loss进行选择。
FP8论文中提到几个需要重视的问题,而这几个问题其实是INT量化和FP量化时都需要考虑的重要问题,所以从这个层面上讲,这两者是完全相通的。1)是ExMy的数值确定,对结果的影响比较大,下图就是一个不同方案下量化误差的对比。
2)需要考虑量化校准时maxmin的确定,一般的量化空间的都是需要搜索确定的。3)是需要考虑的事strong outlier对量化的影响(outlier就是离量化网格比较远的数值,也叫离群值,strong outlier就是指非常远的)。LLM.int8()的论文就发现模型参数量超过6.7B时,激活会出现大幅的outliers,所以就采用了保留着outlier不量化的混合方案。4)per-token、per-tensor、per-channel等激活量化方案的选择,SmoothQuant就是为了解决LLM.int8()中per-tensor太过于粗粒度的问题,使用了per-channel的更加精细的方法,更加精细的量化范围可以避免部分outlier问题,不过这两篇文章都是针对INT的量化解决方法了。
这里还有一起额外的问题:FP16量化为FP8与量化为INT8,过程上有什么区别?
FP16是我们非常常用的一种数据表示方法,其实本质上和FP8也没有什么区别,在FP16->INT8时需要用的最大最小值搜索,偏置值确定等过程上,适用到FP8时,并没有什么不同,唯一的区别就是映射的量化网格(Quantization Grid)长得不一样,最终的量化loss值根据数值分布不同也产生相应的不同。
不过我猜测,INTx和PFx两者量化方案中,应该还有一些隐藏的属性目前我们还没有发现,还有待于新的研究成果来揭秘。
论文的核心方式叫做Pre-Shifted Exponent Bias,Motivation是channel之间激活值变化很大,所以这个方法是沿用了SmoothQuant的per-channel方案。
而per-channel的scaling factors则被re-parameterized成exponent bias。
为了方便理解这个bias,我们来看一下公式(1)(FP8中它是公式2)的变化过程。
这时再来重新理解figure 3就比较清晰和简单了。
总结一下LLM-FP4,分离偏置值的思路挺有亮点,也有较好的分析。不过目前看开源社区的复现和风评还不是蛮好。可以再飞一飞等等看。
通过这几篇论文的综合阅读,也了解了一下量化方面的基础知识和大模型量化的前沿研究,不过我自己阅读时的总体感觉是量化方法看起来好像我上我也行的几个数学公式,但是实际上可能这只是冰山一角,其实非常多的具体的case沉在水面之下的,总会有一种读了一个小方法之后还有很多基础知识没有了解的感觉。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-05-06
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19