专栏算法工具链【LLM量化技术介绍-1】LLM量化技术概述及AWQ和GPTQ介绍

【LLM量化技术介绍-1】LLM量化技术概述及AWQ和GPTQ介绍

momo(社区版)2025-09-24
179
0

前言

近期在学习Qwen3的模型结构时,看到了Qwen使用了GPTQ与AWQ量化方案,于是便萌生了介绍LLM 量化技术的想法,笔者将用2-3篇文章,给读者们介绍大模型量化的技术。

量化是指将高精度计算的浮点型数据近似为低比特位数据(如int16、int8、int4等)的过程,此过程需在不显著损耗精度的同时,提升模型推理效率并降低内存占用。特别是在当前主流大语言模型(LLM)的参数量轻松突破万亿规模的情况下,量化技术对于高效低成本部署LLM尤为重要。而且由于LLM的参数量巨大,当前主流的模型都采用PTQ后量化技术,从而降低量化过程带来的成本。

在正式开始这篇文章之前,我们首先来了解一下LLM量化的相关概念。

LLM量化相关概念

LLM量化常用的数值格式

数值格式

说明

FP32

单精度浮点数,用 32 位表示,包括 1 个符号位、8 个指数位和 23 个尾数位,精度高但计算和存储开销大。

FP16

半精度浮点数,16 位表示,1 个符号位、5 个指数位和 10 个尾数位,计算速度快但动态范围较小。

BF16

16 位,保持与 FP32 相同的 8 位指数位,7 位尾数位,牺牲部分尾数精度换来了更大的动态范围,更适合模型训练。

FP8

  • E4M3:由1位符号位、4位指数位、3位尾数组成。它可以存储高达 +/-448 和 nan 的值;
  • 由1位符号位、5位指数位、2位尾数组成。它可以存储最多 +/-57344、+/- inf 和 nan 的值。

E4M3 能表示的精度更高,适用于权重存储、推理中间激活(分布较稳定,要求精度高); E5M2 能表示的动态范围更大,增加动态范围的代价是存储值的精度较低,适用于梯度反向传播、累积值(分布跨度大,需要更宽的动态范围)。

INT8/INT4

INT8 用 8 位表示 256 个离散整数值,INT4 用 4 位表示 16 个值。它们借助缩放因子和零点来近似浮点数,整数运算在硬件层面更高效。

LLM量化对象

在部署推理时,LLM的量化对象与传统的CNN有所不同,除了权重与激活以外,还增加了LLM特有的KV Cache。所以,LLM的量化对象主要是权重、激活和KV Cache。

  • 权重量化:仅对LLM中的权重进行量化,常见的方法有GPTQ (W4A16,权重量化为 INT4,激活保持 FP16/BF16)、AWQ(W4A16/W8A16)等;
  • 激活量化:对LLM中的激活进行量化,常见的方法有SmoothQuant (W8A8)、LLM.int8()等,由于激活分布范围大且动态变化,相比权重量化更具挑战;
  • KV Cache 量化:在 LLM 推理中,为避免重复计算,会缓存 Attention 中的 Key/Value 向量(KV Cache)。 KV Cache 的大小与 上下文长度线性相关,是长文本推理时的主要显存瓶颈。常见的方法有KV Cache INT8/INT4 量化。

LLM的实际部署过程中,常见的量化方案包括:

  • W4A16(GPTQ、AWQ) :权重量化为 INT4,激活保持 FP16/BF16。
  • W8A16 : 权重量化为 INT8,激活保持 FP16/BF16。
  • W8A8(SmoothQuant): 权重和激活均量化为 INT8。
  • KV Cache INT8 :缓解长上下文显存开销。

下面,我们将对具体的量化方法进行介绍。

主流LLM量化方法介绍

Qwen系列模型使用了AWQ、GPTQ和llama.cpp中的量化技术,且推荐使用 AWQ 结合 AutoAWQ所以本节我们先介绍此方法。

AWQ 结合 AutoAWQ量化方法介绍及使用示例

