当前位置: 首页 > news >正文

decoupleQ:通过将参数解耦为整数与浮点数,实现2比特后训练统一量化

温馨提示:
本篇文章已同步至"AI专题精讲" decoupleQ:通过将参数解耦为整数与浮点数,实现2比特后训练统一量化

摘要

量化在近年来被视为最具前景的压缩技术之一,可用于在各种实时应用中高效部署大型模型。考虑到权重的存储与IO占据了大模型内部绝大多数的开销,仅对权重进行量化可以带来显著的收益。然而,现有的量化方案在极低比特位下会造成显著的精度下降,或者在部署时引入额外的计算开销,因而难以应用于工业中的大规模场景。

在本文中,我们提出了 decoupleQ,在极低比特位条件下显著提升了模型精度。decoupleQ 摒弃了传统的启发式量化范式,而是将模型参数解耦为整数部分与浮点部分,从而将量化问题转化为一个带约束的传统数学优化问题,并通过现成的优化方法交替求解。通过 decoupleQ 实现的量化是线性且均匀(uniform)的,相较于非均匀的方案更加适配硬件,也使这一思想可迁移到高比特位量化中以增强鲁棒性。我们的方法已在字节跳动的大型语音模型上实现了2-bit量化,在线精度接近 fp16/bf16。代码开源于:https://github.com/bytedance/decoupleQ。

1. 引言

在工业界部署大型模型 [36, 1, 37, 2] 具有极高的预算消耗,因为其计算、IO 和存储开销巨大。因此,模型压缩 [11, 10, 16] 成为缓解这一问题的必要手段。其中,后训练量化(Post-Training Quantization, PTQ)[26, 9] 因不需要带标签数据的大规模训练,正受到越来越多研究者和工程师的关注。

在 PTQ 中,仅对权重进行量化(weight-only quantization)[19, 9] 扮演了重要角色,因为在低带宽 GPU 上对超大模型进行推理时,模型权重的存储和 IO 占据了主要开销。

然而,已有的量化方案仍然局限于传统的启发式量化范式,例如如何处理离群值 [34, 32]、如何处理敏感通道 [6]、如何确定剪裁范围 [28] 等。这些方法虽取得了一些成功,但在极低比特位下常常遭遇显著的精度下降,因此无法满足工业落地的需求。

此外,还有一些其他方法可用于缓解精度损失。例如,QuIP [4] 将2-bit量化的精度推至极限,能够达到接近 fp16/bf16 的性能。但与传统量化方案相比,它在推理阶段需额外乘以两个正交随机矩阵来反量化权重,从而带来了额外负担。

N2UQ [20] 则使用非均匀网格拟合实数值分布,并将其量化为等间距的输出等级,但它需要通过训练获取输入阈值。

SpQR [7] 和 SqueezeLLM [14] 则采用混合精度或非均匀量化来保护关键通道,但这些方法通常需要定制硬件的支持。

为了解决上述工业中的问题,我们提出了 decoupleQ。该方法彻底抛弃了传统的启发式量化范式,而是将模型参数解耦为整数部分和浮点部分,从而将量化问题转化为一个带约束的传统数学优化问题,并通过现成的优化器交替进行求解。整数部分包含模型的主要权重,而浮点部分包含通过量化引入的尺度(scale)和零点(zero point)。

decoupleQ 从一个抽象的目标函数出发,因此无需处理传统量化范式中的诸多细节问题,如离群值、显著权重 [19] 等。通过 decoupleQ 实现的量化是线性且均匀的,这使其比非均匀方法更适配硬件结构,并且可以迁移至高比特量化任务中以增强鲁棒性。

decoupleQ 包含两个阶段:

  1. 层级最小化(layer-wise minimization,定义见公式(1)),用于优化整数部分和浮点部分;
  2. 块级最小化(block-wise minimization,定义见公式(2)),在冻结整数部分的情况下进一步优化浮点部分。

层级最小化已在许多现有方法中被广泛使用 [9, 4, 8],并取得了良好效果。对于一个线性层而言,量化前后输出之间的 ℓ2\ell_22 损失最小化可表述为:
min⁡W~∥XW~−XW0∥22(1)\operatorname* { m i n } _ { \widetilde { W } } \| X \widetilde { W } - X W _ { 0 } \| _ { 2 } ^ { 2 }\quad(1) WminXWXW022(1)
其中,X∈Rbatch×dinX \in \mathbb{R}^{\text{batch} \times d_{\text{in}}}XRbatch×din 是该层的输入,W0∈Rdin×doutW_0 \in \mathbb{R}^{d_{\text{in}} \times d_{\text{out}}}W0Rdin×dout 是预训练的全精度权重,dind_{\text{in}}dindoutd_{\text{out}}dout 分别是输入维度和输出维度。目标是寻找一个矩阵 W~\widetilde { W }W,其元素是量化再反量化(quantized-then-dequantized)后的值,使得公式 (1) 的目标函数最小。

