量化是一种关键策略,用于优化大型机器学习模型(特别是深度神经网络),使其在资源受限的硬件(如移动设备、边缘设备,或为了云端的快速推理)上部署得更加高效。

什么是量化?

量化是指降低用于表示模型参数(权重)和激活值的数值精度的过程。

它不再使用 32 位浮点数(FP32),而通常采用更低精度的格式,例如 16 位浮点(FP16)、8 位整数(INT8)甚至更低。

把 FP32 → INT8/INT4/FP4 等低 bit 类型。

什么要对大型模型进行量化?

大型模型(LLMs)在推理过程中会消耗大量的内存和计算资源。而量化之后的模型可以实现以下功能:

  • 缩小模型体积: 低精度数值占用更少内存。
  • 加速推理: 许多硬件加速器(CPU、GPU、NPU)对低精度数据的处理速度更快,因为定点运算相比浮点运算通常更简单、更快。
  • 降低功耗: 由于量化后的数据占用的存储空间更小,计算量和内存访问减少,能耗随之降低。
  • 实现边缘部署: 许多硬件设备(如专用的 AI 芯片、GPU 等)对低精度计算提供了专门的硬件优化,可以高效地处理量化后的神经网络运算,因此可以在资源受限的设备上运行大型模型。

量化原理

量化的基本原理,即把模型的参数(weights)等从浮点数(如float32)转换为定点数(如int8)。在计算时,再将定点数据反量化回浮点数据。

量化的两个重要过程,一个是量化(Quantize),另一个是反量化(Dequantize)

  • 量化就是将浮点型实数量化为整型数(FP32->INT8)
  • 反量化就是将整型数转换为浮点型实数(INT8->FP32)

量化类型(Quantization Type)

那么具体是如何转换数值的呢?通常有以下两种转换方式:

类型 子类 特点与适用场景
线性量化 对称量化 零点为0,适合权重,计算高效,硬件友好。
非对称量化 引入零点(zero-point),适合激活值,精度高但计算复杂。
非线性量化 如对数量化、矢量量化、查找表量化等,适用于极端压缩或非均匀分布数据。

不同的方法使用不同的量化公式,得到不同的量化参数:

  • ⚖️scale
  • 0️⃣zero-point

具体的会在数学篇进行介绍(先挖一个坑,后面填吧)

量化策略(Quantization Strategies)

训练前后

从训练视角来看,我们可以在模型的训练前或训练后进行量化,据此可以分为以下几种:

策略 阶段 是否需要重训练 精度 适用
PTQ (Post-Training Quant.) 训练后 稍低 快速部署
QAT (Quant.-Aware Training) 训练中 极致精度
QAF (Quant.-Aware Fine-tuning) 微调阶段 中高 资源有限

1.训练后量化(PTQ) :在不重新训练的情况下,对已训练好的模型进行量化。

2.量化感知训练(QAT):在训练过程中模拟量化,并更新量化参数。

  • 通常比 PTQ 精度更高,特别适用于大型或复杂模型。
  • 计算开销更大,因为需要重新训练。

3.量化感知微调(QAF):从一个已训练好的 FP32 模型出发,在模拟量化的同时进行少量微调,使权重适应低比特表示。

  • 在 PTQ 与完整 QAT 之间取得折中:比从头训练快得多,但通常比 PTQ 恢复更多精度——尤其当原始 PTQ 出现明显下降时。

推理前后

从推理视角来看,根据量化过程在推理前后,可以分为:

分类 说明 子类 子类说明
离线 推理前量化 静态 用校准集一次性算好量化参数
动态 每次前向实时算激活值
在线 推理时量化

1.离线量化上线前完成全部量化,即提前确定好激活值的量化参数 $ S $ 和 $ Z $,在推理时直接使用。

  • 比如之前我们提到PTQ,是离线量化里最常见的实现方式。在大多数情况下,离线量化指的就是PTQ。

离线量化 ≈ PTQ(Post-Training Quantization)

  • 离线量化又可以细分为:

    • 静态量化(Static Quantization):同时量化权重和激活值,推理前用校准数据集一次性算好量化参数。

    因为属于离线量化之PTQ,所以也叫静态离线量化(PTQ-Static)

    • 动态量化(Dynamic Quantization):仅量化权重,激活值在推理时实时量化。

    因为属于离线量化之PTQ,所以也叫动态离线量化(PTQ-Dynamic)

2.在线量化推理时才量化,即在推理过程中动态计算量化参数 $ S(scale) $ 和 $ Z(zero-point) $。

量化对象和量化层级

根据量化的对象的不同,可以分为不同的层级:

  • 权重量化(Weight Quantization): 仅量化模型权重。

