LLM量化--AWQ论文阅读笔记

写在前面:近来大模型十分火爆,所以最近开启了一波对大模型推理优化论文的阅读,下面是自己的阅读笔记,里面对文章的理解并不全面,只将自己认为比较重要的部分摘了出来,详读的大家可以参看原文
原论文地址:https://arxiv.org/pdf/2306.00978

摘要

    在本文中,提出了激活感知权重量化(AWQ),这是一种面向硬件的LLM低比特权重量化方法。猜想基于这样一种观察结果:权重不是等同重要的,仅保护1%的显著权重就能大大的减少量化误差。然后我们提出了通过观察激活来搜索最优的每个通道的缩放因子,以保护这些显著的权重。

1.介绍

    QAT因为高训练成本效率低,PTQ在低精度的时候精确度下降的多,最接近的工作是GPTQ,这种方法采用二阶信息来进行误差补偿,但是,它在重构的过程会过拟合校准集。
在本文中,我们提出了激活感知权重量化(AWQ),我们观察到,对于LLMs的性能来说,权重并非等同重要,存在一小部分(0.1%-1%)显著权重;跳过这些显著权重的量化将显著降低量化损失。为了去找在权重中重要的那些权重参数,做了以下的实验,根据激活特征来找,根据weigt的特征来找,随机找,实验数据如下:
在这里插入图片描述
    通过观察发现,尽管我们现在正在做weight的量化,激活值分布比权重的分布更具有参考价值,对应更大激活幅度的权重通道更为显著。显著的权重找到了,我们怎么来在量化的过程中保护他们呢,假如一部分使用int4,一部分使用fp16这种混合的精度实现有难度,而且在硬件上效率很低。基于这些经验,我们设计一种通道缩放的方法,就是自动搜索适合不同通道的缩放参数,在量化的过程中来保护显著权重的量化损失。从而在全权重量化下最小量化误差。AWQ不依赖于任务反向传播或者重构过程,因此可以保持良好的泛化性,不会过拟合于校准集。
在这里插入图片描述

3.AWQ 激活感知量化

    将浮点数映射量化到更低比特,这是减少LLMs模型大小和推理成本的有效方法,在本节中,我们首先提出了一种仅基于权重量化的方法,通过保护更重要的权重来提高精度,无需训练和回归。我们开发一种data-driver的方法,搜索减少量化误差的最佳缩放。

3.1保存1%显著权重提升LLMs量化精度

    上面说到LLMs权重不同等重要,保护一部分显著权重就可以帮助弥补由于量化损失而导致的性能下降。为了验证这个猜想,做了一些对比试验:
    在figure2中,对跳过了部分权重通道的量化LLMs模型进行基准测试,其中确定权重重要性的方法采用的是查看其大小或者L2范数,我们发现,跳过较大范数的L2权重通道并没有显著的改善性能,有趣的是,基于激活值选择权重,可以很显著的提高性能。
局限性:尽管保留0.1%的权重为FP16可以在不明显增加模型大小(以总比特数计)的情况下提高量化性能,但这种混合精度数据类型会使系统实现变得困难。因此,我们需要提出一种方法来保护重要权重,而不必实际将它们保留为FP16。

3.2 通过基于激活感知缩放来保护显著权重

    我们提出了一种替代方法,通过通道级别的缩放来减少显著权重的量化误差,这种方法不会受到硬件效率问题的影响。
