跳转至

大模型压缩与高效推理技术深度解析

什么是训练后量化(PTQ)?与量化感知训练(QAT)的核心区别是什么?

训练后量化(Post-Training Quantization, PTQ) 是在模型完成标准浮点训练之后,直接对权重和激活值进行量化转换,无需任何额外的训练或微调。其核心流程是:使用一个小的校准数据集(通常几百到几千个样本)来统计各层激活值的数值范围,然后据此确定量化的缩放因子和零点,将浮点权重和激活映射到低比特整数(如INT8、INT4)。整个过程快速、简便,对计算资源要求低。

量化感知训练(Quantization-Aware Training, QAT) 则是在训练过程中就模拟量化的效果。在前向传播时,对权重和激活插入“伪量化”操作(模拟量化-反量化过程),使模型在训练中适应量化带来的精度损失。反向传播时,梯度绕过不可微的量化操作(使用直通估计器STE),正常更新浮点权重。训练完成后,可以直接导出为量化模型。

核心区别:

查看内嵌表格

在实际大模型部署中,由于全量微调成本过高,PTQ更为主流。通过GPTQ、AWQ、SmoothQuant等先进PTQ方法,即使在INT4精度下也能取得令人满意的结果。

GPTQ 量化方法的基本原理是什么?它基于 OBQ 做了哪些改进?

GPTQ(GPT-Post-Training Quantization)是基于最优脑量化(OBQ)框架的逐层权重量化算法,专门针对大规模生成式预训练Transformer设计。

OBQ的基本原理:OBQ将权重量化视为一个逐权重优化问题。每次量化一个权重,然后通过更新剩余未量化的权重来补偿本次量化引入的误差。这需要计算Hessian矩阵的逆,对于大模型计算量巨大。

GPTQ的改进:

  1. 逐层而非逐权重:GPTQ一次性量化一层内所有行的权重,而非逐个权重处理。将权重矩阵按行分组,批量量化,极大加速了过程。

  2. 任意顺序量化:OBQ要求按特定顺序量化权重以最小化误差。GPTQ发现对于大模型,按任意固定顺序量化与最优顺序的差异微乎其微,因此采用简单顺序,避免了复杂的排序计算。

  3. Cholesky预计算:GPTQ利用Hessian矩阵的结构,通过Cholesky分解预先计算所需的信息,在量化过程中高效更新剩余权重。

  4. 延迟批量更新:对权重更新采用批量延迟策略,减少内存访问和提高计算效率。

总体而言,GPTQ能够在几小时内完成数十亿参数模型的INT4量化,且精度损失极小,是当前最流行的LLM权重量化方法之一。

AWQ(Activation-aware Weight Quantization)是如何根据激活值分布来保护重要权重的?

AWQ 的核心理念是:并非所有权重对模型同等重要。大约1%的显著权重(salient weights)对模型性能贡献巨大,必须更精确地量化。 这些显著权重的识别依据,正是激活值的分布。

工作原理:

  1. 分析激活分布:使用校准数据集进行前向传播,统计每层输入激活值的分布。对于每个权重通道(输出通道),计算其对应激活值的平均幅度。

  2. 识别显著通道:激活值幅度大的通道,其对应的权重通道就是“显著通道”。因为这些权重处理的是大激活值,它们的微小误差也会被放大,从而严重损害模型输出。

  3. 逐通道缩放(Salient Channel Scaling):AWQ不直接量化权重,而是先对显著通道的权重进行放大(乘以一个缩放因子s > 1),同时将对应的输入激活值缩小相同的倍数(除以s)。这保持了该通道的前向输出不变(数学等价),但权重的数值范围被扩大了,使得量化时的相对误差减小,保护了重要权重。

  4. 自动搜索最优缩放因子:通过分析激活分布的统计特性和量化误差,自动搜索最佳的逐通道缩放因子,最小化量化后的整体输出误差。

AWQ通过这种“激活值感知”的缩放策略,等效于为显著权重提供了更高的量化精度,从而在INT4量化下保持了接近原始FP16的性能。

SmoothQuant 是如何通过平滑激活值来降低量化难度的?它的核心变换是什么?