AWQ 全称为ACTIVATION-AWARE WEIGHT QUANTIZATION,即激活感知的权重量化,是一种针对LLM的低比特权重量化的硬件友好方法。AWQ在业界广泛应用,除了官方的支持llm-awq外,AutoAWQvLLMHuggingFace NVIDIA TensorRT-LLMFastChat 等主流模型或框架也提供了对AWQ的支持。

AWQ 量化技术原理

AWQ 作者认为:
  1. 权重对于大语言模型的性能并不同样重要, 有一小部分(0.1%-1%)对模型精度影响较大的关键权重;跳过这些关键权重的量化将显著减少量化精度损失。

  2. 而且,关键权重对应于较大激活幅度的权重通道更加显着,因为它们处理更重要的特征,从而根据这个现象寻找关键权重。尽管将 0.1% 的权重保留为 FP16 可以在不明显增加模型大小的情况下提高量化性能,但这种混合精度数据类型会给系统实现带来困难(硬件效率低下)。

  3. 设计了一种per-channel缩放方法来自动搜索最佳缩放,从而减少显著权重的量化误差,这种方法不存在硬件效率低下的问题。

 

PPL:即困惑度Perplexity,是语言模型预测序列的平均不确定性度量。PPL 越小,表示模型越“自信”且预测越接近真实分布;PPL 越大,说明预测分布和真实分布偏差更大。

上图是作者的实验,可以看出:

  • 左图:所有的权重都从FP16量化到INT3,PPL为43.2;

  • 中图:基于激活分布找到了1%的关键权重,将关键权重保持FP16精度,其余权重量化到INT3,PPL由43.2大幅下降至13.0,但这种混合精度格式在硬件上运行并不高效;

  • 右图: AWQ 执行per-channel缩放以保护关键权重从而减少量化误差,这里可以看到缩放weight后再做量化的PPL为13.0,缩放本身未对精度产生影响。

  权重的缩放因子s为超参数,作者在OPT-6.7B模型上做了对比实验,发现当s比较大比如等于4时,非关键通道的相对误差将会增加(非显著通道的误差将被放大)。
为了同时考虑关键权重和非关键权重,AWQ选择自动搜索最佳(每个输入通道)缩放因子,使某一层量化后的输出差最小。这就把量化问题建模为如下的最优化问题:

为提升该过程的稳定性,我们通过分析影响缩放因子(scaling factor)选择的相关因素,为最优缩放比例(optimal scale)定义了一个搜索空间(search space)。如前一部分所述,权重通道(weight channels)的显著性实际上由激活值缩放比例(activation scale)决定(即 “激活感知性”,activation-awareness)。因此,AWQ采用了一个极为简洁的搜索空间,具体如下:

其中 α 是用于平衡对关键channel与非关键channel的保护力度。通过在区间 [0, 1] 内执行快速网格搜索(grid search),可确定最优的 α 值(其中 α=0 代表不进行缩放;α=1 代表在我们的搜索空间内采用最激进的缩放策略)。此外,论文中还引入了权重裁剪(weight clipping)操作,以最小化量化过程中的均方误差(MSE)。

 

 

 

 

AWQ 量化模型示例

AWQ 与HuggingFace Transformers 无缝兼容,加载模型后可以直接 .quantize()做量化,相关使用流程如下。
安装依赖
量化模型
quant_config 参数解析:
  • "w_bit": 权重量化的位宽
  • "q_group_size":量化不是对整个权重张量做一次缩放,而是分组处理,上述示例选择每组 128 个权重会共享一组缩放因子(scale)和零点(zero point),128 是一个常用折中值(Meta 在 LLaMA-2/3 的 INT4 AWQ 中也常用 128)。
  • "zero_point":是否使用零点(zero point)补偿,如果设成 False,就是对称量化(中心对齐 0),如果设成 True,就是非对称量化,可以更好覆盖权重分布,提高精度。
  • "version": 底层推理内核类型(后端实现方式)。GEMM:通用矩阵乘法(General Matrix Multiplication),适合大模型的权重矩阵乘法。GEMV:矩阵-向量乘法(适合批次小、延迟敏感的场景)。一般推荐用 GEMM,因为推理框架(Transformers, vLLM 等)大部分优化都是基于 GEMM 内核。
