突破性技术: 大语言模型LLM量化激活outliers异常值抑制

LLM过去有两种突破性技术大大提升了量化精度,分别是group-wise量化和GPTQ/AWQ量化。前者相比于过去的per-tensor和per-channel/per-axis量化提出了更细粒度的对channel拆分为更小单元的量化方式,后者通过巧妙的算法明显提升了4bit量化的精度。

LLM量化存在一个常识性的挑战是激活部分channel里面存在显著大于其他channel的异常值,这显著提升了激活量化的难度,并且对权重量化精度损失也有很大影响。一种以SliceGpt, QuaRot等为代表的新的方法可能改善这个局面,在近期成为一个研究热点。

LLM激活量化outliers

LLM量化一个常识性的挑战是激活部分channel里面存在显著大于其他channel的异常值。

outlier存在于矩阵乘内积的K维度中。虽然理论上可以通过对不同channel采用不同的量化系数来解决这个问题, 但是模型量化一般对整个K是采用一个统一的量化系数,因为计算实现比较简单,而如果对K维度的每个元素用不同量化系数,那么矩阵乘时要进行非常频繁的反量化使得整个K维度所有元素共用同一套量化系数,结果才能累加在一起,因此对性能的损失肯定是异常显著的。也就是无法对单独的outlier channel跟其他channel使用不同量化系数来解决这个问题。

激活量化常用的的per-tensor或者per-token量化都无法解决这个问题。激活也采用权重的group量化可以部分解决这个问题,但是除CPU/GPU以外的其他硬件并不能很好地支持该量化方式。

过往的部分解决方案

smooth quant通过scale向量,激活除以scale,权重乘以scale从而降低激活outlier幅度,把激活难度迁移到权重。

awq的思路跟smooth quant基本一致,都是韩松团队提出的。也是基于scale向量,激活除以scale,权重乘以scale。权重乘以scale进行放大后,可以降低放大部分的元素量化精度损失。

atom量化,对outlier通道部分的元素通过reorder后,与其他非outlier部分区别对待,outlier部分通道采用高精度计算。

IntactKV: Improving Large Language Model Quantization by Keeping Pivot Tokens Intact,提出了一种非常简单的方法来保护prompt开头部分的公共前缀的kv cache,从而避免特殊token引入的outlier精度损失。

基于Rotation的激活outliers抑制方法原理

SliceGPT首先提出了一种计算不变性(computational invariance),然后被QuaRot和QServe用于抑制激活outliers。相关论文:

SliceGPT: Compress Large Language Models by Deleting Rows and Columns

QuaRot: Outlier-Free 4-Bit Inference in Rotated LLMs

QServe: W4A8KV4 Quantization and System Co-design for Efficient LLM Serving

QuIP: 2-Bit Quantization of Large Language Models With Guarantees

QuIP#: Even Better LLM Quantization with Hadamard Incoherence and Lattice Codebooks

computational invariance

An invariant function is one for which a transformation to the input does not result in a change to the output.

SliceGPT提出了一种Q变换,也就是对LLM的矩阵乘的权重W(部分情况包括bias也要进行变换),一部分变为W*Q,一部分变为QT*W,但是transformer计算结果不变。

Q和其转置QT具有特殊性质:Let Q denote an orthogonal matrix

另外一个关键是RMSNorm具有一个特殊的性质,对输入x进行Q变换得到x*Q,那么输出y变为y*Q,保持了Q变换的传递。

具体原理介绍

1, transformer网络的计算流程:

2, 施加Q变换流程:

3, 具体流程详解:

1. Embedding矩阵W乘以Q矩阵进行Q变换,使得经过embedding的激活由x变成x*Q。
进入transformer block后首先经过rms_norm,这个方法对结果保持了Q变换,也就是原来的输入x输出y,现在是输入x*Q输出y*Q。

2. 在进入attention之前,对Q,K,V的三个矩阵乘的参数变为QT*W,这样Q,K,V矩阵乘的输出原来是X*W,现在是(X*Q)*(QT*W) = X*(Q*QT)*W = X*W,也就是抵消了Q变换,不影响后续attention的计算。因为这个矩阵乘输出抵消了Q变换,所以bias保持不变。