因为只量化权重,也称为weight-only quantization

  • 激活量化(Activation Quantization): 也对各层输出(激活值)进行量化。
  • 梯度量化(Gradient Quantization): 训练时对梯度进行量化以减少通信开销。
  • KV缓存量化(KV Cache Quantization): 对注意力中的KV缓存进行量化以降低显存占用。
  • 偏置量化(Bias Quantization): 有时也对偏置进行量化,但通常保持较高精度。

也就是说,在模型量化过程中,量化可以应用于模型的多个部分,包括:

  • 模型参数(weights):如权重矩阵,这些是模型训练过程中学习到的参数。
  • 激活值(activations):如神经元的输出值,这些值在前向传播过程中动态生成。
  • 梯度(gradient):如反向传播过程中计算的梯度值,用于更新模型参数。
  • KV Cache:在 Transformer 的自回归解码阶段,KV Cache 用于缓存每一层的键(Key)和值(Value)张量,以避免重复计算,从而显著提升长序列生成的效率。
  • 偏置(Bias):指模型中各层加性偏置项(如线性层、卷积层后的 bias)。由于偏置参数量远小于权重(百万级 vs 十亿级),其对整体模型大小的影响有限,因此通常不量化或仅使用较高精度(如 INT16或 FP16),仅在极端压缩需求下(如边缘设备部署),才考虑与权重一并量化至 INT8。
量化对象 是否常被量化 量化方式举例 备注
模型参数(weights) INT8/INT4,对称或非对称量化,GPTQ/AWQ 等 直接决定模型大小与推理速度
激活值(activations) 动态或静态量化,per-token/per-tensor 显著降低显存,需校准分布误差
梯度(gradient) / 可选 2–8 bit 均匀量化,Top-K 稀疏化 主要用于训练加速与分布式通信压缩
KV Cache INT8/INT4,混合精度保留关键 token 显著降低显存,提升吞吐
Bias 通常否 保留为 FP16/INT16,极端场景下低比特量化 参数量小,量化收益低

量化粒度(Granularity)

粒度 解释 适用对象
per-tensor / per-layer 整层共享一个 scale & zero-point 通用
per-channel 每个输出通道各自 scale 权重
per-token 每个 token(行)各自 scale 激活
per-group / sub-channel 每连续 N 个元素为一组 scale 权重/激活
  • 逐层量化(per-tensor):整个层的所有权重使用相同的缩放因子 $ S $ 和偏移量 $ Z $。
  • 逐通道量化(per-channel):每个通道单独使用一组 $ S $ 和 $ Z $。
  • 逐组量化(per-group):将权重按组划分,每个组使用一组 $ S $ 和 $ Z $。
  • 逐 token 量化(per-token):对输入序列中的 每一个 token(即矩阵的每一行) 单独计算并使用一组缩放因子 S 和偏移量 Z

量化位宽

根据存储一个权重元素所需的位数,可以分为8bit量化、4bit量化、2bit量化和1bit量化。

位宽 特点与适用场景
8-bit 最常用,精度损失小,广泛支持(INT8/FP8)。
4-bit 极限压缩,适合大模型部署(如 AWQ、GPTQ)。
2-bit 极端压缩,精度损失大,需配合误差补偿机制。
1-bit 极限压缩,仅限特定任务或研究使用(如 BNN)。

对象×位宽组合

根据量化对象和量化位宽的不同组合,可以分为:

方案 组合名 含义 示例
仅权重 W8A16 权重8bit,激活16bit(未量化,保持原精度)
W4A16 权重4bit,激活16bit(未量化,保持原精度)
权重+激活 W8A8 权重8bit,激活8bit SmoothQuant、ZeroQuant
W4A8 权重4bit,激活8bit QoQ
W4A4 权重4bit,激活4bit Atom、QuaRot、OmniQuant
KV Cache KV8 KV缓存8bit LMDeploy、TensorRT-LLM
KV4 KV缓存4bit Atom、QuaRot、QoQ
KV2 KV缓存2bit KIVI、KVQuant

Summary

根据以上介绍的所有内容,为了方便理解记忆总结了一张图:

