Baidu Blog

Back

有一说一,大家可能并不知道 ICECHUI 是有提供模型免费 API 的,支持每日 600 万 token 的使用,当然需要开发者申请,目前能用 Qwen 的各类模型,我用起来还是挺不错的。

但这篇不是广告,是关于大语言模型的轻量化问题的先导,什么是量化。

简单来说#

量化是一种旨在降低模型参数数值精度的技术,从而减少存储每个参数所需的比特数。

在典型的AI模型训练过程中,模型的参数,即权重(weights)和偏置(biases),通常以 32 位浮点数(FP32)的格式存储。这种格式精度极高,能够表示非常广泛且细微的数值,例如 7.892345678。

然而,量化技术可以将这样一个高精度的数值近似为一个低精度的 8 位整数(INT8),比如整数 8 。这个过程的本质,是在可接受的精度损失范围内,换取模型效率的巨大提升。

为了更形象地理解这一过程,可以将其想象成将一本详尽的学术巨著简化为一本儿童读物或内容摘要。

学术巨著包含了丰富的高级词汇和复杂的句式结构,信息量巨大,但也因此厚重且难以快速阅读。

而儿童读物或摘要则用更简洁的语言和更少的篇幅传达了核心思想。

虽然一些精妙的细节和微妙的语境可能会在简化过程中丢失,但其核心内容得以保留,并且变得更容易存储、传播和理解。

AI模型量化就如同这个简化过程。它将模型内部复杂的数值语言(高精度浮点数)转换为一种更简洁、更高效的语言(低精度整数),使得模型变得更轻、更快,尽管可能会牺牲一点点的表达精度。

为何要量化?#

其实也很好理解,量化最直接、最显著的好处是能够极大地减小模型的存储体积。模型的大小主要由其参数数量和每个参数的存储精度决定。

当我们将参数从标准的 32 位浮点数(FP32,占用 4 个字节)转换为 8 位整数(INT8,占用 1 个字节)时,每个参数的存储需求骤降了 75%。对于拥有数十亿甚至数百亿参数的大型模型而言,这种缩减效果是不容置疑的。

除了减小体积,量化还能显著加快模型的推理(inference)速度,即模型利用其学到的知识进行预测或生成内容的过程。

速度的提升主要源于两个方面

  1. 整数运算本质上比浮点运算更快。在 GPU 或专门为 AI 设计的硬件(如谷歌的 TPU 或英伟达的 Tensor Cores)上,执行整数数学运算的电路更简单,延迟更低,吞吐量更高。将模型中的大量乘加运算从浮点转换为整数,可以直接利用硬件的这一优势,从而缩短计算时间。
  2. 降低了内存带宽的压力。内存带宽指的是处理器与内存之间数据传输的速率,它常常是 AI 计算中的一个主要瓶颈。由于量化后的模型体积更小,在进行计算时,需要从内存加载到处理器缓存的数据量也相应减少。更少的数据传输意味着更短的等待时间,处理器可以更高效地投入到实际的计算中。

此外计算的效率直接关系到能源的消耗,由于整数运算比浮点运算更简单,其所需的能耗也更低。因此,量化模型在运行时更加节能。

综合以上三点,传统的 AI 应用大多遵循云端 AI 模式,即终端设备(如手机),将数据发送到云端的服务器进行处理,再将结果返回。

这种模式依赖于稳定快速的网络连接,并且存在数据隐私泄露的风险。而边缘侧 AI 则致力于将计算能力直接赋予终端设备,让 AI 在本地运行。

数学的艺术#

要实现从高精度浮点数到低精度整数的转换,我们需要一个清晰、可靠的数学框架。

这个过程可以被看作是一门翻译的艺术,其核心挑战在于如何将一个包含无数可能值的连续区间(例如,所有从 -15.0 到 +15.0 之间的浮点数)精确地映射到一个只有有限个离散值的整数集合(例如,INT8 所能表示的 256 个值,从 -128 到 127)。

