压缩而不失智:LLM 量化技术深度解析

编者按: 如何在资源受限的设备上高效部署大语言模型,同时还尽可能保持其性能表现?

我们今天为大家带来的这篇文章,作者的核心观点是:量化技术通过在模型精度与效率之间寻找最优平衡点,使得大语言模型能够在资源受限的设备上高效部署,而几乎不降低其"智能水平"。

文章从量化的基本原理出发,深入剖析了训练后量化(PTQ)与量化感知训练(QAT)的适用场景,详细解释了缩放因子、零点、对称/非对称量化等关键技术细节,并进一步探讨了高级量化技术(如 GPTQ、AWQ、SmoothQuant)以及 KV 缓存量化等前沿方法。作者还结合实战经验,梳理出一套可落地的量化工作流,并展示了量化在端侧 AI、低成本云部署、长上下文处理等场景中的巨大价值。

作者 | Bhavishya Pandit

编译 | 岳扬

像我们这样的大语言模型,多少有点"养尊处优"。我们钟爱庞大的参数规模、海量的内存和强悍的 GPU。但当有人试图在手机或配备低性能 GPU 的笔记本电脑上运行我们时,现实便会毫不留情地给我们一记耳光。

工程师们如何确保我们在微型设备上依然能流畅智能地运行?

答案就是:量化技术(quantization) ------ 它是现代 AI 模型部署中的一项核心技术。

让我们花点时间,真正理解它。

01 什么是量化技术?

量化的本质在于降低数值的存储精度。 LLM的所有运算都离不开数字------每个权重参数、每次激活值、每一个注意力分数,全都建立在浮点数运算之上。这些数值流畅、连续、无限精确。

但计算机呢?它们更喜欢固定、离散的存储单元(比如整数而不是高精度浮点数)。要么你的数据能塞进去,要么就塞不进去。就像你试图把整个衣柜塞进一个登机箱一样,装得下就装,装不下就没办法。这时候,量化技术站出来说:

"嘿,大语言模型,如果每个数字不再使用 32 位精度,而是砍到 8 位,甚至 4 位呢?你几乎察觉不到差别,但我们能省下大量内存。"

32 位浮点数(FP32)→ 黄金标准

8 位整数(INT8)→ 依然智能,体积要小得多

4 位整数(INT4)→ 超紧凑,只是稍微健忘一点

好吧,但大语言模型为什么要在乎这个?

因为现在的 LLM 实在太臃肿了。数十亿参数需要数十亿个数字。一个 70B 参数的模型若用 FP32 表示,需要 280 GB------这已经不是模型了,这是存储灾难。

量化能把这种情况:"我得靠一整个服务器集群才能跑这个东西"

变成这样:"嘿,我或许能在笔记本上运行它,甚至在手机上也行!"

本质上这就是 AI 模型的瘦身方案 ------ 在保持智能的前提下剔除冗余数据。

但是,压缩数字精度不会损害模型质量吗?

有时候确实会。但量化的精髓(也是整门技术的重点)在于:

在模型最不敏感的地方降低精度

在模型最核心的地方保留准确性

02 量化在大语言模型生命周期中的位置:训练 vs 推理

在我搞清楚"量化是什么"之后,下一个问题便接踵而至:

"挺酷的,但我们到底什么时候做量化?是在训练期间?训练之后?还是两个阶段都需要?"

事实证明,时机的选择非常关键,因为大语言模型非常挑剔。你是在它们学习过程中就引入量化,还是等它们已经记牢所有模式后再量化,表现会大不相同。

2.1 训练后量化(Post-Training Quantization, PTQ)

可以把 PTQ 想象成给模型贴一张便利贴提醒:

"嘿,我要把你的某些数字四舍五入了,试着适应一下。"

你直接拿一个已经完全训练好的模型,然后进行:

  • FP32 → INT8 或 INT4
  • 可能还会用一些花哨的取整技巧

优点是:

  • 快速又便宜:无需重新训练一个 70B 参数的庞然大物
  • 易于实验:可以先试试 INT8,看模型是否撑得住,再大胆尝试更低精度

