游乐游手机版
首页/AI热点日报/热点详情

LLM量化入门:如何理解模型大小对性能的影响

类型:热点整理2026-06-28
在当前时代,大型语言模型(LLM)的扩展势头正猛,规模和复杂性不断攀升,这就对模型的高效部署和快速推理提出了更高的要求。与此同时,网络传输效率和模型响应时间直接关系到用户体验——谁也不想等太久。然而,现实中的网络条件和模型性能往往难以满足这些需求,不仅影响产品体验,还拖累了多个行业的创新步伐。于是,
在当前时代,大型语言模型(LLM)的扩展势头正猛,规模和复杂性不断攀升,这就对模型的高效部署和快速推理提出了更高的要求。与此同时,网络传输效率和模型响应时间直接关系到用户体验——谁也不想等太久。然而,现实中的网络条件和模型性能往往难以满足这些需求,不仅影响产品体验,还拖累了多个行业的创新步伐。于是,大家把目光投向了边缘计算和量化技术:在数据源头附近进行计算,试图绕过传输瓶颈。但话说回来,边缘计算的全面落地还面临不少障碍,通用人工智能(AGI)的路更是漫长且充满未知。 边缘设备计算 边缘设备计算,说白了就是在网络的边缘——也就是离数据产生的地方最近的位置,完成计算任务。它是边缘计算的一种具体落地方式,利用智能手机、嵌入式系统、IoT设备、工业控制器这些终端,直接用本地的CPU处理数据,而不是把数据发到遥远的云端或数据中心。 模型量化是一项核心技术,专门用来解决大型模型部署中的痛点。它能在基本不损失模型性能的前提下,把模型压缩得更小、运行更快。这篇文章会深入拆解量化的原理,聊聊不同的量化策略,再看看这些策略在大型语言模型(LLM)里的具体应用和效果。通过量化,我们希望提升模型的运行效率,减少对计算资源的依赖,从而让LLM能在更多场景中派上用场。

本文重点:

  • 科普量化AI知识
  • 数学公式推导

什么是量化?

量化这门技术活儿,可以理解为给大型语言模型和其他神经网络模型做一次“瘦身”,让它们变得更轻巧、跑得更快。具体操作是把模型里那些高精度的数字——比如32位的浮点数,换成精度低一些的格式——比如8位的整数。这有点像我们平时做预算:每笔开销精确到分,变成了只记到元,虽然失去一些细节,但大体的收支情况还能把握住。

举一个更接地气的例子:假设你有一大堆照片,每张都是超高分辨率,这就好比模型中的32位浮点数。硬盘空间不够了怎么办?你可能会把它们压缩,降低分辨率,变成更小的文件——这就像量化中的8位整数。压缩后的照片或许不如原图清晰,但主要内容还在,感觉也没丢。 量化过程中,我们对模型的权重和激活值做了类似处理:通过减少它们占用的存储空间,让模型更高效,更容易在各种设备上跑起来。这样一来,哪怕资源有限,也能享受到大模型带来的智能服务。请看下图:量化先去掉精度,变成整数,再通过算法还原精度。 (图片来自 medium 上的原图)

为什么要量化?

举个例子,当前训练或推理的机器有一定限制,硬件上不一定能配到NVIDIA A100那种豪华套餐——这卡有价无市,价格十几万刀。下图就展示了整数相比浮点数在内存上几何级的下降:如果效果一样,显然后者更划算。 (图片来自 medium 上的原图) 以LLaMA 3.1–70B模型为例,这是一个拥有700亿参数的高性能LLM,在推理时需要高达140GB的内存。如此高的资源消耗,通常得靠多块高端GPU才能撑起来。 但通过量化,LLaMA 3.1–70B的内存需求从140GB骤降到35GB——这下单块NVIDIA A100 GPU就能轻松运行。这一变化不仅展示了量化在资源优化上的潜力,也凸显了它在推动大模型普及中的关键作用。