3. attention输出后经过o_proj矩阵乘,o_proj的权重由W乘以Q矩阵进行Q变换,使得的激活由x1变成x1*Q。注意o_proj如果具有bias,也需要对bias变为bias*Q,才能正常对o_proj的输入进行完整的Q变换。

4. o_proj后是残差连接x+x1,因为残差另一个输入不像Q,K,V那样对Q进行了抵消,所以残差相加的激活x0和x1都经过Q变换,残差输出保持Q变换。

5. 然后到了FFN,首先是up_proj和gate_proj,这两个权重由W变为QT*W,跟上面Q,K,V矩阵乘一样,激活与变换后的权重相乘后抵消了Q变换。

6. 然后FFN的up_proj和gate_proj的结果经过激活函数到down_proj,down_proj的权重由W乘以Q,使得其输出进行Q变换。Bias跟o_proj一样需要进行变换。

7. FFN结果经过残差连接后进入下一个transformer block,循环进行上述2-6过程。

8. 最终lm_head的输入为x*Q,因此对lm_head的W变为QT*W,使得lm_head结果保持不变。

变换矩阵Q如何选择

理论上任何正交矩阵Q(满足Q*QT=I)都可以使用。

如果对整个模型所有transformer层应用一个统一的Q变换矩阵,那么,这两个变换可以完全融入矩阵乘的参数,跟AWQ一样,不引入任何额外的模型结构变化和计算量。

SliceGPT的方法

SliceGPT的目的主要是为了权重的剪枝,而不是激活outlier的抑制。因此其针对剪枝的需要并结合激活校准数据为每一层选择了特定的Q矩阵。

SliceGPT对每一层应用不同的Q变换矩阵,虽然可以通过Q和QT抵消一部分变换导致不引入额外的计算,但是残差连接处的两个输入激活具有不同的变换,这时就需要对其中一个输入变换到跟另一个输入一样的变换,两个结果才能相加。因此SliceGPT需要对残差的长程连接插入额外的矩阵乘计算:

QuaRot的方法

we apply randomized Hadamard transformations to the weight matrices without changing the model. 特别之处在于采用了一个随机化的Hadamard矩阵。

We also apply online Hadamard transformations to the attention module to remove outlier features in keys and values, enabling the KV cache to be quantized.

如果采用非随机化的Hadamard矩阵,或者所有曾使用一个固定的随机性的Hadamard矩阵,所有transformer层共用一个变换矩阵,不需要插入额外的矩阵乘从而引入任何额外计算量和模型结构变化。但如果每一层用不同的Hadamard矩阵,则会导致额外矩阵乘的插入实现Hadamard变换。

Hadamard matrix介绍

https://en.wikipedia.org/wiki/Hadamard_matrix

https://mathworld.wolfram.com/HadamardMatrix.html

据猜测,对于所有能被 4 整除的数,Hn都存在。

QServe的选择

跟QuaRot类似但没有采用随机化的Hadamard矩阵:We simply choose the scaled Hadamard matrix as the rotation matrix. since rotation is a unitary transformation, the rotation matrix Q can be absorbed by the weights of the output module in the previous block.

看上去对整个模型采用统一的Q变换矩阵(scaled Hadamard matrix)因此无需改变模型结构和引入任何额外计算量。

因为QServe并没有像QuaRot那样采用激进的4bit激活量化,而是8bit激活量化,可能这样就足够而无需采用更复杂的方法,或者说虽然这样次优但是不会引入任何模型结构变化从而有利于部署。当然整个模型采用一个固定的scaled Hadamard或者随机的Hadamard矩阵哪个更好需要进一步评测。

实践

如何得到变换的Q矩阵

QuaRot开源的代码库中fake_quant/hadamard_utils.py或者quarot/functional/hadamard.py中定义了random_hadamard_matrix可以获取随机化和scale后的hadamard矩阵,使得其行列式为1或者-1,满足正交性:

https://github.com/spcl/QuaRot

import numpy as np
from hadamard_utils import random_hadamard_matrix

N = 4096

had_mat = random_hadamard_matrix(N, 'cpu')
had_mat_np = had_mat.numpy()