这门艺术的核心是一种被称为仿射量化方案(Affine Quantization Scheme)的线性映射方法。

小小数学,轻松拿下!#

仿射量化的基本思想非常简单,它通过一个线性方程来建立浮点数与整数之间的对应关系。这个关系可以用以下公式来概括:

real_valuescale×(quantized_valuezero_point)\text{real\_value} \approx \text{scale} \times (\text{quantized\_value} - \text{zero\_point})

这里的 real_value\text{real\_value} 是原始的浮点数值,quantized_value\text{quantized\_value} 是其对应的整数值。公式中的 scalescalezero_point\text{zero\_point} 是两个关键的量化参数,它们共同定义了这次翻译的具体规则。

这个公式本质上是一个简单的线性变换,类似于将温度从摄氏度转换为华氏度的过程,通过一个缩放和一个平移来完成单位的转换。

反过来,当我们想把一个浮点数 xx 转换为整数 xqx_q 时,我们只需要对上述公式进行移项,即可得到量化的核心计算步骤 :

xq=round(xS+Z)x_q = \text{round}(\frac{x}{S} + Z)

其中,SS 代表 scalescale(缩放因子),ZZ 代表 zero_pointzero\_point(零点)。这个公式告诉我们,量化一个浮点数 xx 的过程分为三步。首先用 xx 除以缩放因子 SS,然后加上零点 ZZ,最后将结果四舍五入到最近的整数。这个整数 xqx_q 就是原始浮点数 xx 的量化表示。

对于那些超出预设浮点范围 [a,b][a, b] 的值,它们会被裁剪(clipped)到该范围所能表示的最接近的整数值,以确保所有输入都能被映射到有效的整数空间内 。

缩放因子?零点?#

scalescale 是一个正的浮点数,它定义了量化的粒度。可以将其理解为整数世界里的一个单位步长(step size)在浮点世界里代表多大的数值范围。

例如,如果 scalescale 是 0.1,那么整数值 5 和 6 之间的差距就代表了 0.1 的浮点数值变化。

一个较小的 scalescale 值意味着更高的精度,因为每个整数都对应一个更窄的浮点数范围;反之,一个较大的 scalescale 值则意味着更粗的粒度,精度损失也更大。

zero_pointzero\_point 是一个整数,它的作用是确保浮点世界中的 0.0 这个特殊值能够被整数世界中的某个值精确地表示。

这一点至关重要,因为在神经网络中,0 是一个非常常见且有特殊意义的值。例如,在 ReLU 激活函数中,所有负数输入都会被置为 0。在卷积操作中,也经常使用 0 来进行填充(padding)。

如果浮点 0.0 在量化后无法被精确表示,就会引入系统性的偏差,持续地影响模型的计算结果 。zero_pointzero\_point 就是那个与 0.0 精确对应的整数值。

所以?#

根据浮点数值的分布特性,我们可以采用两种不同的映射策略来确定 scalescalezero_pointzero\_point,即非对称量化和对称量化。

  • 非对称量化 (Asymmetric Quantization) 是最通用的仿射量化方案 。它适用于任何范围的浮点数,例如,一个经过 ReLU 激活函数处理后的张量,其数值范围可能是 [0,)[0, \infty)。在这种情况下,浮点数的 0 并不位于范围的中心。非对称量化通过一个非零的 ZZ 来平移整个整数映射区间,使其能够完美地对齐这个非对称的浮点范围。
  • 对称量化 (Symmetric Quantization) 是一种简化的特殊情况,适用于那些数值范围大致以 0 为中心对称分布的张量,例如范围为 [10,10][-10, 10] 的权重 。在对称量化中,我们强制规定 ZZ 必须为 0。这样做的好处是,量化公式可以简化为 xq=round(xS)x_q = \text{round}(\frac{x}{S}),在计算时可以省去一次加法操作,从而可能带来微小的速度提升。然而,如果数据的实际分布并非严格对称,强制使用对称量化可能会牺牲一定的表示精度 。