量化方案

量化针对不同领域的模型,套路也各不相同。这里专门针对深度学习和神经网络模型,重点聊聊线性量化、非对称量化与对称量化。

线性量化

线性量化是一种在神经网络模型中广泛使用的压缩技术,通过降低模型参数的表示精度来大幅缩减模型尺寸。尤其适合资源受限的环境,能在不牺牲太多准确度的前提下提升运行效率。该技术通过四步将浮点权重映射到定点值,下面结合图做详细介绍。 (图片来自 medium 上的原图) 第一步:确定数据范围 线性量化的第一步,是摸清数据中存在的值范围。这需要检查值的分布,算出最小值和最大值。 这个范围对确定最佳的缩放因子和零点至关重要,也就是图中的min和max。其中 q 是一个整数,范围-128到127,x 是输入的浮点数。 (图片来自 medium 上的原图) 计算过程:假设输入 x 是 -1.0 到 1.0 之间的数0.5(看最上面的压缩图),保留当前 x。 第二步:缩放和零点计算 这一步要算出缩放因子 s 和零点 z,让每个张量的值都落在目标整数范围内。缩放因子决定了量化的粒度,零点则移动值的范围,确保量化后的值以零为中心。目标是找到最合适的比例和零点,让量化误差最小,同时保证值能放进目标整数范围。 (图片来自 medium 上的原图) 计算过程:比例因子 s 用于将输入数据的范围映射到量化值的范围,公式为 s = q的范围 / x的波动范围。当前 s = (127 - (-128)) / (1.0 - (-1.0)) = 127.5。零点 z 用于量化尺度的原点,把输入数据的零点映射到量化值的某个特定点,公式为 z = q(min) - round(s * x(min)),其中 round 是四舍五入。当前 z = -128 - round(127.5 * -1.0) = 0。 第三步:将浮点值量化为低精度整数 算出比例和零点后,用公式将浮点值量化为低精度整数。其中 x 是原始浮点值,q 是量化整数值,s 是缩放因子,z 是零点。这个公式把浮点值映射到一组离散的整数值,从而降低LLM的精度和内存需求。 (图片来自 medium 上的原图) 计算过程:q = round(127.5 * 0.5 + 0) = round(63.75) = 64。 第四步:推理过程中进行去量化,实现精确计算 推理时,用公式把量化后的整数值反量化回浮点值。其中 x̂ 是重建的浮点值。这一步确保推理过程中的计算精确且准确,同时依然享受量化模型在内存和计算上的优势。 (图片来自 medium 上的原图) 计算过程:x̂ = (64 - 0) / 127.5 = 0.5。 再补充一下,下图展示了2位线性对称量化的过程,其中 4×4 的权重作为校准数据来确定量化参数——缩放因子 s 和零点 z。 (图片来自 medium 上的原图)

非对称量化与对称量化

非对称量化会根据数据分布灵活调整间隔,能更高效地利用量化级别。它的范围不一定以零为中心,正负范围可以使用不同的比例因子。比如,在范围 [0.1, 0.9] 的8位非对称量化中,级别从0到255,假设0对应0.1,10对应0.2,20对应0.3……这种方法更适合非对称分布的数据,但实现起来也更复杂。 (图片来自 medium 上的原图) 对称量化则把零点放在量化范围的中点,正负量化间隔围绕零点对称分布。这种策略实现简单、计算效率高。以8位对称量化为例,量化级别从-127到127,覆盖范围 [-0.8, 0.9],零点正好在0,对应量化范围的中点(参考前面例子)。对称量化特别适合那些在零点附近对称分布的权重数据。 然而,对于分布不对称的数据,对称量化可能没法充分利用整个量化范围,导致表示精度下降。相比之下,非对称量化能根据实际分布调整间隔,在数据正负范围差异明显时提供更精确的表示。这种灵活性有助于量化后保持模型性能。在实现 n 位非对称量化时,通常会保留一个特殊的量化级别来表示零点,这意味着量化范围的一侧会少一个可用级别。例如,8位对称量化可以表示-127到127的浮点数,因为牺牲了一个级别来表示零点。这种方法允许将浮点数范围 [-absmax(x), absmax(x)] 映射到整数范围 [-(2^(n-1)-1), 2^(n-1)-1]。 (图片来自 medium 上的原图) 计算过程:下图矩阵中,最大值 x = 2.65。 (图片来自 medium 上的原图)

