【量化部署】AWQ in MLSys 2024

news2025/1/1 21:37:02

一、引言

论文: AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration
作者: MIT
代码: AWQ
特点: 该方法是一个仅量化权重的方法(W4A16),AWQ认为只有极少部分(1%)模型权重是十分重要的,在量化时应该着重保护它们。AWQ根据校准数据输入模型后得到的激活值的量级来锁定重要权重,通过放大这些权重来实现对他们的保护,放大因子是对应激活量级的 α \alpha α次方。

二、详情

2.1 量化与反量化

最常规的量化是将浮点数除以一个值并四舍五入取得指定范围内的整数,公式如下:
quantify ( w ) = Round ( w Δ ) ,   Δ = max ⁡ ( ∣ w ∣ ) 2 N − 1 \text{quantify}(\textbf{w})=\text{Round}(\frac{\textbf{w}}{\Delta}),~\Delta=\frac{\max{(|\textbf{w}|)}}{2^{N-1}} quantify(w)=Round(Δw), Δ=2N1max(w)

其中, N N N是量化后的位数,例如从FP16量化到INT4,那么 N = 4 N=4 N=4。该量化过程的示意图如下:

我们可以举一个例子,假设FP16的待量化权重最大最小值分别为-120.56和2.5,要将其量化至INT4范围 [ − 8 , 7 ] [-8,7] [8,7]的整型上,则有:
quantify ( − 120.56 ) = Round ( − 120.56 max ⁡ ( ∣ − 120.56 ∣ , ∣ 2.5 ∣ ) 2 N − 1 ) = − 8 quantify ( 2.5 ) = Round ( 2.5 max ⁡ ( ∣ − 120.56 ∣ , ∣ 2.5 ∣ ) 2 N − 1 ) = 0 \text{quantify}(-120.56)=\text{Round}(\frac{-120.56}{\frac{\max{(|-120.56|,|2.5|)}}{2^{N-1}}})=-8\\ \text{quantify}(2.5)=\text{Round}(\frac{2.5}{\frac{\max{(|-120.56|,|2.5|)}}{2^{N-1}}})=0 quantify(120.56)=Round(2N1max(120.56∣,∣2.5∣)120.56)=8quantify(2.5)=Round(2N1max(120.56∣,∣2.5∣)2.5)=0

由于AWQ仅对权重做量化,因此上层输出的FP16的激活值需要先经过量化才能与权重进行数学运算,运算得到的值可能已经超出INT4的表示范围,因此需要反量化至真实值,然后再做INT4量化得到输出,示意图如下:

反量化的公式如下:
dequantify ( w ) = Δ ⋅ Round ( w Δ ) ,   Δ = max ⁡ ( ∣ w ∣ ) 2 N − 1 \text{dequantify}(\textbf{w})=\Delta\cdot\text{Round}(\frac{\textbf{w}}{\Delta}),~\Delta=\frac{\max{(|\textbf{w}|)}}{2^{N-1}} dequantify(w)=ΔRound(Δw), Δ=2N1max(w)

其实就是记录量化时的缩放因子 Δ \Delta Δ,在反量化时乘上它。
dequantify ( − 120.56 ) = max ⁡ ( ∣ w ∣ ) 2 N − 1 × quantify ( − 120.56 ) = 120.56 8 × − 8 = − 120.56 dequantify ( 2.5 ) = max ⁡ ( ∣ w ∣ ) 2 N − 1 × quantify ( 2.5 ) = 120.56 8 × 0 = 0 \text{dequantify}(-120.56)=\frac{\max{(|\textbf{w}|)}}{2^{N-1}}\times\text{quantify}(-120.56)=\frac{120.56}{8}\times -8=-120.56\\ \text{dequantify}(2.5)=\frac{\max{(|\textbf{w}|)}}{2^{N-1}}\times\text{quantify}(2.5)=\frac{120.56}{8}\times 0=0\\ dequantify(120.56)=2N1max(w)×quantify(120.56)=8120.56×8=120.56dequantify(2.5)=2N1max(w)×quantify(2.5)=8120.56×0=0

-2.5经量化和反量化后得到0,可见量化是有误差的,产生的主要原因在于 Round ( ⋅ ) \text{Round}(\cdot) Round()操作不可逆。