缺点是(我是吃了亏才明白的):

  • 精度可能下降:某些网络层对量化极其敏感
  • 异常值影响大:如果某个权重特别大,会破坏整个量化尺度,导致所有参数在压缩后严重失真。
  • 有时需要保留原精度层:LayerNorm、嵌入层(embedding layers)或语言模型头(LM head)可能得保持在 FP16 精度

2.2 量化感知训练(Quantization-Aware Training, QAT)

QAT 是更成熟、更系统的做法。与其等模型学完后再强迫它适应低精度,不如从一开始训练时就让它习惯。

我探索 QAT 时是这么做的:

  • 在训练过程中插入"伪量化层"(fake quantization layers):模型在学习时就看到低精度的数字
  • 使用直通估计器(straight-through estimators)让梯度正常流动,使模型能主动适应
  • 到训练结束时,权重天然具备对量化噪声的鲁棒性

优点是:

  • 最终准确率更高,尤其在极低精度(如 INT4 或 3-bit)时
  • 推理更稳定,意外更少
  • 可以进行激进量化而不丢失模型的"聪明劲儿"

缺点(我注意到的):

  • 耗时:哪怕只部分重训 7B--70B 的模型,成本也很高
  • 工程投入大:需要谨慎集成到训练流程中

如何选择(根据我的实验和阅读):

  • PTQ → 首选方案。便宜、快速,在 INT8 上效果出奇地好,配合智能取整策略,INT4 也常常有效
  • QAT → 仅当你需要最后那 1--2% 的准确率,或要做极低精度(如 4-bit 以下)量化时才用
  • 混合方案 → 先做 PTQ,同时将某些关键层回退到 FP16,再对核心层做轻量微调(近似 mini-QAT)

为什么选择在哪个阶段进行量化如此重要?

我意识到,量化不只是一个数学技巧 ------ 它会彻底改变整个部署流程:

  • 对纯推理任务,PTQ 往往胜出:显存占用更少,吞吐量更高
  • 对需要训练+部署的完整工作流程,QAT 可能更划算:最终模型更小,长上下文处理能力也更强

选择在哪个阶段进行量化的问题归根结底是:

你是想要快速、便宜、基本够用,还是谨慎、稍慢、接近完美?

03 量化技术背后的运作机制

在我搞清楚"何时"量化之后,就不得不弄明白"量化究竟是怎么实现的"。老实说,这个过程出人意料地优雅。量化的核心思想很简单:

把连续且无限精确的数字,映射到一组有限的离散值上,并尽可能保留模型的"智能"。

3.1 理解缩放因子(Scale)与零点(Zero-Point)

想象模型中的这样一个权重:

复制代码
0.8921374650012345

我们真的需要这么多小数位吗?不需要。量化技术是这样做的:

  • 选择一个缩放因子(s)→ 决定每个"区间"有多宽
  • 选择一个零点(z)→ 将我们的整数对齐到实际数据的范围

公式看起来挺花哨,但概念上其实很简单:

ini 复制代码
quantized_value = round(original_value / scale) + zero_point

当你想还原回 FP32 时:

ini 复制代码
dequantized_value = (quantized_value - zero_point) * scale

3.2 对称量化 vs 非对称量化

我发现,并不是所有量化都一样:

  • 对称量化(Symmetric quantization) → 零点为 0,区间以 0 为中心对称
    • 优点:更简单,效率极高
    • 常用于权重
  • 非对称量化(Asymmetric quantization) → 零点可调,正负范围不一定相等
    • 优点:能更好地捕捉偏态分布
    • 常用于激活值(activations),因为它们通常不是以 0 为中心的

3.3 按张量量化 vs 按通道量化:粒度很重要

起初,我尝试了按张量量化(per-tensor quantization):整个权重矩阵使用一套缩放因子和零点。很简单,但有时会出现灾难性失效。为什么呢?因为 Transformer 很挑剔 ------ 权重矩阵中有些行的数值很大,有些则很小。若整行共用一套缩放因子,结果会是:

  • 小数值被挤进同一个区间(导致精度损失)
  • 或大数值被截断(产生巨大误差)