SmoothQuant 旨在解决LLM中激活值存在离群通道导致的量化困难。LLM的激活值通常在某些特定通道上具有极大的幅度(比中位数大100倍以上),而其他通道正常。这些离群值如果直接量化,将导致大量正常通道的量化精度极差。

核心变换——“平滑”:

SmoothQuant 利用一个数学上等价的前向变换,将激活值的量化难度迁移到权重上:

image.png

效果:SmoothQuant 允许将LLM的权重和激活都用INT8量化,不需要昂贵的混合精度处理,在几乎没有精度损失的情况下实现显著的推理加速。

LLM.int8() 的混合精度分解是什么意思?离群特征值为什么单独用 FP16 处理?

LLM.int8() 观察到:Transformer层中,约0.1%的特征维度(通道)存在系统性离群值(数值比中位数大20倍以上),且这些离群值出现在固定的特征维度上,与输入无关。这些离群值如果用INT8量化会导致巨大误差。

混合精度分解:

  • 分离离群维度:对于每个线性层,根据激活值的统计识别出离群特征维度(通常约0.1%)。

  • 分解矩阵乘法:将原始矩阵乘法 C=AB 分解为两部分:

  • 离群维度部分:将输入 A 的离群列和权重 B 的离群行提取出来,用FP16精度计算。
  • 正常维度部分:剩余大部分维度用INT8进行高效矩阵乘法。
  • 最终输出 = INT8结果 + FP16结果(在FP16下相加)。

因为离群维度极少,FP16部分的计算开销很小(约1%)。而占计算量99%的主体部分用INT8加速,整体保持FP16的精度。LLM.int8() 证明了可以在LLM推理中安全使用INT8,精度几乎无损失。

非对称量化和对称量化各有什么优缺点?Transformer 中常用哪种?

image.png

Transformer中的实践:

  • 权重:通常使用对称量化,因为训练后的权重分布大致对称,且对称量化更高效。

  • 激活值:情况复杂。对于有ReLU/GELU的激活,分布常不对称,非对称量化更精确。但现代高效推理框架多采用对称量化,因为硬件(如GPU Tensor Core)对对称INT8矩阵乘法的支持最好。为解决激活值不对称问题,可采用SmoothQuant的平滑技术将不对称性转移到权重上。

逐通道量化和逐张量量化哪种精度更高?为什么?

逐张量量化:整个权重张量(或整个层)共享一个缩放因子。实现简单,计算最快。但当不同通道的数值分布差异大时,单一缩放因子无法兼顾所有通道,导致某些通道量化误差极大。

逐通道量化:每个输出通道拥有独立的缩放因子。能更精细地适配每个通道的分布,显著降低量化误差,精度更高。代价是需要存储更多缩放因子,并且在矩阵乘法时需要逐通道反量化,部分硬件对逐通道计算的支持较差(或需要额外处理),可能降低推理速度。

精度比较:逐通道量化精度明显高于逐张量量化。在Transformer中,权重的不同通道之间数值范围可能差异较大,因此权重几乎总是使用逐通道量化以保持精度。激活值通常使用逐张量量化,因为其分布通常较均匀,且激活值的逐通道量化实现较复杂。当激活存在离群通道时,可通过SmoothQuant转换为对权重的逐通道处理。

剪枝有结构化剪枝和非结构化剪枝,分别指什么?哪种对硬件更友好?

非结构化剪枝:以单个权重元素为粒度进行剪枝。剪枝后,权重矩阵变成稀疏矩阵(许多零值)。理论上压缩率高,但稀疏模式不规则,现代GPU难以高效处理这种随机稀疏模式(需要专门的稀疏矩阵乘法硬件支持,如NVIDIA的2:4稀疏)。通常需要结合专用库或硬件,否则加速效果有限。

结构化剪枝:以更大的结构单元为粒度,如剪掉整个神经元、整个注意力头、整个FFN层、甚至整个Transformer层。剪枝后,模型结构变得更加紧凑且规则(如矩阵维度减小),可以无需特殊硬件直接获得推理加速,因为矩阵乘法在小矩阵上同样高效。结构化剪枝对硬件极其友好,是实际部署中的主要剪枝方式。