为帮助理解,下面给出一个INT8量化时,矩阵的运算过程:

⚠️ 图中例子 Δ \Delta Δ的计算公式为 Δ = max ⁡ ( ∣ w ∣ ) 2 N − 1 − 1 \Delta=\frac{\max{(|\textbf{w}|)}}{2^{N-1}-1} Δ=2N11max(w),与AWQ论文中的略有不同。

2.2 选取重要权重

了解了量化和反量化过程,接下来就要确定我们对什么进行量化。AWQ是对权重进行量化并保护重要权重,有些其他方法会同时对激活值和权重量化。

首先,AWQ说明了保留1%的重要权重不做量化能够减少量化误差。

如上图,PPL是一个衡量指标(越低越好),可见保持1%的重要权重不变(不做量化,仍为FP16),PPL更低,从而证明保留1%的重要权重能够减少量化误差。

其次,AWQ说明了这1%的重要权重可以根据激活值的量级来选取。

如上表,右侧三大列是分别保存0.1%、1%、3%时根据激活值量级、权重量级、随机选取时的PPL。与完全不做量化的FP16那一列相比,损失最低的是根据激活值量级选取的权重量化策略。

之所以可以根据激活值的量级选取,是因为有些重要的激活值的量级很大,它们对模型来说很重要,因此与之对应的权重也就很重要。

如上图,激活值在某些通道上会有极大的幅值(量级)

2.3 保护重要权重

但是,如果我们保持重要权重为FP16,其他权重被量化为INT4,这就导致系统在执行矩阵运算时需要单独执行两个部分的运算,即混合精度,这会降低运算效率。

于是,AWQ提出放大重要权重然后统一执行INT4量化,从而起到保护重要权重又不影响运算效率的作用。

AWQ对放大能够降低量化误差做了简单的证明,假设不放大时的量化+反量化公式如下:

这里的 w \textbf{w} w是指多个通道中的权重最大值,例如128个通道的权重(原文中称其为一组)。

则对于一个通道的权重来说,量化误差为:

其中 Δ \Delta Δ x x x都是FP16的,因此需要反量化后才能进行运算。

最原始的计算公式应该是 w ⋅ x w\cdot x wx,如果我们对 w w w进行放大,并对 x x x进行缩小,能够得到相同的结果,即 w ⋅ x = ( w ⋅ s ) ⋅ ( x ⋅ 1 s ) w\cdot x=(w\cdot s)\cdot (x\cdot \frac{1}{s}) wx=(ws)(xs1)。于是,我们可以得到将 w ⋅ s w\cdot s ws视为 w w w,将 x ⋅ 1 s x\cdot \frac{1}{s} xs1视为 x x x时的量化误差:

其中, Δ ′ \Delta^{\prime} Δ是对某通道进行放大后的一组通道的最大值(可能仍然等于 Δ \Delta Δ)。

由于 RoundErr ( ⋅ ) \text{RoundErr}(\cdot) RoundErr()所产生的误差始终在 [ 0 , 0.5 ] [0,0.5] [0,0.5]之间,因为四舍五入只会产生这么多误差,所以其平均误差为0.25。无论是 RoundErr ( w Δ ) \text{RoundErr}(\frac{w}{\Delta}) RoundErr(Δw)还是 RoundErr ( w ⋅ s Δ ′ ) \text{RoundErr}(\frac{w\cdot s}{\Delta^{\prime}}) RoundErr(Δws)产生的平均误差都一样。所以放大与不放大的误差比为:

Δ ′ \Delta^{\prime} Δ是对某通道进行放大后的一组通道的最大值,通常还是等于 Δ \Delta Δ。例如,我们有两个通道的权重值为 [ [ 0.1 , 0.2 , 0.3 ] , [ 0.5 , 0.6 , 0.7 ] ] [[0.1,0.2,0.3],[0.5,0.6,0.7]] [[0.1,0.2,0.3],[0.5,0.6,0.7]],我们对第一个通道进行2倍的放大,于是有 [ [ 0.2 , 0.4 , 0.6 ] , [ 0.5 , 0.6 , 0.7 ] ] [[0.2,0.4,0.6],[0.5,0.6,0.7]] [[0.2,0.4,0.6],[0.5,0.6,0.7]],此时放大前后的最大值都还是0.7,所以有 Δ ′ ≈ Δ \Delta^{\prime}\approx\Delta ΔΔ