解决方案?按通道(per-channel,即按行)量化。

  • 每一行都有自己独立的缩放因子(和可能的零点)
  • 保留了数值的相对差异
  • 与带来的收益相比,其额外的内存开销微乎其微

3.4 取整与截断:微小误差,重大影响

量化并非魔法。它会引入两类误差:

  • 取整误差(Rounding error) → 实际值与其最接近的量化区间值之间的差异
  • 截断误差(Clipping error) → 当数值超出可表示范围时被强行裁剪

像 GPTQ 或 SmoothQuant 这样的现代 LLM 量化方案,核心就是通过巧妙的取整方法或层间重平衡(rebalancing)来最小化这些误差(后面会细说)。

3.5 如何选择量化精度

这是我每天都要面对的问题:

FP32 → INT8 → INT4 → ... 我最多能压缩到多少位?

我的经验是:通常先从 INT8 开始 ------ 安全又经济,只有在采用高级取整技术时,才尝试 INT4。低于 4 比特的量化尚处于实验阶段,除非你准备好对模型进行微调,否则风险很高。

3.6 一个直观的比喻

这是我的思维模型:

  • 每个权重 = 一件衣服
  • 每个量化区间 = 行李箱里的一个隔层
  • 缩放因子 = 你的隔层有多大
  • 零点 = 第一个隔层从哪儿开始

04 量化为何有时会带来副作用

量化并非魔法 ------ 如果我们不够谨慎,它可能会微妙地破坏模型性能。这些误差主要来源于以下几个方面:

1)取整误差:将 FP32 精度的数值映射到 INT8/INT4 会引入微小的精度损失。

  • 单次误差很小,但在 Transformer 中,微小的取整误差会跨层累积。
  • 结果:导致注意力分布或词元概率发生细微变化,有时甚至会引发模型幻觉。

2)截断误差:异常值会迫使量化因子变大。

  • 这使得大多数权重被压缩到少数几个区间内 → 有效精度大幅下降。
  • 实例:LayerNorm 层中一个罕见的大激活值若被截断,就可能导致模型不稳定。

快速应对:采用百分位数法确定缩放因子,代替极值法,或对敏感层特殊处理。

3)网络层敏感度差异:并非所有网络层对量化的反应都相同:

  • 注意力投影层(Attention projections) & 语言模型头(LM head) → 高度敏感
  • LayerNorm 层 → 极度敏感,通常需保持 FP16 精度
  • MLP 层 → 中等敏感,可耐受 INT8/INT4
  • 嵌入层(Embeddings) → 中高度敏感,需要小心处理

05 高级量化技术

在经历了取整、截断和敏感网络层带来的种种挑战后,研究人员和工程师们开发出一些巧妙的方法,使得 LLM 即使在 4 位精度下也能表现出色。以下是我了解到的一些核心技术。

5.1 GPTQ:基于 Hessian 矩阵的智能取整

  • 核心思想:并非所有取整误差都同等重要。某些权重对模型输出的影响更大。
  • GPTQ 通过分析模型的二阶敏感度(Hessian 矩阵)来识别哪些权重可以安全地进行取整处理。
  • 效果:即使在大模型中,INT4 权重量化也能几乎保持原始精度。

5.2 AWQ:激活感知量化

  • 激活值与权重相互作用,如果在对权重进行取整时不考虑激活值的分布范围,可能会损害模型性能。
  • AWQ 根据激活值的统计特征来调整权重量化策略,从而降低推理过程中的误差风险。

5.3 SmoothQuant:层间平衡技术

  • 痛点:某些网络层的激活值范围过大,导致均匀量化效率低下。
  • SmoothQuant 会在不同层之间对权重和激活值进行重新缩放,但保证它们相乘后的结果(即模型的输出)保持不变。
  • 优势:实现更平滑的量化,大幅减小精度损失。

5.4 HQQ 与混合方法

  • 该方法将 Hessian 信息与混合精度或分组量化技术相结合。
  • 思路:对层中"安全"的部分使用低比特精度,而对敏感部分保留更高精度。
  • 该技术在对生产级模型进行 INT4 或更低比特量化时尤为实用。