一些工作 [25, 13] 也是从公式 (1) 出发,并取得了一定成果,但它们仍然没有跳出传统量化的框架。GPTQ 系列方法 [9, 8] 会先对 W0W_0W0 中的第一个元素进行“伪量化”(fake-quantize),然后更新其余元素,以尽可能保持公式 (1) 的目标值最小。这个过程会逐个元素地进行,直到所有元素都完成伪量化。然而,这类方法存在两个问题:一方面,它们并未明确说明 scale 和 zero point 应该如何计算;另一方面,在更新其余元素时所构建的优化问题是无约束的(这将在后文详细解释)。

而 decoupleQ 将公式 (1) 建模为一个纯粹的数学优化问题,如公式 (6) 所示。它无需再关注量化中特有的一些细节问题,例如离群值、剪裁阈值等,而是从更高的层次抽象出问题的本质,并将其转化为一个带约束的数学优化问题

在第二阶段,decoupleQ 使用块级最小化(block-wise minimization),进一步提升模型精度:
min⁡∥Block(X)~−Block(X)∥22(2)\operatorname* { m i n } \| \widetilde { \mathbf { B l o c k } ( X ) } - \mathbf { B l o c k } ( X ) \| _ { 2 } ^ { 2 }\quad(2) minBlock(X)Block(X)22(2)
其中,Block(⋅)~\widetilde { \mathrm { B l o c k } ( \cdot ) }Block() 是一个带有量化权重的常见 transformer 块 [31]。在这一阶段,我们冻结权重的整数部分,仅训练 scale 和 zero 参数,以及归一化层中的参数。

decoupleQ 实现了 2-bit 的均匀量化,并在 Llama-1/2 [29, 30] 上达到了最先进的准确率。与传统的均匀量化类似,decoupleQ 不会带来额外的推理负担,仅需一个线性变换就能将量化后的权重转换为浮点数权重。

我们的主要贡献总结如下:

  • 新见解:我们放弃了传统的量化范式,不再纠结于量化特有的细节问题,而是从更高层次抽象出问题本质,并将其转化为带约束的优化问题。

  • 极低比特:decoupleQ 实现了 2-bit 的后训练均匀量化,且在字节跳动的自动语音识别(ASR)模型中,其性能接近 fp16/bf16,满足工业应用需求。

  • 可扩展性:如果具备标注数据集,decoupleQ 的思想可以方便地扩展到有监督学习中,以进一步提升模型精度,或适应下游子任务。

2. 相关工作

量化大致可以分为量化感知训练(QAT)[32, 21] 和后训练量化(PTQ)[34, 4]。本文聚焦于 PTQ 中仅对权重进行量化,并仅总结了与我们工作密切相关的部分工作。

PTQ 常用于大语言模型(LLM)的量化,因为它不需要大量带标签数据的 GPU 训练时间。然而,在传统的量化范式中,有许多量化特有的细节需要针对性地处理。AdaRound [25] 和 BRECQ [18] 从舍入操作出发,探讨向上舍入还是向下舍入更优。SqQR [7] 和 OWQ [17] 使用混合精度量化策略保护敏感参数,而 AWQ [19] 选择对敏感通道的权重进行放大,以减少对敏感通道量化的损失。OmniQuant [28] 利用梯度下降优化权重裁剪阈值和重新缩放因子。在 decoupleQ 中,我们放弃了这种拼凑式的解决方案,通过将模型参数分解为整数部分和浮点部分,将量化转化为一个有原则的传统优化问题。

GPTQ [9] 是一项有影响力的工作,它对当前权重进行量化,然后更新剩余权重以最小化量化前后层输出的 ℓ2ℓ^22 损失。正如我们后面将看到的,这种更新其实是一个近似过程,且 GPTQ 并没有对量化所带来的 scale 和 zero point 进行优化。

QALora [35] 也在一定程度上解耦了模型参数,并利用带标签的数据集微调 zero point。decoupleQ 在 PTQ 领域将这一思路更进一步,交替优化整数部分和浮点部分。