量化策略

将量化应用到深度学习模型的不同组件,有多种策略可选,每种都有自己的优点和适用场景:

  • 权重:减少模型大小和内存占用

  • 激活:节省内存,尤其是与权重量化结合时

  • KV Cache:加速处理长序列的模型的序列生成(在 Transformer 中,对自注意力机制使用的键和值的缓存进行量化,优化内存和计算效率)

  • 梯度:减少大规模训练中的通信开销,可能加速训练

LLM 量化的类型:

LLM量化主要有两种方法:QAT 和 PTQ。 (图片来自 medium 上的原图)

QAT(量化感知训练)

QAT 是一种在模型训练过程中就考虑量化的技术。通过在训练时模拟低精度,模型能学会适应量化噪声,从而提升性能。QAT 在低精度下效果尤其出色,但由于需要重新训练模型,推广起来受到限制。此外,QAT 计算量大、成本高,尤其对大模型而言。尽管如此,它的优势让它成为优化LLM、在资源有限设备上高效部署的关键方法。

PTQ(训练后量化)

PTQ 不需要重新训练模型,而是直接对预训练模型进行量化。它更简单、更快速,适合快速部署。PTQ 会分析权重分布、确定量化参数,然后把权重转为低精度。虽然它快且省资源,但可能会略微降低模型性能,尤其是小模型或存在异常值的模型。 用大白话对比 QAT 和 PTQ:上面的图已经说明了两者的区别。 QAT 就像在教学生时,提前告诉他将来只能记整数不能记小数,这样学生学的时候就会主动适应这种限制。具体来说: - 训练时量化:在训练过程中,权重和激活值会被模拟量化(暂时转成整数再转回浮点),让模型逐渐适应。 - 需要训练数据:QAT 本质还是训练过程,所以需要原始数据。 PTQ 则像你已经教会了一个学生,现在要让他去一台只能记整数的设备上干活,你不用重新教,只需把知识“转换”一下。具体来说: - 训练后量化:训练完成后,直接对权重做量化(比如32位浮点转8位整数)。 - 校准:用少量代表性数据调整量化参数,确保性能不降太多。 - 快速部署:不用重新训练,很快就能上线。 简单讲:一个是在训练过程中就考虑量化,另一个是训练完再量化。

LLM中应用的具体量化技术

这里重点聊聊 GPTQ、GGML、NF4 和 bitsandbytes 这几种方案。

GPTQ