5.5 混合精度回退机制

  • 有些网络层天生抗拒被量化。
  • 常见策略:将 LayerNorm、LM Head(语言模型输出头)以及部分嵌入层维持在 FP16 精度,其余部分则量化为 INT4/INT8。
  • 权衡:虽略微增加内存占用,却能换来模型质量的大幅提升。

06 KV 缓存量化

如果你曾尝试用大语言模型处理长上下文任务,一定对此深有体会:KV 缓存会疯狂占用内存。每个生成的词元都要为每一层保存键(Key)矩阵和值(Value)矩阵,而模型动辄拥有数十亿参数,内存很快就会被吃光。量化技术此时便派上用场。

6.1 为什么 KV 缓存很重要

  • 在解码过程中,Transformer 会为每个历史词元存储键(K)和值(V)。
  • 这样就能在计算注意力时访问所有先前词元,无需重复计算。
  • 问题在于:对于长提示词(如 8K+ 词元)和超大模型(70B+ 参数),缓存可能占用大部分 GPU 内存。

6.2 INT8/INT4 KV 缓存

  • 将键和值以更低精度(如 INT8 或 INT4)存储,可大幅减少内存占用。
  • 精度损失极小,因为注意力机制对 K/V 矩阵中的微小取整噪声具有较强的容忍度。

用一种更为直观的方式理解:注意力机制包容性强,就像听 128kbps 的歌曲 ------ 细节虽有损失,但整体旋律依旧清晰。

6.3 反量化 or 直接在整数域中进行计算

两种实现方式:

1)动态反量化(Dequant on-the-fly)

  • 在计算注意力时,将 INT8/INT4 临时转回 FP16
  • 有轻微计算开销,但内存效率高

2)在整数域中直接计算(Compute directly in integer domain)

  • 充分利用支持低精度运算的硬件(如支持 INT8 的 GPU)
  • 速度更快、内存数据移动量更少,但工程实现稍复杂

6.4 实用建议

  • 将 KV 缓存量化与分层混合精度结合使用,效果最佳。
  • INT8 KV 缓存通常很安全;若使用 INT4,建议配合高级取整策略(如 GPTQ 或 AWQ)。
  • 务必在长序列上进行测试 ------ 短上下文的基准测试无法暴露潜在的模型幻觉或词元错位问题。

07 量化技术实战工作流

在深入研究了量化的原理、误差来源和高级技巧后,我意识到真正的挑战不在于理解量化,而在于如何安全地实施它而不破坏模型。以下是我的实践方法。

7.1 准备校准数据集

在调整任何权重之前,首先准备一个体量小但具有代表性的数据集:

  • 包含 100-500 条覆盖模型典型任务的输入序列
  • 目的:记录每一层激活值的数值范围和分布形态,从而为后续的量化过程提供准确的统计依据。
  • 原因:如果推理时的激活值分布与校准数据偏差过大,INT4 量化可能会失败

7.2 逐层确定精度

并非所有网络层都能同等程度地适应 INT4 精度:

  • MLP 层和大多数注意力权重 → 采用 INT4
  • 嵌入层 → 若存在风险则采用 INT8
  • LayerNorm、LM Head 及有时首个投影层 → 回退至 FP16 精度

7.3 执行量化操作

  • 首先进行训练后量化(PTQ),通常将所有权重转为 INT8,检查模型输出
  • 然后使用 GPTQ 或 AWQ 逐步将 MLP /注意力层降至 INT4
  • 始终将敏感网络层保持在 FP16 精度

此阶段是迭代过程:应用量化 → 测试 → 调整网络层精度

7.4 评估与调试

这是理论照进现实的环节:

  • 使用真实场景的提示词进行测试,而非仅依赖基准数据集
  • 检查是否出现幻觉、词元错位或推理能力下降
  • 若某网络层表现异常,可选择性地恢复其精度或尝试按通道缩放

7.5 微调(可选步骤)