3. 方法

本节介绍 decoupleQ 的具体细节。在 decoupleQ 中,我们重点关注线性均匀量化,以提升硬件效率。

3.1. 基础知识

对于一个输入维度为 dind_{in}din,输出维度为 doutd_{out}dout 的线性层,量化将高精度权重映射到离散的量化级别,之前的方案可描述如下:
W^=clip(⌊W0−zs⌉,α,β)(3)\widehat { W } = \mathop { \mathrm { c l i p } } ( \lfloor \frac { W _ { 0 } - z } { s } \rceil , \alpha , \beta )\quad(3) W=clip(⌊sW0z,α,β)(3)

W~=W^∗s+z(4)\widetilde { W } = \widehat { W } * s + z\quad(4) W=Ws+z(4)

其中,W0∈Rdin×doutW_0 \in \mathbb{R}^{d_{in} \times d_{out}}W0Rdin×dout 是预训练的全精度权重,s 和 z 分别是缩放因子和零点(即前文所说的浮点部分),[·] 表示四舍五入到最近整数的函数,W^∈Rdin×dout\widehat{W} \in \mathbb{R}^{d_{in} \times d_{out}}WRdin×dout 是量化后的整数矩阵(即前文所说的整数部分),W~\widetilde { W }W 是反量化得到的浮点矩阵,α\alphaαβββ 分别是整数表示范围的下界和上界。例如,在2位权重量化方案中,W~\widetilde { W }W中每个元素的取值限制为集合 {−2,−1,0,1}\{ - 2 , - 1 , 0 , 1 \}{2,1,0,1} 中的一个,对应的 α=−2,β=1\alpha = -2, \beta = 1α=2,β=1。为了获得 W~\widetilde { W }W 的值,已有方法[9, 8]指出,量化前后层输出的 ℓ2\ell ^ { 2 }2 损失与模型准确率高度相关,即优化如下目标函数:
arg⁡min⁡W~∥XW~−XW0∥22=tr{(W~−W0)TH(W~−W0)}(5)\arg \operatorname* { m i n } _ { \widetilde { W } } \| X \widetilde { W } - X W _ { 0 } \| _ { 2 } ^ { 2 } = \mathrm { t r } \{ ( \widetilde { W } - W _ { 0 } ) ^ { T } H ( \widetilde { W } - W _ { 0 } ) \}\quad(5) argWminXWXW022=tr{(WW0)TH(WW0)}(5)
其中,X∈Rbatch×dinX \in \mathbb{R}^{batch \times d_{in}}XRbatch×din 是该线性层的输入,由一小部分校准数据集生成,且定义 H=XTXH = X^T XH=XTX

在极低位量化的情况下,可以通过更细粒度的分组进一步提升模型的准确度。此时,缩放因子 sss 和零点 zzz 的定义域可以表示为 Rdout×ng\mathbb{R}^{d_{out} \times ng}Rdout×ng,其中 ngngng 是组的数量,每组大小为 din/ngd_{in} / ngdin/ng。因此,公式(3)和(4)中对 ssszzz 的操作需要广播到每个组。更细粒度的分组会给推理带来额外的开销。例如,当组大小为64时,平均每个元素会额外增加0.5比特的开销(因为 ssszzz 使用的是 fp16 精度)。相比于模型准确率的提升,这样的额外开销是可以接受的。

3.2. decoupleQ

当模型被量化时,只有整数部分 W^\widehat { W }W 和浮点部分 (s,z)(s, z)(s,z)(如公式 (4) 所示)会传递给下游推理引擎,推理过程中并不需要了解 W^\widehat { W }W(s,z)(s, z)(s,z) 是如何计算的。也就是说,如果我们能够通过其他方法找到使公式 (5) 最小化的 W^\widehat { W }W(s,z)(s, z)(s,z) 的值,那么我们根本不需要使用公式 (3)。因此,我们可以将模型参数解耦为整数部分 W^\widehat { W }W 和浮点部分 (s,z)(s, z)(s,z),然后通过现成的求解方法交替优化这两部分。

decoupleQ 将求解公式 (4) 中 W^\widehat { W }W(s,z)(s, z)(s,z) 的过程视为一个与传统量化范式无关的约束优化问题!我们只需要把公式 (4) 看作是一个普通的仿射变换,其中 sss 的取值可以为 0,甚至是负数。只关注公式 (4) 而忽略公式 (3),这是 decoupleQ 与以往方法的核心区别。