实际上,数学的艺术并不仅仅在于应用这些公式,更在于如何为模型的每一层权重和激活值确定最佳的量化范围 [min_val,max_val][min\_val, max\_val],并由此计算出最合适的 scalescalezero_pointzero\_point。这个确定参数的过程被称为校准(calibration)。

对于模型的权重,其数值范围在量化时是已知的、静态的。但对于激活值,其数值会随着每次输入数据的不同而动态变化。如何选择一个固定的范围来适应所有可能的输入,便成了量化中的核心难题。

校准过程通常需要将一小部分有代表性的数据样本输入到模型中,以观察和统计激活值的典型分布范围。

选择一个过窄的范围会导致许多超出范围的离群值被裁剪,从而产生较大的裁剪误差。而选择一个过宽的范围又会使得大部分常见值的表示粒度变粗,导致较大的舍入误差。

如何在这个权衡中找到最佳平衡点,正是不同量化方法论(如静态量化、动态量化和量化感知训练)试图解决的核心问题。

PTQ 训练后量化#

顾名思义,训练后量化是在一个已经使用高精度(如 FP32)完全训练好的模型之上进行的操作。

它更像是一个模型转换或后处理步骤,而非训练过程的一部分。其工作流程通常是获取一个预训练好的模型,然后应用量化算法将其参数转换为低精度格式。

PTQ 最大的优点是便捷和高效。由于它不需要对模型进行重新训练,整个过程非常快速,通常只需要几分钟到几小时。

此外,它对数据的需求量也小得多,有时甚至不需要任何数据。这使得 PTQ 成为一个极具吸引力的选项,特别是当拥有一个现成的预训练模型,但缺乏原始的训练数据集或充足的计算资源时。

PTQ 内部又可细分为几种不同的技术,其中最常见的两种是:

  • 静态量化 (Static Quantization),这种方法会对模型的权重和激活值都进行量化。权重的量化相对直接,因为它们是固定的。但对于随输入变化的激活值,静态量化需要一个额外的校准(calibration)步骤**。**在这一步中,开发者会向模型输入一小部分有代表性的样本数据,并记录下每一层激活值的动态范围。基于这些统计信息,算法会为每一层的激活值计算出一个固定的、最优的量化参数。在实际推理时,模型会使用这些预先计算好的参数来量化激活值。由于所有参数在推理前都已确定,静态量化在运行时没有额外的计算开销,因此推理速度最快。
  • 动态量化 (Dynamic Quantization), 与静态量化不同,动态量化通常只对模型的权重进行预先量化,而激活值则在推理过程中被即时地(on-the-fly)量化。具体来说,每次有新的输入数据时,系统会实时计算出当前激活值的范围(最大值和最小值),并据此动态生成量化参数。这种方法的优点在于,量化参数完美地适配了每一次输入的具体情况,因此通常能获得比静态量化更高的精度。但其代价是,在每次推理时都增加了计算量化参数的开销,这可能会导致整体推理速度慢于静态量化。

QAT 量化感知训练#

量化感知训练则采取了与 PTQ 完全不同的思路。它不是在训练结束后才引入量化,而是将量化过程直接整合到模型的训练或微调(fine-tuning)阶段。

其核心目标是让模型在训练时就感知到未来将会被量化的事实,并主动学习去适应和补偿由量化引入的精度损失。

QAT 的实现依赖于一种巧妙的机制,通常被称为伪量化或模拟量化。在训练的每一次迭代中,其具体流程如下:

  1. 前向传播 (Forward Pass): 在计算网络输出时,模型会模拟量化操作。它会先将全精度的权重和激活值进行伪量化(即按照量化规则计算出它们对应的整数值,然后再通过反量化公式将其转换回浮点数,这个浮点数的值已经带有量化误差)。接着,使用这些带有模拟误差的值来完成网络的计算。
  2. 反向传播 (Backward Pass): 在计算梯度并更新权重时,模型则会忽略前向传播中的量化操作。梯度是基于原始的全精度权重计算的,并且更新也是在全精度的权重上进行的。这种设计(通常通过一种名为 Straight-Through Estimator 的技术实现)确保了训练过程的稳定性和梯度的有效传播。

