# 10.4 模型量化：用更少的位数表示权重与激活值

## 10.4.1 量化的基本原理

**量化**（Quantization）将模型权重和/或激活值从高精度（如 FP16）转换为低精度（如 INT8 或 INT4），从而减少模型大小和内存带宽需求。

基本思想是将浮点值映射到一组离散的整数值。例如，INT8 量化将连续的浮点值映射到 256 个离散值（$$-128$$ 到 $$127$$）。主要的量化方案包括：

**训练后量化（Post-Training Quantization，PTQ）**：在训练完成后直接将权重量化，无需重新训练。代表方法有 GPTQ（基于二阶信息的逐层量化）和 AWQ（Activation-aware Weight Quantization，根据激活值分布识别对输出影响最大的权重维度——即“显著权重”（salient weights），对这些维度保留更高精度或跳过量化），通过分析权重分布和激活值来最小化量化误差。

**量化感知训练（Quantization-Aware Training，QAT）**：在训练过程中模拟量化误差，让模型学会适应低精度表示。精度更好但计算成本更高。

## 10.4.2 量化的精度影响

| 精度     | 每参数占用   | 相对于 FP16 的压缩比 | 精度损失 |
| ------ | ------- | ------------- | ---- |
| FP16   | 2 字节    | 1×            | 基准   |
| INT8   | 1 字节    | 2×            | 极小   |
| INT4   | 0.5 字节  | 4×            | 小到中等 |
| INT3/2 | <0.5 字节 | 5-8×          | 中到大  |

表 10-1：不同量化精度的对比

## 10.4.3 实际部署中的量化选择

INT8 量化通常对模型质量几乎无影响，已成为推理部署的标配。INT4 量化（如 GPTQ-4bit）在许多任务上精度损失可控，配合 AWQ 或 GPTQ 可将精度损失控制在可接受范围内，是显存受限场景的优选。

## 10.4.4 量化粒度：从张量级到块级

量化可以在不同粒度上应用，粒度越细越能保留异常值（Outlier），但也引入更多的缩放因子存储开销：

* **张量级量化**：对整个 QKV 张量计算单一缩放因子。实现简单但动态范围有限
* **通道级量化**：对张量内的每个特征向量分别计算缩放因子。平衡了精度与开销
* **块级量化**：在每个特征向量内部，将向量分为 N 个值的块，为每块独立计算缩放因子。精度最高，异常值保留能力最强

更细粒度的量化降低了异常值被平滑的风险，从而保持模型输出质量。然而，更多的缩放因子也意味着额外的存储和计算开销，工程中需要在质量与效率之间权衡。

## 10.4.5 组件敏感度层次

模型的不同组件对量化的敏感度差异显著，但不能简单按“是否属于参数”来判断。工程上通常要区分几类对象和路径：

1. **权重量化**（Weight-only）：只压缩线性层权重，部署最简单，是 INT4/GPTQ/AWQ 等方案的常见目标。
2. **权重 + 激活值量化**（W8A8/FP8）：同时压缩矩阵乘中的权重和运行时激活值，能真正利用低精度 Tensor Core，但需要处理激活异常值、动态缩放和校准/amax 跟踪。
3. **KV 缓存量化**：压缩每个请求运行时保存的 K/V，能提高并发和长上下文容量，对前缀缓存和分离式架构尤其有益；代价是缓存误差会被后续词元反复使用。
4. **注意力敏感路径**：logit、Softmax、归一化和部分输出层通常更敏感，常保留 BF16/FP16 或使用更保守的缩放策略。

即使在线性层中，模型的早期层（输入层）和晚期层（输出层）也常被保留为较高精度，因为这些层对最终输出和词表分布影响更大。

稳健的低精度推理方案通常会把权重、激活值、KV 缓存和注意力敏感路径分开配置。FP8 已成为高端 GPU 上的重要路线；MXFP8、NVFP4 等微缩放格式则与 Blackwell 及后续硬件、框架和 kernel 支持强相关，不能作为所有推理环境的通用默认。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/llm_internals/di-san-bu-fen-tui-li-yu-bu-shu-pian/10_inference_optimization/10.4_quantization.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