GPTQ(Generative Pre-trained Transformer Quantization)是一种针对大语言模型的先进后训练量化技术。它能把模型权重的位宽降到3到4位,同时保持模型性能,实现高效压缩。GPTQ 引入了一种创新的一次性权重量化方法,并结合 Cholesky 分解提升计算效率。下图展示了这个过程:白色部分正在量化(还未量化的权重矩阵或块,保持全精度),最终变成蓝色(已量化的权重)。 下图是一个递归过程,在每个块内进行:当前正在量化的白色中间列,其周围的权重(蓝色部分)会在量化步骤结束时更新。这种方法让算法在保持较高精度的同时,有效量化大模型。简单说,这个过程利用 Cholesky 算法,就像在做一个大型拼图,每次处理一块拼图,同时调整周围块来保证整体准确。 这种技术能在几小时内完成对 GPT-3(1750亿参数)这样的大规模模型的量化,相比现有基线方法,压缩比提升了两倍以上。 GPTQ 的优化重点在于减少内存带宽需求,这对提升推理速度至关重要。此外,它还实现了一种量化顺序启发式方法,最小化量化误差。通过 AutoGPTQ 工具,开发者可以把 LLM 量化到8位、4位、3位甚至2位。实际应用中,对 LLaMA3-8B 进行量化可以显著降低内存占用。原始模型有803亿参数,用16位 bfloat16 表示,理论上量化为4位可让模型大小变为原来的四分之一。但由于 GPTQ 主要针对线性层(注意力机制和MLP),而词汇表嵌入保持不变,实际尺寸减小不像理论那么夸张。 具体到 LLaMA3-8B,4位量化后模型大小降至5.74 GB,而原始16位模型是16.07 GB,内存使用大幅减少,部署和运行效率显著提升,尤其在资源受限的边缘设备上。下面是用 GPTQ 量化的代码示例:
from transformers import AutoModelForCausalLM, AutoTokenizer
from optimum.gptq import GPTQQuantizer
import torch
model_path = 'meta-llama/Meta-Llama-3-8B'
b = 4
quant_path = 'Meta-Llama-3-8B-gptq-'+str(b)+'bit'

tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=True) model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map="auto")
quantizer = GPTQQuantizer(bits=b, dataset="c4", model_seqlen = 2048) quantized_model = quantizer.quantize_model(model, tokenizer)
quantized_model.sa ve_pretrained("./"+quant_path, safetensors=True) tokenizer.sa ve_pretrained("./"+quant_path)

Cholesky

用大白话说,Cholesky 分解就像把一个大数学问题(尤其是涉及矩阵运算的)拆成更小、更容易解决的部分。想象一下,你有一个由许多小方块组成的复杂拼图,每个小方块上都有数字,你需要找到一种排列方式,让每一行和每一列的数字和满足特定规则。在数学里,矩阵可以看作是一个数字排列成的表格。Cholesky 分解专门针对“正定矩阵”——一类具有特殊性质的矩阵(比如所有行和列的数字和都是正数)。 假设你有一个大型建筑项目,需要计算稳定性。稳定性由一个复杂的数学方程确定,可以表示为矩阵 A。如果 A 是正定的,你就可以用 Cholesky 分解来简化: - 步骤1:将矩阵 A 分解为两个下三角矩阵 L 和 L^T。 - 步骤2:解决两个更简单的问题(与 L 和 L^T 相关的计算)。 - 步骤3:通过这两个子问题的解,得到原始问题的答案。

MLP

MLP(多层感知机)是一种基础的前馈神经网络,由至少三层节点组成:输入层、一个或多个隐藏层以及输出层。每层由多个神经元组成,对输入数据进行加权求和,再通过非线性激活函数输出结果。

GGML/GGUF

GGML(由 Georgi Gerganov 开发)是一个用 C 语言编写的库,为机器学习应用提供了一套强大的工具和功能,尤其在支持 LLM 的构建和部署方面。GGML 的重点是提供基础构件(如张量),用于进行复杂数学运算和模型训练。 GGML 的一个显著特点是支持一种新型二进制格式,最初用于分发 LLM,后来演变为 GGUF(Generalized Gaussian Unit File)格式。GGUF 在设计上具有前瞻性,允许未来的功能扩展而不破坏旧版兼容性。它把所有相关元数据整合到一个文件中,让管理特殊令牌、RoPE(旋转位置编码)缩放参数等关键信息变得高效便捷。这不仅简化了部署流程,也让更新和维护更容易。 GGML 与 llama.cpp 库结合,提供了一种在 CPU 上高效执行 Llama 模型推理的方法。llama.cpp 由同一开发者创建,提供了一种成本效益高的方式——不依赖高性能 GPU 也能进行推理。最近,llama.cpp 的性能进一步提升,通过把部分计算任务转移到 GPU,在处理大语言模型时实现了更快的速度和更优的内存管理。这种协同不仅提高了运行效率,也为开发者带来了更大的灵活性。 上图展示了 GGUF 结构说明: - 文件头(Header):前16个字节包含基本信息,前4个字节是 GGUF 版本号(当前版本3),接下来4个字节是 GGUF 的魔数(magic number,用于识别文件类型,这里是 0x47 0x47 0x55 0x46,对应字符 GGUF),再接下来8个字节是 tensor_count(用64位无符号整数表示张量数量)。 - 张量信息(Tensors Info):包括名称(name)、维度数量(n_dimensions)、维度(dimensions)、类型(type)、偏移量(offset)。 - 元数据(Metadata):包含模型的额外信息,以键值对形式存储,数量由 metadata_kv_count 指定。内容涵盖模型架构、名称、上下文长度等,以及分词器配置和特殊令牌映射。