对 Transformer 进行结构化剪枝,通常可以剪掉哪些部分?剪掉注意力头还是 FFN 神经元?

结构化剪枝主要目标:

  • 注意力头:剪掉整个注意力头(包括该头的Q、K、V投影权重和对应的输出投影部分)。多个头存在冗余,去除部分头对性能影响较小。通过评估各头的重要性(如梯度大小、输出敏感性)来决定剪除对象。

  • FFN中间神经元:剪掉FFN隐层的某些神经元(对应权重矩阵的整行/列)。FFN隐层维度通常很大(如4倍于模型维度),存在大量冗余,可剪掉相当比例而不显著影响性能。

  • 整个Transformer层:在极端压缩时,可直接移除某些层。但整层剪枝对性能影响大,需更谨慎。

  • 嵌入维度剪枝:减少词表大小或隐藏维度。

实践中,剪枝注意力头和FFN神经元是最常见、效果最好的结构化剪枝方式。两者可同时进行。通常先通过重要性评估确定全局阈值,然后一次性剪除所有不重要的结构单元,再进行少量微调恢复性能。

知识蒸馏在 Transformer 压缩中怎么用?如何设计学生模型和蒸馏损失?

知识蒸馏用大型教师模型的“软知识”来指导小型学生模型训练。

学生模型设计:

  • 缩小宽度:减少隐藏维度、FFN中间维度、注意力头数。

  • 减少深度:减少Transformer层数。

  • 混合设计:不直接使用教师模型的层数,而是设计全新的小型架构,如MobileBERT采用瓶颈结构。

蒸馏损失设计:

通常结合多种损失:

  1. 输出蒸馏损失:教师和学生模型在softmax输出的分布之间的KL散度。使学生模仿教师的预测行为。

  2. 中间层蒸馏:对齐教师和学生的中间表示(如每一层的隐藏状态或注意力矩阵)。通过MSE或余弦相似度损失,使学生学习教师的内部知识。

  3. 任务特定损失:标准的下游任务交叉熵损失。

总损失 = 任务损失 + λ1 * 输出蒸馏损失 + λ2 * 中间层蒸馏损失。

两阶段蒸馏:先进行通用的大规模预训练蒸馏(如TinyBERT),再进行下游任务微调蒸馏,更有效。

量化后的模型质量如何评估?除了困惑度,还需要关注哪些任务?

评估需多维度:

  • 困惑度:基础语言模型质量,反映量化对预测分布的整体影响。困惑度变化小通常意味着量化较成功。

  • 下游任务性能:如MMLU、HellaSwag、GSM8K等标准基准,测试模型的推理、知识、数学能力是否受损。

  • 生成质量:人工或自动评估量化模型生成的文本流畅性、连贯性、事实准确性。

  • 长文本能力:在长序列上困惑度和检索任务的性能,因为量化可能影响长距离依赖。

  • 校准误差:评估量化前后模型置信度与实际准确率的一致性。

  • 极端压力测试:对抗样本、罕见输入等,检测量化的鲁棒性。

综合这些指标,可以全面评估量化模型是否可部署。

如何将量化与 KV 缓存优化结合起来进一步压缩推理内存?

两者协同可以成倍降低推理总内存:

  • 量化KV缓存:将缓存的Key和Value张量从FP16量化为INT8甚至INT4。使用逐张量或逐通道量化。这直接减少了KV缓存本身的显存占用。

  • 结合GQA/MQA:进一步减少KV头的数量,从结构上降低缓存大小。

  • PagedAttention + 量化KV块:vLLM的PagedAttention将KV缓存分块存储,每个块可以存储量化后的K和V。推理时,从显存读取量化块,在片上反量化到FP16后参与注意力计算。由于注意力计算仍是FP16,反量化开销很小,而显存带宽压力大幅降低。

  • 量化感知的缓存淘汰策略:在缓存容量有限时,优先淘汰重要性低的token的KV(结合注意力权重判断),保留更多高质量缓存。

这种组合策略可将推理总内存(尤其是长序列多并发)降低至原来的1/4甚至更低,极大提升推理吞吐。