通过这种方式,模型在整个训练过程中不断地体验量化带来的影响,并调整其权重,以找到一个在量化后性能依然最优的解。

这就像一个射击运动员在训练时就考虑到风速的影响,并主动调整瞄准点,而不是在比赛当天才第一次感受风力。

因此,QAT 的最大优势在于其能够最大程度地保留模型精度。

由于模型已经学会了如何与量化误差共存,其最终的量化版本几乎总能达到比 PTQ 更高的准确度,有时甚至能接近原始 FP32 模型的水平。因此,当应用场景对精度要求极为苛刻时,QAT 是首选方案。

当然,这种高精度是有代价的。QAT 需要完整的训练流程,这意味着它需要访问庞大的训练数据集,并投入大量的算力资源来进行模型的重新训练或微调。

预告已结束,下面是伏笔#

虽然 PTQ 和 QAT 构成了量化技术的核心框架,但这个领域仍在不断发展,涌现出许多针对特定场景和需求的专用工具与更前沿的技术。

GPTQ#

GPTQ 是一种先进的训练后量化方法,其全称 Generalized Post-Training Quantization(通用训练后量化),意指它专为基于 GPT 架构的模型设计。

它的突出特点是能够在保持极低性能损失的情况下,将模型量化到非常低的比特宽度,如 INT4 甚至 INT3。GPTQ 通过一种逐层量化的方式,并结合对量化误差的精确分析,实现了比传统 PTQ 方法更优的精度压缩比。

在实际应用中,GPTQ 量化的模型通常在 GPU 上表现出极高的推理速度,使其成为 GPU 用户运行大型模型的首选方案之一。

GGML#

GGML 是一个为机器学习设计的张量库,它包含了一套自定义的二进制格式来存储量化模型。与 GPTQ 主要面向 GPU 不同,GGML 格式的模型在 CPU 上运行时表现出卓越的性能。

这使得没有高端显卡的用户也能够在自己的笔记本电脑或台式机上体验大型语言模型。GGML 支持多种量化级别(例如,文件名中常见的 q4_0, q5_1 等),为用户在模型大小和性能之间提供了灵活的选择。

极端量化#

  • 二值化 (Binarization) 是最极端的量化形式之一。在二值化神经网络(BNN)中,模型的权重被限制为仅有两个可能的值,通常是 1,+1{-1, +1} 或经过缩放的 α,+α{-α, +α}
  • 三值化 (Ternarization) 则稍微放宽了限制,允许权重取三个值,通常是 1,0,+1{-1, 0, +1}α,0,+α{-α, 0, +α}

总结#

量化,归根结底,是一项旨在让庞大而复杂的 AI 模型变得更小、更快、更节能的优化技术。

从而使如 LLM 这样的大模型能够走出资源充足的云端数据中心,部署到我们日常生活中的各种资源受限的设备上。

无论是大幅缩减模型体积以便装入手机,还是加速推理以支持自动驾驶的实时决策,亦或是降低功耗以延长可穿戴设备的续航,量化都扮演着不可或缺的角色。

它已成为推动AI技术普及化、实用化和民主化的核心工程支柱之一。

脚注#

Hugging Face. (n.d.). Quantization. In Optimum documentation. Hugging Face. Retrieved August 20, 2025, from https://huggingface.co/docs/optimum/concept_guides/quantization Li, J. (2024, May 27). Mechanistic Interpretability of Binary and Ternary Transformers (arXiv:2405.17703) [Preprint]. arXiv. https://doi.org/10.48550/arXiv.2405.17703

【预告】什么是量化?
https://baidu.blog.icechui.com/zh/blog/p/aiq1
Author baidu0com
Published at August 20, 2025