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

本文主要是介绍突破性技术: 大语言模型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_matrixN = 4096had_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:

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

这篇关于突破性技术: 大语言模型LLM量化激活outliers异常值抑制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029935

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言