因为, Δ ′ ≈ Δ \Delta^{\prime}\approx\Delta ΔΔ s > 1 s>1 s>1(放大 w w w),所以放大操作能使量化误差降低。

2.4 搜索放大因子 s s s

理论上,我们只需要选取一个大于1的 s s s即可做到对重要权重的保护,但其实并非所有大于1的 s s s值都有利于降低量化误差。

如上表,取不同的 s s s可能产生不同的性能表现。

于是,AWQ提出引入校准集帮助搜索放大因子,这样在推理时就可以直接使用事先确定的放大因子 s s s进行重要权重的保护。

AWQ以量化+反量化权重与不量化权重乘上校准集 X \textbf{X} X之间的误差为目标,进行 s s s的网格搜索。

但是,这种搜索需要事先指定一个 s s s的集合,这对人工的经验要求过高,于是AWQ提出根据校准集激活值各通道的平均量级来确定 s s s,于是有:

其中, s X \textbf{s}_\textbf{X} sX就是校准集激活值各通道的平均量级,即校准集 X \textbf{X} X进入模型后得到激活值,然后求激活值的各个通道的幅值的平均值。

但是这个平均值 s X \textbf{s}_\textbf{X} sX并不一定大于1,所以AWQ给 s X \textbf{s}_\textbf{X} sX加了一个 α \alpha α的指数项( α ∈ [ 0 , 1 ] \alpha\in[0,1] α[0,1]),最终将 s X α {\textbf{s}_\textbf{X}}^{\alpha} sXα确定为放大因子。

于是,我们可以在 [ 0 , 1 ] [0,1] [0,1]的范围内对 α \alpha α进行最小误差的搜索,确定之后即可得到最终的放大因子 s s s

  • 校准集对放大因子的质量有直接影响,因此一般所使用的校准集需要具有较高的多样性。
  • 由于AWQ并不需要进行梯度传递,只是使用校准集进行 s s s的搜索,所以它不会在校准集上过拟合,具有更高的通用性。

致谢:

本博客仅做记录使用,无任何商业用途,参考内容如下:
模型量化一:量化基础 对称量化 非对称量化 极大值量化 零点量化
大模型量化一网打尽

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

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

相关文章

Python基础—Python 中pip的8个必备命令

在Python开发中,pip是一个非常强大的包管理工具,用于安装和管理Python包。下面我将介绍8个pip的必备命令,并通过代码示例来讲解它们。 1. 安装包 pip install package_name这个命令用于安装指定的Python包。例如,要安装requests…

数据结构排序——快排的递归与非递归

1.霍尔排序(递归方法) 这个是将右边找到比key小的数字,之后让左边找到比key大的数字,让左右的交换,如果相遇就会停止,让key与他们停止的位置进行交换,这时,交换的位置一定比key小&a…

【Git 学习笔记_24】Git 使用冷门操作技巧(四)——更多实用 git 别名设置、交互式新增提交