分析量化误差
    我们从weight only量化来分析误差,考虑到一组group/block的权重 w w w,量化运算可以写成 y = w x y=\bf wx y=wx,量化的对应项是 y = Q ( w ) x y=Q(\bf w)x y=Q(w)x,具体的量化函数如下: Q ( w ) = Δ ⋅ R o u n d ( w Δ ) , Δ = m a x ( ∣ w ∣ ) 2 N − 1 Q(\bf w)=\Delta \cdot Round(\frac{w}{\Delta}),\Delta=\frac{max(|w|)}{2^{N-1}} Q(w)=ΔRound(Δw),Δ=2N1max(∣w∣)     Δ ′ \Delta^{'} Δ是应用s后的新的缩放参数,分析上述公式, R o u n d ( w s Δ ′ ) Round(\frac{ws}{\Delta^{'} }) Round(Δws) R o u n d ( w Δ ) Round(\frac{w}{\Delta }) Round(Δw)的预期误差没有变化,以为都是四舍五入映射为整数,误差大致分布在0-0.5之间,平均误差在0.25,;(2)放大单个元素w通常不会改变这一组w的最大值,所以我们可以得到: Δ ′ ≈ Δ \Delta^{'}\approx \Delta ΔΔ,(3) 当 Δ \Delta Δ x x x都用fp16表示,则没有量化误差,式1和式2和的误差比率为
Δ ′ Δ ⋅ 1 s \frac{\Delta^{'}}{\Delta}·\frac{1}{s} ΔΔs1。给定 Δ ′ ≈ Δ \Delta^{'}\approx \Delta ΔΔ,且s>1.显著权重w的相对误差较低。
(其实为什么说放大单个元素w通常不会改变这一组w的最大值,其实这里我是不太理解的。在我看来其实好像是影响的,当s>1的时候,这一组的最大值可能会因此而改变)
为了验证这个猜想,在OPT-6.7B中将1%的显著通道应用了大于1的放缩参数s,记录不同 Δ \Delta Δ的实验值:
在这里插入图片描述    可以看到缩放显著通道十分有效,OPT的困惑度由23.54下降到了12.87,随着s的增大,可以看到其中被改动的 Δ \Delta Δ占比也在增大,但是当s<2的时候,这个占比仍然不是很多,小于5%,显著通道的relative error随着s的增大变化不大,其中最佳性能出现在s=2的时候,当s再增大的时候,困惑度会升高,这是因为当 Δ \Delta Δ升高,其中非显著通道的权重会破坏模型的精度。所以我们在保护显著权重的时候也应该顾忌到非显著权重的量化误差。(其实在这个地方我理解是作者没有区分显著权重与非显著权重,而是所有的通道都给了相同的缩放参数,当缩放参数比较小的时候,对显著权重的保护产生的精度收益高于对非显著权重影响造成的精度损伤,这个有个临界值,在文章测试s=2,这这个附近,可以取得最好的净精度收益,后续应该是针对不同的权重给予不同的缩放因子)。
搜索最佳量化参数
为了同时兼顾到显著通道权重和非显著通道权重,我们选择通过自动搜索来搜索每个输入通道所对应的缩放参数来最小化量化后的输出误差,用了下面这个公式:
在这里插入图片描述
    因为这个函数不可微,所有不能通过求导的方式来求值,所以定义了一个搜索空间来搜索这个取值,这里使用了一个比较简单的搜索空间:
在这里插入图片描述
    其中 s x s_{\bf x} sx是每个输入通道x的平均值,用了一个很简单的超参数 α \alpha α来平衡对显著通道的保护和对非显著通道的影响,我们发现最好的应用范围是[0,1],其中当为0的时候,相当于s为1,没有做放缩,当为1的时候,相当于是在我们搜索空间中进行最极端的放缩,我们也将应用权重切片来最小化量化的MSE,在表5中,我们对INT3-g128量化下对OPT进行了研究,AWQ的效果优于RTN,并且与混精(1%的FP16)有差不多的精度表现,并且它更加硬件友好。
优势
    我们的方法不依赖于回归和反向传播,这是很多量化感知训练都需要的。我们的方法对校准集依赖最小,因为我们只测量每个通道的平均幅度,从而防止过拟合,我们的方法在量化过程中需要更少的数据,并且可以保留大型语言模型在校准集分布之外的其他信息。

4.TINYCHAT:边缘端AWQ的量化应用

    AWQ可以减少大语言模型的大小,W4A16量化在内存访问和计算过程采用了不同的数据类型,因此为了实现最佳性能,其反量化必须融入主要计算循环。这给实现带来了困难,为了解决这个问题,我们推出了tinychat.

4.1为什么AWQ会加速设备端的LLM

在这里插入图片描述Context vs generation latency
    decoding生成20个tokens消耗了310ms,(感觉可以理解为profill阶段)但是summarizing 有200tokens的prompt只花了10ms,生成阶段明显比上下文阶段更慢,尤其是在设别断的互动应用中.
生成阶段是内存受限的
    为了加速生成阶段,我们在上图中进行了分析,4090 GPU的峰值计算吞吐量为165TFLOPs,内存带宽为1TB/s。因此在4090上,任何计算强度低于165的工作负载都是内存受限的。值得注意的是,在FP16执行时,设备端LLM生成阶段算术强度约为1,这凸显了工作负载的内存受限特性。由于给定模型的FLOPs是固定的,提高峰值性能是唯一方法减少总的内存流量,AWQ将权重内存减少了四倍。

4.2使用TinyChat部署AWQ

    为了证实权重Int4量化可能会带来4倍的理论峰值表现,我们设计了tintchat来加速,在GPU上,我们只关注了实现基本组件。性能表现:在GPU上,使用AWQ的tinychat与huggingface的fp16对比,在大语言各个家族的模型中实现了3倍以上的加速。在CPU上,将计算下降到c++,以达到最低化开销。
即时权重反量化
    应该注意,需要将反量化内核与矩阵乘的内核融合,避免将反量化权重写入到DRAM中。
SIMD的感知权重打包
    即时权重反量化减少中间DRAM访问,但仍然很耗时。例如,对一个4位权重进行反量化设计到一次移位,1次位与和一次FMA操作,而反量化后的权重只经过一次FMA计算,在支持向量化指令的SIMD构建CPU上,这个过程尤其昂贵。为了缓解这一问题,我们呢建议根据设备SIMD单位看度定制了一种权重打包方式。如图4所示:
在这里插入图片描述
    图4展示了我们对具有128位SIMD寄存器的ARM CPU的策略,可提供高达1.2倍的加速。在这里,每个寄存器保存32个4位权重,按w0、w16、w1、w17、…、w15、w31的顺序排列。这种方法只需要三条SIMD指令就可以解包所有32个权重,而传统的打包方式(w0、w1、…、w31)中,每个权重需要3条标量指令。一般来说,对于2^n位SIMD寄存器,相邻权重的索引将相差1/8 × 2^n,因为每个寄存器可以保存1/8 × 2^n个8位整数。在GPU上,我们发现按照(Kim等人,2022)的方法,将每8个权重打包为w{0,2,4,6,1,3,5,7}更为高效。

5. 实验

5.1 设置

量化
    在本文中专注于仅针对权重的分组量化,从pile数据集中使用了一个很小的校准集,来避免过拟合到特性的下游应用领域。使用了网格大小为20的搜索空间来搜索最佳量化参数。
模型
    在llama 和opt系列模型上进行了基准测试,在Bllom上也做了测试,但是他们通常在质量上不太好,所以研究中没有包含对他们的研究。对指令调优模型vicuna模型以及视觉语言模型openflaminggo-9b以及llava-13b都进行了基准测试。
评估
    主要研究了量化模型在wikiText-2数据集上的困惑度评估。
Baseline
    我们主要的基准是最近邻量化(RTN)。当使用小的组时,比如128的时候,他的表现非常强劲。我们还与一种最先进的方法GPTQ进行比较,用于语言模型的权重量化,对于GPTQ,我们还采用了一种使用了“重新排序”技巧的更新版本进行了比较(标记为GPTQ-Reorder或者GPTQ-R)。其他技术比如ZeroQuant,AdaRound和BRECQ依赖于反向传播来更新量化后的权重,这可能不容易扩展到大型模型尺寸;它们没有超过GPTQ,所以没有纳入研究范围。

5.2 评估

Llama模型的结果
    我们在表4中评估了量化前后的困惑度。在不同模型规模(7B-70B)和生成中,AWQ始终优于最近邻量化(RTN)和GPTQ(Frantar等,2022年)(无论是否重新排序)。
在这里插入图片描述
在这里插入图片描述Mistral/Mixtral模型的结果
    我们还评估了AWQ在Mistral和Mixtral模型上,这些模型分别属于最受欢迎的开源语言模型和Mixtureof-Experts (MoE) 模型(Jiang等,2023年;2024年)。结果表明,AWQ在Mistral和Mixtral模型上均取得了优越的性能。这表明AWQ在各种模型架构上都非常有效。
微调指令模型的量化
    指令调整可以显著提高模型的性能和可用性。我们在图5中对一个流行的指令调整模型Vicuna评估了我们方法在其性能上的表现。我们使用了GPT-4评分来评估量化模型在80个样本问题(Chiang等,2023年)上与FP16对应模型的表现。我们比较了两种顺序(量化-FP16,FP16-量化)的响应,以消除排序效应(我们发现GPT-4倾向于增加第一个输入的评分),共进行了160次试验。在两个规模(7B和13B)下,AWQ持续改善了INT3-g128量化的Vicuna模型,优于RTN和GPTQ,展示了对指令调整模型的普适性。
多模态语言模型的量化
视觉模型推理
    相比于RTN,AWQ效果更好
在这里插入图片描述
在数学或者编程任务上表现
极限低比特量化
    我们进一步将LLM量化到INT2,以适应有限的设备内存(表9)。RTN完全失败,而AWQ在GPTQ的基础上显著提高了困惑度。我们的方法与GPTQ是正交的。我们可以将我们的方法与GPTQ结合,进一步改善INT2量化性能,使其成为更实用的设置。

5.3 数据效率与泛化能力

效率更高的校准集
    我们的方法不依赖于回归和反向传播,我们的方法只需要更小的校准集。AWQ只需要更小的校准集来达到良好的量化性能。与GPTQ相比,它可以使用10倍以下更小的数据集来获得更好的困惑度。
对校准集分布稳健性

5.4 速度评估

设置:优化了线性层和不含有量化权重的层,在RTX4090和Orin进行了基准测试,用bs=1 有4个token的固定prompt,生成200个token,将中位数延迟计算为最终结果。
结果:结果。如图9(a)所示,与Huggingface的FP16实现相比,TinyChat在4090上为三个语言模型家族(Llama-2、MPT和Falcon)带来了2.7-3.9倍的加速。对于Llama-2-7B,我们通过FP16内核融合将推理速度从52个标记/秒提高到62个标记/秒。在更强大的FP16基线的基础上,我们通过快速的量化线性内核进一步获得了3.1倍的额外加速。对于Falcon-7B,官方实现在推理期间没有正确支持KV缓存,因此它比其他模型慢得多。在这种情况下,我们的FP16优化带来了更大的1.6倍加速。在只有8GB内存的笔记本电脑4070 GPU上,我们仍然能够以33个标记/秒的速度运行Llama-2-13B模型,而FP16实现无法适应7B模型。我们还展示了视觉语言模型(Lin等,2024)的加速结果,如表10所示。TinyChat在NVIDIA Jetson Orin上为VILA-7B和VILA-13B带来了约3倍的加速。值得注意的是,我们使用原生PyTorch API实现了所有AWQ模型的前向传递,此代码可在各种GPU架构上重复使用。因此,TinyChat提供了出色的可扩展性。
在这里插入图片描述和其他系统的比较

6 结论

    在这项工作中,我们提出了一种称为激活感知权重量化(AWQ)的简单而有效的方法,用于低位权重的语言模型压缩。基于权重在语言模型中的重要性不同的观察,AWQ执行每通道缩放以减少显著权重的量化损失。AWQ不会过度适配校准集,并保留语言模型在各种领域和模态中的通用能力。它在语言建模方面表现优于现有的方法,并适用于指令调整的语言模型和多模态语言模型。我们的TinyChat系统进一步将AWQ实现的理论内存节省转化为相对于Huggingface在台式机和移动GPU上的FP16实现的3.2-3.3倍速度加速,使语言模型在边缘上的部署更好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Python」基于Gunicorn、Flask和Docker的高并发部署

目标预期 使用Gunicorn作为WSGI HTTP服务器,提供高效的Python应用服务。使用Flask作为轻量级Web应用框架,快速开发Web应用。利用Docker容器化技术,确保应用的可移植性和一致性。实现高并发处理,提高应用的响应速度和稳定性。过程 环境准备:安装Docker和Docker Compose。编…

PostgreSQL 中如何处理数据的并发插入和唯一约束的冲突解决?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的并发插入和唯一约束的冲突解决一、并发插入和唯一约束的基本概念&#xf…

微服务实战系列之玩转Docker(一)

前言 话说计算机的“小型化”发展&#xff0c;历经了大型机、中型机直至微型机&#xff0c;贯穿了整个20世纪的下半叶。同样&#xff0c;伴随着计算机的各个发展阶段&#xff0c;如何做到“资源共享、资源节约”&#xff0c;也一直是一代又一代计算机人的不懈追求和历史使命。今…

bash: ip: command not found

输入&#xff1a; ip addr 报错&#xff1a; bash: ip: command not found 报错解释&#xff1a; 这个错误表明在Docker容器中尝试执行ip addr命令时&#xff0c;找不到ip命令。这通常意味着iproute2包没有在容器的Linux发行版中安装或者没有正确地设置在容器的环境变量PA…

Git 的基本命令和使用方式

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。以下是 Git 的一些基本命令和使用方式的详细说明&#xff1a; 1. 配置 Git 设置用户名和邮箱&#xff1a;git config --global user.name "你的名字" git config --global u…

Spring Boot请求参数映射:@RequestBody、@RequestParam和@RequestPart的应用

文章目录 引言I @RequestBody(接收请求体中的数据)II @RequestParam(接收任意类型的参数)3.1 接收文件类型参数和普通查询参数3.1 只接收文件参数III @RequestPart(接收文件类型参数)3.1 普通文件上传3.2 上传多个属性名相同的文件3.3 上传一个图片和一个文本域引言 @Reque…

vscode运行命令是报错:标记“”不是此版本中的有效语句分隔符。

vscode运行命令是报错&#xff1a;标记“&&”不是此版本中的有效语句分隔符。 问题解决办法如何高效地使用搜索引擎? 问题 今天试了一下,在vscode的命令行中,执行mkdir test && cd test会报错. 解决办法 在Window中,执行多条命令行,可以: mkdir test ; cd…

C++迈向精通:再看C数组与指针

再看C数组与指针 下面这段代码是合法的&#xff1a; srand(time(0));int arr[10] {0};for (int i 0; i < 10; i) {arr[i] rand() % 100;}for (int i 0; i < 10; i) {cout << i[arr] << endl;}你能明白是为什么嘛&#xff1f;如果不明白&#xff0c;那么…

HTTP背后的故事:理解现代网络如何工作的关键(二)

一.认识请求方法(method) 1.GET方法 请求体中的首行包括&#xff1a;方法&#xff0c;URL&#xff0c;版本号 方法描述的是这次请求&#xff0c;是具体去做什么 GET方法&#xff1a; 1.GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。 2.在浏览器中直接输入 UR…

算法 —— 快速幂

目录 P1045 [NOIP2003 普及组] 麦森数 P1226 【模板】快速幂 原理I 原理II P1226 代码解析 P1045 代码解析 P1045 [NOIP2003 普及组] 麦森数 本题来自洛谷&#xff1a;P1045 [NOIP2003 普及组] 麦森数&#xff0c;根据题意&#xff0c;我们可以看到本题需要计算最少2的1…

C语言程序设计实验8实验报告

1&#xff0e;实验目的 &#xff08;1&#xff09;掌握循环语句 &#xff08;2&#xff09;学习使用递归 &#xff08;3&#xff09;学习使用程序调试 2&#xff0e;实验内容、算法、流程图及主要符号说明 &#xff08;1&#xff09;用辗转相减求最大公约数的递归定义是&a…

ArkTS学习笔记_自定义组件

自定义组件学习笔记 (一)、自定义组件的基本结构 1、struct:自定义组件基于struct实现 格式: struct + 自定义组件名 + {...}简单示例: @Entry @Component struct Index {// 组件的状态 @State message: string = Hello World// 组件的UI构造方法 build() {Row() {C…

python 读取矢量图svg

在Python中读取矢量图&#xff0c;通常指的是读取如SVG&#xff08;可缩放矢量图形&#xff09;或PDF等格式的文件。对于这些格式的处理&#xff0c;Python有几个库可以做到&#xff0c;如matplotlib、cairo、inkscape的Python接口等。以下是使用matplotlib库读取SVG文件的一个…

基于JAVA的智慧社区信息管理系统设计

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

【Android高级UI】PorterDuffMode颜色混合公式

效果展示 色彩混合公式 参数说明 S&#xff0c;源图形D&#xff0c;目标图形A&#xff0c;透明度C&#xff0c;RGB色Saturate&#xff0c;饱和度

js的多线程示例

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>普通worker</title></head><body…

PingRAT:一款基于ICMP的隐蔽型C2流量转发工具

关于PingRAT PingRAT是一款基于ICMP的隐蔽型C2流量转发工具&#xff0c;该工具专为红队成员和攻防演练任务而设计&#xff0c;主要利用了ICMP Payload来实现其功能&#xff0c;该工具不仅能转发C2流量&#xff0c;而且还可以帮助广大研究人员增强C2网络通信流量传输的隐蔽性。…

基于Cpp的OpenCV4.8入门学习笔记(二)

文章目录 前言一、OpenCV图像的一些基本操作&#xff08;day 02&#xff09;16. OpenCV中提供的随机数生成17. 绘制和填充多边形&#xff0c;以五边形为例18. 鼠标事件控制绘画&#xff0c;截取ROI区域19. 图像的像素类型转换与归一化操作20. 图像的放缩与插值21. 图像的翻转&a…

(leecode学习)14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&#xff1a; 输入…

day02.08.成员运算符•二

# 成员运算符&#xff08;掌握&#xff09; # in, not in print(3 in [3,4,5]) # print("name" in "abcnamehaha") # print(name not in {"name": "ikun", "age": 30}) # 身份运算符&#xff08;了解&#xff09; # is…