加载量化后的模型进行推理

GPTQ

GPTQ(Gradient Post-Training Quantization)是一种针对类GPT大型语言模型的量化方法,它基于近似二阶信息进行一次性权重量化。本节将会介绍GPTQ量化的基本原理,同时也会展示如何通过AutoGPTQ来对您自己的模型进行量化处理。GPTQ 量化具有以下特点:

GPTQ 量化的优点:

  • 无须重新训练(仅需少量校准数据)。
  • 量化精度接近全精度,4bit GPTQ 能维持 LLaMA、OPT 等模型接近 FP16 的性能。

  • 速度快,实用性强,已成为主流 LLM 低比特推理方法。

GPTQ 量化的缺点:

  • 量化过程涉及 Hessian 矩阵近似和逐元素优化,计算复杂度较高。

  • 一般只量化权重,激活量化效果不佳(通常保持 FP16)。

GPTQ量化技术原理

GPTQ是一种高精度、高效率的量化方法,它可以在大约四个 GPU 小时内量化具有 1750 亿个参数的 GPT 模型,将位宽降低到每个权重 3 位或 4 位,与未压缩基线相比,精度下降可以忽略不计。GPTQ源于OBQ(Optimal Brain Quantization),而OBQ改进自剪枝方法OBS(Optimal Brain Surgeon),OBS又源自Yann LeCun 1990年提出的OBD(Optimal Brain Damage)。OBD通过泰勒展开简化目标函数并计算海森矩阵确定参数影响;OBS考虑参数交叉项,求海森矩阵逆确定剪枝顺序并更新其他参数减少误差。OBQ将剪枝思路推广到量化,视剪枝为近似0的特殊量化,但速度慢,大模型量化需数天。GPTQ作为OBQ加速版,优化算法性能,降低复杂度并保证精度,176B Bloom模型量化不到4小时,且有严谨数学理论推导。

GPTQ在执行量化操作时,会先对权重实施分组处理(比如,每128列划分为一个组),进而构成若干个数据块。对于每个数据块里的全部参数,会逐一开展量化工作。在完成某一个参数的量化后,借助校准数据集,对该数据块中其余还未进行量化的参数进行合理调节,通过这种方式来补偿量化过程中产生的精度损耗。GPTQ的量化过程如下所示:

前向采样数据

先用一小部分校准数据(calibration data,通常只需几百到几千条样本,比如来自模型训练语料的子集),将校准数据喂入原始全精度模型,收集每一层的 激活值(输入向量 X)

构造量化优化问题

GPTQ 的目标是 最小化量化后输出误差的二次形式

其中WX为量化前的权重和激活输入,另外一项为量化后的权重和激活。

Hessian近似

GPTQ 使用输入激活的协方差来近似 Hessian,这样就转化为公式(2)中的问题:

逐元素优化(带校正)

GPTQ 不一次性量化整个权重矩阵,而是 逐元素(或逐块)地量化权重。对每个权重,在量化时会根据 Hessian 的对角线项(近似二阶导信息)进行 误差校正,首先量化一个权重,然后更新剩余权重的“残差误差”,这相当于执行一次 逐步的高斯消元式校正,避免量化误差累积。

重复上述步骤,依次处理完一层的全部权重。然后继续到下一层,直到整个模型量化完成。

 

 

GPTQ量化使用示例

transformers 已经正式支持了AutoGPTQ,这意味着您能够直接在transformers中使用量化后的模型。

安装依赖

推荐通过安装源代码的方式获取并安装AutoGPTQ工具包:

量化模型

 

参考资料

Qwen官方文档

https://zhuanlan.zhihu.com/p/681578090

https://zhuanlan.zhihu.com/p/680212402

http://cnblogs.com/xwher/p/18788021

AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration

GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers

 

算法工具链
社区征文技术深度解析前沿技术
评论0
0/1000