Rotary Positional Encoding(RoPE)

这是一种特殊的位置编码方法,通过旋转变换来编码位置信息。可以把输入向量在高维空间中进行旋转,从而模拟序列中元素的顺序关系。想象你在玩拼图游戏:每个拼图块都有特定位置,你需要记住每个块该放哪儿。RoPE 就像给你一个特殊工具,帮你记住位置——不是简单告诉你哪个格子放哪个块,而是通过旋转拼图块来表达它在序列中的位置。

NF4

NF4 量化技术通常与双量化(double-quantization)结合使用。双量化是一种策略:先把数据量化到中间表示,再从中间表示量化到最终的低精度格式,从而实现更高的压缩率。NF4 还在 QLoRA(Quantized Low-Rank Adaptation)中得到应用,这是一种用于高效微调 LLM 的方法。 NF4 的实现提供了与 INT4 量化相似的压缩比,但在整个量化过程中能更好地保持模型准确度。也就是说,即使权重被量化到较低的位宽,模型在执行任务时性能下降有限。这对在资源受限环境中部署大型神经网络模型意义重大——在保持较高性能的同时,减少对存储和计算资源的需求。

Bitsandbytes

Hugging Face 的 Transformers 库在自然语言处理领域广受好评,它通过与 Bitsandbytes 库紧密结合,进一步降低了模型量化的门槛。Bitsandbytes 是一个 Python 接口,方便地封装了 CUDA 自定义函数,让开发者能轻松利用 GPU 加速量化过程。它包括一系列高效工具,如8位优化器、矩阵乘法(通过 LLM.int8() 方法实现,见下图),以及8位和4位量化功能。这些工具共同构成了强大的量化解决方案,让 LLM 可以即时量化,无需重新训练或调整结构。 (图片来自 medium 上的原图) 将模型量化为4位只需一行代码:
AutoModelForCausalLM.from_pretrained(model_path, device_map="auto", load_in_4bit=True)
相比 GPTQ,Bitsandbytes 在4位量化方面效果更好,这要归功于其使用的 NormalFloat4 数据类型,优于 GPTQ 的 INT4。但 bitsandbytes 有两个明显缺点: - 有限的量化支持:只支持8位和4位量化,可能限制适用性。 - 推理速度较慢:量化后的模型推理速度可能偏慢,影响性能。 尽管有这些限制,bitsandbytes 仍然提供了一种方便有效的方法来减少 LLaMA 3 等大型 LLM 的内存占用。 总结一下:这些量化技术代表了压缩 LLM 的不同思路。GPTQ 提供高效的后训练方法,GGML 提供量化模型的通用格式,NF4 引入了平衡压缩的专用数据类型,bitsandbytes 则是一个综合性的量化库。

结论

模型量化是一项强大的技术,能让大型语言模型变得更易获取、更高效。通过了解各种量化方法及其应用,研究人员和从业者可以优化 LLM,在资源受限的设备上部署,同时不造成显著的性能损失。随着 AI 领域的不断发展,量化将成为让最先进的语言模型走向平民化、节能化、边缘化的重要推手。
来源:https://www.53ai.com/news/finetuning/2024120656473.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。