在逐通道量化中,权重矩阵的每一列都是相互独立地进行优化。为了简化符号,我们后续只关注 W^\widehat { W }W 中的一列,并重新定义相关符号。基于公式 (5),decoupleQ 第一阶段的优化问题(即层级最小化)可以被表述为:
min⁡w;s,zg(w;s,z)s.t.∀i=1,2,...,dinwi−β≤0−wi+α≤0wi∈Z(6)\begin{array} { r l } & { \underset { w ; s , z } { \min } g ( w ; s , z ) } \\ & { \quad \mathrm { s . t . } \, \forall i = 1 , 2 , . . . , d _ { i n } } \\ & { \quad \quad w _ { i } - \beta \leq 0 } \\ & { \quad \quad - w _ { i } + \alpha \leq 0 } \\ & { \quad \quad w _ { i } \in \mathbb { Z } } \end{array}\quad(6) w;s,zming(w;s,z)s.t.i=1,2,...,dinwiβ0wi+α0wiZ(6)
目标函数为:
g(w;s,z)=12(w∗s+z−b)TH(w∗s+z−b)(7)g ( w ; s , z ) = \frac { 1 } { 2 } ( w * s + z - b ) ^ { T } H ( w * s + z - b )\quad(7) g(w;s,z)=21(ws+zb)TH(ws+zb)(7)
w∈Rdinw \in \mathbb { R } ^ { d _ { i n } }wRdinW^\widehat { W }W 的一列,b∈Rdinb \in \mathbb { R } ^ { d _ { i n } }bRdin是对应的 W0W_0W0 的一列,s∈Rngs \, \in \, \mathbb { R } ^ { n g }sRng 是缩放因子,z∈Rngz \, \in \, \mathbb { R } ^ { n g }zRng是零点,ng 是分组量化时的组数。与 (s, z) 相关的操作,即乘以 s 和加上 z,需要广播到每个组。在这种范式下,我们完全摒弃了传统的量化框架,而是将量化转化为一个数学优化问题(公式 (6)),通过求解该问题实现量化的目的。问题 (6) 中的 (s,z)(s, z)(s,z) 已经不再具有缩放因子和零点的传统意义,仅作为两个简单的优化变量。将传统的量化问题转化为公式 (6) 是 decoupleQ 的核心思想!完成这一思维转变后,我们便可以专注于如何利用现成的机器学习解决方法来求解这个优化问题。问题 (6) 是一个带有整数约束 wi∈Zw_i \in \mathbb{Z}wiZ 的二次规划问题。二次规划作为经典问题,已有多年研究,现有许多成熟的求解方法[24, 33]。求解过程本身并非本文的核心贡献,我们将在下一小节提供一种求解方案。

当问题 (6) 得到解决后,模型可以达到合理的精度,如实验部分所示。decoupleQ 的核心思想是将模型权重拆分为整数部分 www 和浮点部分 (s,z)(s, z)(s,z),其中整数部分承担模型的大部分表达能力。decoupleQ 思想的扩展性体现在,我们可以冻结整个模型的整数部分,利用带标签的数据训练 (s,z)(s, z)(s,z) 及其他浮点参数。这样做的优势在于,一方面能进一步提升模型的准确率,另一方面能适配特定下游子任务,同时保持模型的泛化能力。本文专注于 PTQ,因此仅使用无标签数据进行块级最小化(如公式 (2) 所示),以在解决问题 (6) 后进一步提升模型精度。

3.3. 通过交替迭代进行优化

由于非凸约束 wi∈Zw_i \in \mathbb{Z}wiZ,问题 (6) 并不容易求解。在获得良好的初始化(后文详细说明)后,我们采用交替迭代的方法交替求解整数部分 www 和浮点部分 (s,z)(s, z)(s,z)。在每一轮交替中,针对 (s,z)(s, z)(s,z) 的目标函数 (7) 是无约束的二次函数,因此 (s,z)(s, z)(s,z) 可以通过解析法直接确定:对目标函数求导并令导数为零,进而求解得到线性方程组的解。而对于整数部分 www,问题转化为:

min⁡wg(w;s,z)s.t.∀i=1,2,...,dinwi−β≤0−wi+α≤0wi∈Z(8)\begin{array} { r l } & { \underset { w } { \operatorname* { m i n } } g ( w ; s , z ) } \\ & { \; \; \mathrm { s . t . } \; \forall i = 1 , 2 , . . . , d _ { i n } } \\ & { \; \; \quad w _ { i } - \beta \leq 0 } \\ & { \; \quad \quad - w _ { i } + \alpha \leq 0 } \\ & { \; \quad w _ { i } \in \mathbb { Z } } \end{array}\quad(8) wming(w;s,z)s.t.i=1,2,...,dinwiβ0wi+α0wiZ(8)
对于公式 (8),一种解决方案是对 w 中的一个元素进行四舍五入并裁剪,使其成为区间[α,β][ \alpha , \beta ][α,β]内的整数,然后更新剩余的元素。接着,这一过程依次对所有元素进行。第 j 个元素完成四舍五入和裁剪后,更新剩余元素时的目标函数变为:
min⁡wi;i>jg(w;s,z)s.t.∀i=j+1,...,dinwi−β≤0−wi+α≤0wi∈Z(9)\begin{array} { r l } & { \underset { w _ { i } ; i > j } { \operatorname* { m i n } } g ( w ; s , z ) } \\ & { \quad \mathrm { ~ s . t . ~ } \forall i = j + 1 , . . . , d _ { i n } } \\ & { \quad \quad w _ { i } - \beta \leq 0 } \\ & { \quad \quad - w _ { i } + \alpha \leq 0 } \\ & { \quad w _ { i } \in \mathbb { Z } } \end{array}\quad(9) wi;i>jming(w;s,z) s.t. i=j+1,...,dinwiβ0wi+α0wiZ(9)
公式 (9) 同样难以直接求解,因此我们可以进行两层近似:第一层近似为:
min⁡wi;i>jg(w;s,z)s.t.∀i=j+1,...,dinwi−β≤0−wi+α≤0(10)\begin{array} { r l } & { \underset { w _ { i } ; i > j } { \operatorname* { m i n } } g ( w ; s , z ) } \\ & { \quad \mathrm { s . t . } \, \forall i = j + 1 , . . . , d _ { i n } } \\ & { \quad \quad w _ { i } - \beta \leq 0 } \\ & { \quad \quad - w _ { i } + \alpha \leq 0 } \end{array}\quad(10) wi;i>jming(w;s,z)s.t.i=j+1,...,dinwiβ0wi+α0(10)
第二层近似为:
min⁡wi;i>jg(w;s,z)(11)\operatorname* { m i n } _ { w _ { i } ; i > j } g ( w ; s , z )\quad(11) wi;i>jming(w;s,z)(11)
在这里插入图片描述

温馨提示:
阅读全文请访问"AI深语解构" decoupleQ:通过将参数解耦为整数与浮点数,实现2比特后训练统一量化

http://www.lryc.cn/news/603673.html

相关文章:

  • AI搜索SEO优化解决方案指南
  • 基于Dify构建本地化知识库智能体:从0到1的实践指南
  • 6、微服务架构常用十种设计模式
  • elememtor 添加分页功能
  • Vant:轻量可靠的移动端 Vue 组件库深度解析
  • prometheus_client 调用统计
  • HBase、MongoDB 和 Redis 的区别详解
  • Ubuntu 抽取系统制作便于chroot的镜像文件
  • P1020 [NOIP 1999 提高组] 导弹拦截
  • 动态库示例
  • 代码随想录算法训练营第三十五天
  • BGP团体属性
  • MybatisPlus-20.插件功能-通用分页实体与MP转换
  • 【IQA技术专题】纹理相似度图像评价指标DISTS
  • AAA 与 FTP:网络认证授权及文件传输的原理与实践
  • 如何在 Ubuntu 24.04 或 22.04 Linux 上安装和运行 Redis 服务器
  • Redis的持久化策略-AOF和RDB(详细图解)
  • 广告投放数据与管理全解析:从数据解读到高效运营
  • ansible 使用更高版本的python版本
  • 设计一个高可用、可拓展、监控报警系统,使用普罗米修斯和grafana,并给出go实现
  • 第2章 cmd命令基础:常用基础命令(1)
  • SQL排查、分析海量数据以及锁机制
  • 微算法科技(NASDAQ:MLGO)应用区块链联邦学习(BlockFL)架构,实现数据的安全传输
  • Java:为什么需要通配符捕获(wildcard capture)
  • 大文件的切片上传和断点续传前后端(Vue+node.js)具体实现
  • 巡台效率:精准胜勤快
  • 基于YOLOP与GAN的图像修复与防御系统设计与实现
  • 把查出来的值加上双引号,并逗号分隔
  • 宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署
  • 汇总数据(使用聚集函数)