【模型压缩系列-1】一篇文章带你全面了解模型量化(Data Quantization )——全局篇的更多相关文章

  1. 一篇文章带你了解网页框架——Vue简单入门

    一篇文章带你了解网页框架--Vue简单入门 这篇文章将会介绍我们前端入门级别的框架--Vue的简单使用 如果你以后想从事后端程序员,又想要稍微了解前端框架知识,那么这篇文章或许可以给你带来帮助 温馨提 ...

  2. 一篇文章带你了解服务器操作系统——Linux简单入门

    一篇文章带你了解服务器操作系统--Linux简单入门 Linux作为服务器的常用操作系统,身为工作人员自然是要有所了解的 在本篇中我们会简单介绍Linux的特点,安装,相关指令使用以及内部程序的安装等 ...

  3. MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...

  4. MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL

    MYSQL(进阶篇)--一篇文章带你深入掌握MYSQL 我们在上篇文章中已经学习了MYSQL的基本语法和概念 在这篇文章中我们将讲解底层结构和一些新的语法帮助你更好的运用MYSQL 温馨提醒:该文章大 ...

  5. 一篇文章带你掌握主流数据库框架——MyBatis

    一篇文章带你掌握主流数据库框架--MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. 在之前的文章中我们学习了MYSQL和JDBC,但是这些东西远远不 ...

  6. 一篇文章带你掌握主流服务层框架——SpringMVC

    一篇文章带你掌握主流服务层框架--SpringMVC 在之前的文章中我们已经学习了Spring的基本内容,SpringMVC隶属于Spring的一部分内容 但由于SpringMVC完全针对于服务层使用 ...

  7. 一篇文章带你掌握MyBatis简化框架——MyBatisPlus

    一篇文章带你掌握MyBatis简化框架--MyBatisPlus 我们在前面的文章中已经学习了目前开发所需的主流框架 类似于我们所学习的SpringBoot框架用于简化Spring开发,我们的国人大大 ...

  8. 一篇文章带你了解设计模式原理——UML图和软件设计原则

    一篇文章带你了解设计模式原理--UML图和软件设计原则 我们在学习过程中可能并不会关心设计模式,但一旦牵扯到项目和面试,设计模式就成了我们的短板 这篇文章并不会讲到二十三种设计模式,但是会讲解设计模式 ...

  9. 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...

  10. 一篇文章带你掌握主流办公框架——SpringBoot

    一篇文章带你掌握主流办公框架--SpringBoot 在之前的文章中我们已经学习了SSM的全部内容以及相关整合 SSM是Spring的产品,主要用来简化开发,但我们现在所介绍的这款框架--Spring ...

随机推荐

  1. Python实现ws订阅服务

    一.Python实现ws订阅服务 # 使用websocket订阅欧易公共频道中的 行情频道,以下是已知信息,写出Python代码 # 地址:"wss://wspap.okx.com:8443 ...

  2. Spring Boot 整合ActiveMQ实现延时发现消息

    生产者提供两个发送消息的方法,一个是即时发送消息,一个是延时发送消息.延时发送消息需要手动修改activemq目录conf下的activemq.xml配置文件,开启延时.本文中maven依赖文件和ap ...

  3. 20244104陈思淼 实验四 Python综合实践

    课程:<Python程序设计> 班级: 2441 姓名: 陈思淼 学号:202444104 实验教师:王志强 实验日期:2025年5月29日 必修/选修: 公选课 1.实验内容 Pytho ...

  4. java springboot图片上传和访问

    上传 @RequestMapping("/uploadImg") public Result uploadImg(HttpServletRequest request, Multi ...

  5. 如何下载DingTalk的直播视频?

    如何下载DingTalk的直播视频? 说明:本文未经授权禁止转载 绪言 如果有天早上 你突发奇想 突然就想把老师上课的视频下载下来 但是 正在寻找下载按钮时 突然发现-- 灰色的?!?! 看来是老师禁 ...

  6. Java代码审计SpEL表达式注入

    SpEL表达式概念 Spring Expression Language(SpEL) 是 Spring Framework 提供的一种功能强大的表达式语言,全称为 Spring Expression ...

  7. vllm

    !声明:本文部分框架及理论来自于 [大猿搬砖简记] 的公众号文章,但为了方便本人学习,进行了整理,同时在这个清晰的框架内添加了一些总结性质的内容,如需看原文请在其公众号中搜索:图解大模型计算加速系列. ...

  8. JDBC浅应用

    1 DriverManager: 此类管理数据库驱动程序列表.使用通信协议将来自java应用程序的连接请求与适 2 当的数据库驱动程序匹配. 3 4 Driver:此接口处理与数据库服务器的通信,我们 ...

  9. vue中使用axios获取到的Promise {<pending>}数据,无法使用的问题

    使用axios拿到后端数据后 返回的是 Promise {} 我们可以看到数据是在[[PromiseResult]]这个Object对象中 此时我们是无法获取对象的 解决方法:使用async和awai ...

  10. Ubuntu二进制安装ElasticSearch7.17.x版本集群

    概述 本文主要讲解如何二进制安装Linux二进制集群 环境信息 主机名 IP地址 系统 ELK01 10.0.0.40 Ubuntu22.04 ELK02 10.0.0.41 Ubuntu22.04 ...