# result is I
mat_result = np.matmul(had_mat_np, np.transpose(had_mat_np))
# result is 1 or -1
det = np.linalg.det(had_mat_np)

RMSNorm/LayerNorm处理

LayerNorm不满足Q变换的传递性,需要转换为LayerNorm,QuaRot提出了一种把LayerNorm转换为RMSNorm的方法。另外只有标准的RMSNorm即x/||x||才满足Q变换传递性,但是实际llama2, baichuan, qwen等模型用的RMSNorm还具有一个scale向量。需要融合到后面矩阵乘的参数里面才能实现计算等价。

有QuaRot还需不需要GPTQ/AWQ?

有待评测

总的来说,如果只是想简单的抑制激活的outliers从而提升激活量化精度,当然对权重量化应该也大有益处,QServe的方法应该是个不错的尝试起点。

本人使用Qwen1.5 5b chat验证,通过打印出矩阵乘激活通道间的绝对平均值,发现确实能够显著抑制激活的outlier:

如果本文对您有所帮助,欢迎赞助(^_−)☆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/677297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试八股总结】MySQL索引(二):B+树数据结构、索引使用场景、索引优化、索引失效

参考资料:小林coding、阿秀 一、为什么InnoDB采用B树作为索引数据结构? B 树是一个自平衡多路搜索树,每一个节点最多可以包括 M 个子节点,M 称为 B 树的阶,所以 B 树就是一个多叉树。 B 树与 B 树的差异:…

【UE5 刺客信条动态地面复刻】实现无界地面01:动态生成

为了快速上手UE5,开启了《复刻刺客信条动态地面》的技术篇章,最终希望复刻刺客信条等待界面的效果,这个效果大体上包括: 基础的地面随着任务走动消失和出现的基础效果地板的Bloom和竖起的面片辉光效果 既然是新手,&am…

CSS学习笔记之高级教程(五)

