- 文档
- 教程
- 技术博客
- 大模型
- 人工智能
【免费下载链接】one-small-step
这是一个简单的技术科普教程项目,主要聚焦于解释一些有趣的,前沿的技术概念和原理。每篇文章都力求在 5 分钟内阅读完成。
量化(Quantization)是让大语言模型"瘦身"运行的关键技术:通过降低模型参数的数值精度,可以成倍压缩模型体积与内存占用,让几十 GB 的模型在消费级显卡上跑起来。本篇以 one-small-step 仓库中的《什么是大语言模型量化》为基础,系统讲解量化的基本原理、位宽换算、K 量化命名规则(如 Q4_K_M),并结合困惑度(PPL)指标与 GGUF/llama.cpp 生态,帮你彻底看懂每个量化精度代表什么、如何选择。
量化是什么?为什么 LLM 需要量化
量化是一种通过降低模型参数的数值精度来压缩模型大小的技术。在深度学习中,模型参数通常以 32 位浮点数(FP32)存储,通过量化可以将其转换为更低精度的表示形式,从而减少模型的内存占用和计算开销。
对现代 LLM 而言,模型体积主要由参数量和参数字节数共同决定。一个 70 亿参数(7B)的模型,如果全部用 FP32 存储,仅权重就需要约 28GB 显存;而推理时的 KV Cache、激活值还会叠加更多内存压力。量化正是在"模型体积、运行内存、推理速度"与"生成质量"之间寻找平衡点的工程手段——这也是为什么几乎所有本地部署生态(GGUF、llama.cpp 等)都围绕量化版本展开。
位宽与字节:量化压缩的基本账
理解量化,先要理解"位(bit)"和"字节(byte)"的关系:1 字节 = 8 位。位宽决定了单个参数需要多少个二进制位来存储,也直接决定了内存占用。
如上图所示,FP32 的大小是 4 字节(4 字节 × 8bit = 32bit),而 FP16 的大小是 2 字节(2 字节 × 8bit = 16bit)。数值表示的本质差异在于三个部分如何分配位数:
| 精度格式 | 位宽 | 字节数 | 格式构成(符号/指数/尾数) | 相对 FP32 的内存占用 |
|---|---|---|---|---|
| FP32 | 32 位 | 4 字节 | 1 / 8 / 23 | 100%(基准) |
| FP16 | 16 位 | 2 字节 | 1 / 5 / 10 | 1/2 |
| BF16 | 16 位 | 2 字节 | 1 / 8 / 7 | 1/2 |
| FP8 | 8 位 | 1 字节 | 1 / 4 / 3 或 1 / 5 / 2 | 1/4 |
| INT8 | 8 位 | 1 字节 | 1 位符号 + 7 位数值 | 1/4 |
| INT4 | 4 位 | 0.5 字节 | 1 位符号 + 3 位数值 | 1/8 |
这正是大家喜欢用 Q4 量化模型的原因:跟 FP16(16bit)的模型相比,Q4(4bit)的模型只有 1/4 的大小,运行起来需要的内存也是 1/4。量化的代价是精度的损失——尾数位和指数位被削减后,参数的表示精度下降,模型输出质量会有轻微退化,这正是后文 PPL(困惑度)指标要度量的东西。
训练侧精度格式:FP32 / FP16 / BF16 / FP8
量化主要服务于推理阶段的部署,但训练阶段同样大量使用低精度格式来降低成本:
- FP32(单精度浮点):传统深度学习的基准精度,动态范围和精度都很高,兼容性最广,但内存占用大、计算开销高。
- FP16(半精度浮点):内存和计算相比 FP32 减半,动态范围较小(约 6e-5 到 65504),训练时可能出现上溢或下溢,通常需要配合动态损失缩放(Dynamic Loss Scaling)。
- BF16(脑浮点数):动态范围与 FP32 相同,解决了 FP16 的溢出问题,但尾数精度较低,是目前大模型训练最常用的精度格式之一。
- FP8(E4M3 / E5M2):8 位浮点,需要 Hopper 及更新的 GPU 硬件支持。E4M3 精度更高、适合权重和激活值,E5M2 动态范围更广、适合梯度计算。
现在大多数模型训练都采用 FP16 精度;最近出圈的 DeepSeek-V3 则采用了FP8 精度训练,能显著提升训练速度和降低硬件成本。从源码结构看,仓库中的大模型精度格式一览对 FP32、FP16、BF16、FP8、INT8、INT4 乃至 1-bit 等格式的位数构成、代表模型和适用场景做了更完整的梳理,可以作为本节的延伸阅读。
Q4_K_M 到底是什么意思?K 量化命名解码
理解位宽之后,剩下的问题就是:量化模型文件(如Q4_K_M.gguf)那一长串后缀到底代表什么?
这种命名方式一般出现在GGUF / GGML 格式的模型中,它们通常采用 K 量化方法,格式类似Q4_K_M。命名可以拆解为三段:
| 命名段 | 含义 | 示例说明 |
|---|---|---|
Q+ 数字 | 量化精度(bit 数) | Q4表示 4bit 量化 |
K | K 量化方法 | 由 llama.cpp 社区提出的分块量化方法,按块计算缩放因子,比早期 Q4_0/Q4_1 精度损失更小 |
S/M/L等 | 模型在尺寸和PPL(困惑度)之间的平衡度 | 从高到低有0、1、XS、S、M、L等档位 |
以Q4_K_M为例:4bit 量化 + K 量化方法 + 中等平衡档位。后缀中的_0、_1(如Q4_0、Q5_1)属于更早期的"基础量化"变体,而带K的Q4_K_S、Q4_K_M则是 K 量化对精度与速度做了不同权衡的版本:
- K_S(Small):偏向更小的体积,量化粒度更粗,体积更小但 PPL 略高;
- K_M(Medium):在尺寸和 PPL 之间取平衡,是社区中最常用的档位;
- K_L(Large):更接近原始精度,体积更大但 PPL 损失更小。
另外值得注意:PPL 是评估语言模型性能的重要指标,它衡量模型对下一个词的预测准确程度。PPL 越低,代表模型预测越准确、量化带来的质量损失越小,因此 K 量化的后缀档位本质上是在用 PPL 作为"质量标尺"来平衡体积。
PPL(困惑度):衡量量化质量的标尺
既然后缀中的平衡度基于 PPL,那么 PPL 到底如何评估一次量化的好坏?仓库中的什么是 LLM 的困惑度给出了完整定义:困惑度是模型对测试集的对数概率的负平均值,数学上表示为:
$$\text{Perplexity} = \exp\left(-\frac{1}{N}\sum_{i=1}^{N}\log p(x_i)\right)$$
其中 N 是测试集中的标记(token)数量,p(x_i) 是模型对标记 x_i 的预测概率。直观理解,困惑度可以看作模型在每个位置上平均需要考虑的可能选项数量——困惑度越低,预测越确定、越准确。
上图直观展示了量化的核心权衡:对任意参数规模的模型,K 量化都会让模型体积(横轴,GiB)大幅下降,而困惑度(纵轴)仅小幅上升;同时,参数规模越大的模型,量化后的 PPL 也越低。这正是 K 量化"以极小质量损失换取巨大体积压缩"的核心价值。
常见 K 量化版本 PPL 对比表
以 7B 模型为例,llama.cpp 社区的量化对比基准给出了各 K 量化版本的 PPL 增量、体积和适用建议。表中"ppl increase"指相对原始模型困惑度的绝对增量,"ppl 13b to 7b %"表示该量化损失相当于"把 13B 模型缩到 7B 所带来的困惑度上升"的百分比,便于直观感受损失的量级:
| type | ppl increase | ppl 13b to 7b % | file size | note |
|---|---|---|---|---|
| q2_k | 0.8698 | >100% | 2.67GB | 超大号的模型想要测试,可以考虑 Q2 版本,比如 unsloth 团队的 DeepSeek-V3-Q2_K_M 量化版本,实际测下来是可用的 |
| q4_0 | 0.2499 | 38.3% | 3.5GB | 基础 4bit 量化,速度较快但 PPL 损失偏高 |
| q4_1 | 0.1846 | 28.3% | 3.9GB | 基础 4bit 量化,比 Q4_0 略好 |
| q4_ks | 0.1149 | 17.6% | 3.56GB | K 量化 4bit 小档位 |
| q4_km | 0.0535 | 8.2% | 3.80GB | 如果没有提供 Q5 量化版本,那么 Q4 量化版本也可以考虑,建议至少 Q4_K_M 版本 |
| q5_0 | 0.0796 | 12.2% | 4.3GB | 基础 5bit 量化 |
| q5_1 | 0.0415 | 6.36% | 4.7GB | 基础 5bit 量化,损失更小 |
| q5_ks | 0.0353 | 5.41% | 4.33GB | K 量化 5bit 小档位 |
| q5_km | 0.0142 | 2.18% | 4.45GB | 目前最推荐的量化大小,实际体验下来各种模型量化中这个版本是最理想的 |
| q6_k | 0.0044 | 0.67% | 5.15GB | PPL 损失几乎可以忽略 |
| k8_0 | 0.0004 | 0.061% | 6.7GB | 如果显存十分富裕,当然推荐这个 |
(数据来自 llama.cpp 社区的量化对比基准测试,即社区 PR 1684 中的数据;具体全部量化选项可进一步查阅 llama.cpp 源码中的ggml-quants.h头文件。)
从表中可以读出几条规律:
- 量化精度每提升一档,PPL 增量快速下降:从 Q2 到 Q8,体积只翻约 2.5 倍,而 PPL 增量从 0.87 一路降到 0.0004,压缩近 2000 倍;
- K 量化明显优于同位数的基础量化:同为 4bit,
Q4_K_M(0.0535)的 PPL 增量远低于Q4_0(0.2499); - Q5_K_M 是体积与质量的甜点:仅比 Q4_K_M 多约 0.65GB,PPL 增量却降低约 3.8 倍,这也是作者实测后最推荐的档位。
量化版本怎么选:从 Q2 到 Q8 的取舍
结合上表与部署实际,选择量化版本可以参考以下原则:
- 显存极紧张(如超大模型试运行):选
Q2_K级别的极限压缩,例如 unsloth 团队为 DeepSeek-V3 这类超大模型提供的Q2_K_M量化版本,实测是可用的; - 入门底线:至少选择
Q4_K_M版本——如果模型作者没有提供 Q5 量化版本,Q4_K_M 是保证质量与体积平衡的下限; - 质量优先(推荐):
Q5_K_M是绝大多数场景下的最优选,实际体验下来各种模型量化中这个版本最理想; - 显存充裕:
Q6_K(0.67% 的等效损失)甚至Q8_0(0.061%)几乎无损,显存富余时直接选; - 显存非常充裕:直接使用 FP16 原始权重,彻底避免量化损失。
其他量化格式:bf16、4bit、int4、fp8 呢?
除了 GGUF 的 K 量化命名,模型社区还有大量其他量化格式,它们的命名更直白:
- bf16:即 BF16,16bit 精度,动态范围与 FP32 相同、尾数精度较低,主要用于训练而非压缩存储;
- 4bit:即 4bit 量化,通常配合 GPTQ、AWQ 等先进量化算法,将浮点数映射到 [-8, 7] 的整数范围,压缩率可达 FP32 的 1/8;
- int4 / int8:整数量化,通过
value = (int_value - zero_point) * scale的缩放与零点映射实现,INT8 在带硬件加速单元的显卡上计算速度极快; - fp8:8 位浮点,分 E4M3 与 E5M2 两种变体,主要出现在训练与新一代 GPU 推理场景。
有了 K 量化的经验,这类命名很容易猜出来:bf16 是 16bit 精度,4bit 就是 4bit 精度。同样建议至少使用 4bit 量化的模型,除非模型特别大(200B+)——超大模型本身的冗余度更高,极限压缩带来的相对损失反而可以接受。
在真实项目中落地:GGUF 与 llama.cpp
量化精度讨论的载体,绝大多数是 GGUF 格式的模型文件。GGUF(GGML Universal File)是专为 LLM 设计的单文件格式,将权重、配置和分词器全部打包,支持 mmap 快速加载,是本地部署生态的事实标准(详见仓库中的什么是 GGUF)。你可以按照如何本地运行 GGUF 格式的 LLM 模型的完整流程实践一遍,核心步骤是:
- 下载量化模型:在模型仓库中选择自己需要的量化版本(如 Q8_0、Q5_K_M),只需下载单个
.gguf文件,无需全部下载; - 编译 llama.cpp:
git clone https://github.com/ggerganov/llama.cpp cd llama.cpp cmake -B build cmake --build build --config Release -j- 启动推理服务,通过
-m指定量化后的 GGUF 文件路径:
./build/bin/llama-server -m /data/unslouth/DeepSeek-R1-Distill-Qwen-32B-GGUF/DeepSeek-R1-Distill-Qwen-32B-Q8_0.gguf --host 0.0.0.0 --port 9990启动后,在浏览器访问指定 IP 和端口(如http://192.168.1.2:9990)即可对话。整个链路中,选择哪个量化版本直接影响你能在多大显存上跑起模型、以及输出质量损失多少——这正是本文前几节所有位宽与 PPL 知识落地的场景。
总结
量化是 LLM 从"数据中心专属"走向"个人电脑可跑"的关键技术。一句话记住本文的核心结论:
- 位宽决定体积:FP32 占 4 字节/参数,FP16 减半,4bit 量化进一步压缩到 1/4,这是"Q4 只有 Q16 的 1/4 大小"的根本原因;
- 命名即信息:
Q4_K_M= 4bit 精度 + K 量化方法 + 尺寸/PPL 平衡档位(0/1/XS/S/M/L); - PPL 是质量标尺:量化后缀的平衡档位本质就是在用困惑度权衡体积与质量;
- 选择有梯度:显存紧张选 Q2,底线至少 Q4_K_M,最推荐 Q5_K_M,显存充裕上 Q6_K / Q8_0;
- 生态可落地:GGUF 单文件格式 + llama.cpp 一条命令即可把量化模型跑成本地服务。
下次再看到Q4_K_M.gguf、bf16、fp8这样的命名时,你已经能准确说出它们背后的位宽、方法、权衡逻辑,以及它们在你自己的硬件上该怎么选。
- 文档
- 教程
- 技术博客
- 大模型
- 人工智能
【免费下载链接】one-small-step
这是一个简单的技术科普教程项目,主要聚焦于解释一些有趣的,前沿的技术概念和原理。每篇文章都力求在 5 分钟内阅读完成。
相关推荐
如何一键导出微信聊天记录:WeChatMsg完整备份与数据分析终极指南
如何一键导出微信聊天记录:WeChatMsg完整备份与数据分析终极指南 你是否曾担心珍贵的微信对话会随着手机更换而消失?那些与亲友的温馨对话、工作中的重要讨论、
大模型量化格式全解析:从FP16到GGUF,一文读懂模型压缩技术
大模型量化格式全解析:从FP16到GGUF,一文读懂模型压缩技术 在人工智能模型飞速发展的今天,大语言模型(LLM)的参数规模动辄数十亿甚至上千亿,这给模型的存
人工智能大模型(LLM/VLM含推理)深度学习BLAST社区贡献指南:如何参与开源项目的开发
BLAST社区贡献指南:如何参与开源项目的开发 BLAST作为开源的VMs as a service项目,为开发者提供了高性能的Web浏览AI服务引擎。本指南将
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考