对于激进的低比特量化(如 INT4、混合 3-4 位量化),有时需要进行轻量级的量化感知微调:

  • 在校准数据上训练几个 epoch
  • 让模型适应量化引入的噪声
  • 通常能将 INT4 的性能表现提升至接近 FP16 水平

7.6 部署就绪

当量化稳定后:

  • KV 缓存也进行量化(INT8/INT4),提升内存效率
  • 对那些被特意保留为较高精度的层,已采取保护措施
  • 模型已通过长上下文任务测试

最终成果:内存占用更小,推理速度更快,精度损失微乎其微。当第一次看到 70B 参数的模型在单张 GPU 上流畅运行时,那种感觉堪称神奇。

08 应用场景

  • 端侧 AI(On-Device AI) :量化让我能直接在笔记本、边缘设备甚至手机上运行大语言模型。过去需要多卡 GPU 服务器的模型,如今单张 GPU 就能装下,让 AI 能够进行实时交互,摆脱云端延迟。我用它来做笔记、进行代码补全、当离线聊天助手 ------ 就像把一台超级计算机装进了背包里。
  • 高性价比的云端部署(Cost-Efficient Cloud Deployment) :即使在云端,量化也能大幅降低 GPU 内存占用,使单个节点能够服务更多用户,大幅节省运维成本。例如,如果一个 13B 模型在 INT4 精度下的表现几乎与 FP16 相当,但 GPU 内存占用减少了一半,这样使得预算有限的团队也可以部署高性能的 LLM。
  • 长上下文应用(Long-Context Applications) :通过降低 KV 缓存的内存占用,使得处理长文档成为可能。借助 INT8 或 INT4 的 KV 缓存,我成功实现了整本书籍的摘要生成、分析法律合同,甚至维持数小时的连续对话而不会爆内存。这让虚拟助手、教学系统和摘要工具能无缝处理超长上下文。
  • 多模型协作流水线(Multi-Model Pipelines) :量化模型在混合流水线中表现尤为出色。我经常用小型 INT4 模型做初步筛选或生成初始建议,再将结果交给更大的模型进行最终推理。若无量化技术,并行调度多个模型会很容易超出内存限制。而现在,就像在一台机器上部署了一整个 AI 专家团队。
  • 研究与实验(Research and Experimentation) :最后,量化技术让实验变得更快速、更便宜。我可以在消费级 GPU 上迭代新架构、测试模型消融实验或微调模型,无需等待昂贵的专用硬件。这极大加速了我们的学习与实验进程,让大模型研究变得更加触手可及。

END

本期互动内容 🍻

❓你觉得未来大模型会默认以量化形式发布,还是保留"原始精度+按需量化"的模式?

本文经原作者授权,由 Baihai IDP 编译。如需转载译文,请联系获取授权。

原文链接:

bhavishyapandit9.substack.com/p/deep-dive...

相关推荐
小明的小名叫小明1 小时前
区块链核心知识点梳理(面试高频考点3)-共识机制详解(POW、POS、POH)
面试·区块链
阿正的梦工坊1 小时前
R-Zero:从零数据自进化推理大语言模型
人工智能·算法·语言模型·大模型·llm
漫长的~以后1 小时前
全模态交互革命:阿里Qwen3-Omni-Flash深度解析,拟人化AI的奇点已至
人工智能·交互
星期一研究室1 小时前
收藏夹救星!把 1000+ 灰尘链接变成你的知识资产
人工智能·aigc·deepseek
磊磊落落2 小时前
编写一个 VS Code 扩展:将 Copilot 支持的大模型通过 REST API 方式暴露出来
人工智能
格林威2 小时前
多相机拼接:消除重叠区域的6个核心方法,附OpenCV+Halcon实战代码!
人工智能·数码相机·opencv·计算机视觉·机器人·视觉检测·制造
小白量化3 小时前
聚宽策略分享-1年化98国九条后中小板微盘小改
大数据·数据库·人工智能·量化·qmt
张拭心7 小时前
Cursor 又偷偷更新,这个功能太实用:Visual Editor for Cursor Browser
前端·人工智能
吴佳浩8 小时前
大模型 MoE,你明白了么?
人工智能·llm