23、CSS 媒体查询 - 实例 /* 如果屏幕尺寸超过 600 像素&#xff0c;把 <div> 的字体大小设置为 80 像素 */ media screen and (min-width: 600px) {div.example {font-size: 80px;} }/* 如果屏幕大小为 600px 或更小&#xff0c;把 <div> 的字体大小设置为 30px …

器利而事善——datagrip 的安装以及简单使用

一&#xff0c;安装 下载&#xff1a;直接到官网下载即可&#xff0c; 破解&#xff1a;这是破解连接&#xff1a;https://pan.baidu.com/s/11BgOMp4Z9ddBrXwCVhwBng &#xff0c;提取码&#xff1a;abcd&#xff1b; 下载后&#xff0c;选择倒数第三个文件&#xff0c;打开da…

【ZZULI数据结构实验四】:C语言排序算法大比拼

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

洛谷 P10566 「Daily OI Round 4」Analysis 题解

先弄个 ASCII 码表&#xff1a; 分析 很明显&#xff0c;想要节省时间&#xff0c;就要把这些字符转换成和它们的 ASCII 值最接近的大写字母。 通过 ASCII 码表&#xff0c;很容易就可以发现&#xff1a; ASCII 值与数字最接近的大写字母是 A \texttt A A。ASCII 值与小写…

切片的MBTiles格式和XYZ格式

MBTiles 和XYZ是两种经常使用的切片格式&#xff0c;尤其是各类下载器下载在线地图时经常使用这种格式。 MBTiles 是一种用于存储地图切片&#xff08;tileset&#xff09;的文件格式&#xff0c;通常用于地图的存储和传输。该格式由 Mapbox 开发&#xff0c;旨在简化大规模栅格…

TensorFlow库详解:Python中的深度学习框架

引言 TensorFlow是由Google Brain团队开发的开源机器学习库&#xff0c;用于各种复杂的数学计算&#xff0c;特别是涉及深度学习的计算。它提供了大量工具和资源&#xff0c;用于构建和训练机器学习模型。TensorFlow因其强大的功能和灵活性&#xff0c;在机器学习和深度学习领…

IGraph使用实例——贝尔曼-福特算法(求解单源最短路径)

1 概述 本文中求解最短路径使用的方法是igraph中基于贝尔曼-福特算法&#xff08;Bellman-Ford算法&#xff09;。Bellman-Ford算法是一种用于在加权图中找到从单个源点到所有其他顶点的最短路径的算法。这个算法可以处理包含负权重边的图&#xff0c;但不能处理有负权重循环的…

CTFHUB-技能树-web-web前置技能-HTTP协议全

目录 1.请求方式 2.302跳转 3.Cookie 4.基础认证 5.响应包源码 1.请求方式 curl -v -X http://challenge-3022c877a8dcedeb.sandbox.ctfhub.com:10800/index.php 2.302跳转 参考链接&#xff1a;http://t.csdnimg.cn/aqdNG 301——永久性重定向。该状态码表示请求的资源已…

Springboot vue elementui 前后端分离 事故灾害案例管理系统

源码链接 系统演示:https://pan.baidu.com/s/1hZQ25cpI-B4keFsZdlzimg?pwdgw48

构造,CF862C. Mahmoud and Ehab and the xor

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 862C - Codeforces 二、解题报告 1、思路分析 非常松的一道构造题目 我们只需让最终的异或和为x即可 下面给出个人一种构造方式&#xff1a; 先选1~N-3&#xff0c;然后令o (1 << 17) …

树莓集团领航:园区运营新标杆

在当今经济飞速发展的时代&#xff0c;产业园区作为推动地方经济增长、优化产业布局的重要平台&#xff0c;其运营和管理水平至关重要。树莓集团&#xff0c;作为园区运营的政企典范&#xff0c;凭借其专业的运营能力和卓越的服务品质&#xff0c;赢得了业界的广泛赞誉。 树莓…

大模型 vs 数据资产,谁才是真正的BOSS?

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数字化时代的浪潮中&#xff0c;数据资产管理已成为企业战略中不可或缺的一环。随着数据量的激增&#xff0c;如何有效管理、利用这些数据&#xff0c;提炼其价值&#xff0c;成为了摆在每个组织面前的重大挑战。在这个背景下…

dataframe元组和字典操作

这是一个测试文件&#xff0c;今天发现一些有意思的语法&#xff0c; 首先字典是可以加入元组的 AA {"a":2,"b":23,"c":(1,2,3)} print(AA)结果如下 example1 import pandas as pd data pd.DataFrame(data {"a":(-1,-2,-3),&quo…

大数据—元数据管理

在大数据环境中&#xff0c;元数据管理是确保数据资产有效利用和治理的关键组成部分。元数据是描述数据的数据&#xff0c;它提供了关于数据集的上下文信息&#xff0c;包括数据的来源、格式、结构、关系、质量、处理历史和使用方式等。有效的元数据管理有助于提高数据的可发现…

HTML+CSS+JS 倒计时动画效果

效果演示 实现了一个倒计时动画效果,包括数字区域和倒计时结束区域。数字区域显示倒计时数字,数字进入时有动画效果,数字离开时也有动画效果。倒计时结束后,数字区域隐藏,倒计时结束区域显示,显示时也有动画效果。用户可以点击重新开始按钮重新开始倒计时。 Code <!D…

上海亚商投顾:创业板指震荡收涨 超70家ST股跌停

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡震荡&#xff0c;创业板指走势稍强&#xff0c;盘中一度涨超1%&#xff0c;黄白二线分化严重。算…

【Spring框架全系列】SpringBoot_3种配置文件_yml语法_多环境开发配置(详细)

文章目录 1.三种配置文件2. yaml语法2.1 yaml语法规则2.2 yaml数组数据2.3 yaml数据读取 3. 多环境开发配置 1.三种配置文件 问题导入 框架常见的配置文件有哪几种形式&#xff1f; 比如&#xff1a; jdbc.properties spring.properties 如果每个技术或者框架都要这么写一个配…

404错误页面源码,简单实用的html错误页面模板

源码描述 小编精心准备一款404错误页面源码&#xff0c;简单实用的html错误页面模板&#xff0c;简单大气的页面布局&#xff0c;可以使用到不同的网站中&#xff0c;相信大家一定会喜欢的 效果预览 源码下载 https://www.qqmu.com/3375.html