文章目录 11.8 更多别名设置别名1:只查看当前分支(git b)别名2:以图表形式显示自定义格式的 git 日志(git graph)别名3:查看由于合并分支导致的冲突后仍有冲突的、待合并的文件列表(…

node快速复制文件或文件夹,排除部分文件(node_modules)

const fs require(fs) const path require(path)/*** description: 获取完整的文件路径* param {*} url 路径* return {*} 返回完整的文件路径*/ const getPath (url) > {return path.join(__dirname, url) }/*** description: 获取参数* return {*} target【目标文件夹】…

Redis应用之Feed流关注推送

我的博客大纲 我的后端学习大纲 -------------------------------------------------------------------------------------------------------------------------------------------------# 3.好友关注: 3.1.关注和取关: a.接口说明: b.编…

算法【Java】 —— 前缀和

模板引入 一维前缀和 https://www.nowcoder.com/share/jump/9257752291725692504394 解法一:暴力枚举 在每次提供 l 与 r 的时候,都从 l 开始遍历数组,直到遇到 r 停止,这个方法的时间复杂度为 O(N * q) 解法二:前…

不会Excel怎么制作桑基图?用什么软件绘制比较好呢?推荐2款简单好用的图表制作工具

桑基图制作很简单,不需要任何基础一次就会! 2个桑基图制作工具,帮你一键解决问题~ 1、Dycharts 推荐指数:☆☆☆☆☆ 点击链接直达>>dycharts.com Dycharts是国内一款专业的在线图表制作工具,0代码、无门槛&…

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****&a…

AI基础 L5 Uninformed Search II 无信息搜索

How good is search? • Completeness: Does it always find a solution if one exists? 是否通解 • Optimality: Is the solution optimal (i.e., lowest cost)? 是否最优 • Time Complexity: How long does it take to find a solution? 时间多久 • Space Complexit…

程序员都在使用的画图工具

大家好,我是袁庭新。 程序员都在使用的画图工具,你一定没用过这款画图工具吧!我教程中的架构图都是用它来画的。 比如我编写的RDB工作原理图就是用draw.io绘制的,如下图所示: 再例如Redis集群故障恢复原理图我也是通…

【论文阅读】DETRs Beat YOLOs on Real-time Object Detection

文章目录 摘要一、介绍二、相关工作2.1 实时目标检测器2.2 端到端目标检测器 三、检测器的端到端速度3.1 分析 NMS3.2 端到端速度基准 四、实时 DETR4.1 模型概述4.2 高效混合编码器4.3不确定性最小的查询选择4.4 缩放的RT - DETR 五、实验5.1 与SOTA对比5.2 混合编码器的消融研…

VMware Fusion Pro 13 for Mac虚拟机软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装安装完成!!! 效果 一、下载软件 下载软件 地址:www.macfxb.cn 二、开始安装 安装完成!!!

F12抓包06-4:导出metersphere脚本

metersphere是一站式的开源持续测试平台,我们可以将浏览器请求导出为HAR文件,导入到metersphere,生成接口测试。 metersphere有2种导入入口(方式),导入结果不同: 1.导入到“接口定义”&#xf…

ctfshow-web入门-sql注入(web237-web240)insert 注入

目录 1、web237 2、web238 3、web239 4、web240 1、web237 查询语句: //插入数据$sql "insert into ctfshow_user(username,pass) value({$username},{$password});"; 我们需要闭合单引号和括号 添加,查数据库名,payload&…

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户: 在OPPO手机中格式化存储卡后可以恢复图片吗?我删除了 OPPO上的视频和图片,我感觉很糟糕,因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…

解锁2024年PDF转PPT新技能,TOP4神器在手,职场晋升竟然如此简单

如今职场节奏快,信息传递和展示方式多样。PDF 兼容性强且稳定,用于分享和保存文件;PPT 演示功能强大,在开会、教学和汇报中不可或缺。实际工作中常需将 PDF 转 PPT,以便更好地演示和编辑。市场上因此出现众多高效方便的…

使用NetBackup GUI 图形化进行oracle备份和恢复

转载 一、环境介绍: 这个实验都是在vmware workstation里完成的。由于NetBackup7只能装在64位的系统上,所以这里采用了64位的rhel5.5系统,以及oracle 10gr2 for linux_x64的软件包。数据库的数据文件存储在ASM中。安装rhel、oracle、netback…

Selenium 实现图片验证码识别

前言 在测试过程中,有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试,怎么做图片验证码识别?本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk:1.8 tessdata&…

关于CPP——std::future异步操作

目录 一、std::future 简介 1.1 概念 1.2 应用场景 1.3 关联的方法 1.3.1 std::async 1.3.2 std::package 1.3.3 std::promise 二、future 用法 2.1 使用std::async关联异步任务 2.2 使用std::packaged_task 1. 获取任务结果的机制: 2. 异步任务的管理&a…

jmeter之仅一次控制器

仅一次控制器作用: 不管线程组设置多少次循环,它下面的组件都只会执行一次 Tips:很多情况下需要登录才能访问其他接口,比如:商品列表、添加商品到购物车、购物车列表等,在多场景下,登录只需要…