KV Cache 与数值精度
同一模型采用不同权重精度或 KV Cache 精度时,KV Cache 的显存占用、容量、性能和精度有什么区别?控制精度的三个参数
讨论“不同精度”时,需要先区分精度作用在哪类数据上。vLLM 使用下面三个参数分别配置模型的基础浮点精度、权重量化方法和 KV Cache 精度。它们控制的对象不同,对 KV Cache 的影响也不同。
未显式设置
--quantization 时,vLLM 会读取 checkpoint 中的 quantization_config。--quantization awq 通常用于加载已经完成 AWQ 量化的 checkpoint,不会在服务启动时执行需要校准数据的 AWQ 量化。
以 --quantization awq --dtype float16 为例:
- 量化层权重:AWQ W4A16 通常以 Linear 层为量化目标,将其权重保存为 INT4,并按组保存 scale;非对称量化还会保存 zero point。在常见 Llama 类模型中,这些层包括 Attention 的
q_proj、k_proj、v_proj、o_proj和 MLP 的gate_proj、up_proj、down_proj。
量化 scale 和 zero point 是什么?
量化 scale 和 zero point 是什么?
INT4 只能保存 例如:通常是一组权重共享一套 scale 和 zero point,例如每 128 个权重为一组,而不是为每个权重分别保存。对称量化一般不需要单独保存 zero point。
0~15 这样的离散整数。scale 表示相邻两个量化值之间的步长,zero point 表示浮点数 0 对应哪个 INT4 数值。量化 kernel 使用下面的公式近似还原浮点权重:- 激活:W4A16 中的 A16 表示激活使用 16 位浮点格式。在这个示例中,
--dtype float16使 Linear 层的输入和输出激活使用 FP16。量化 kernel 在矩阵乘法过程中读取 INT4 权重和 scale,不会把整份权重长期展开成 FP16 保存在显存中。 - 未量化权重:未被 AWQ 选中或通过
ignore排除的权重仍使用基础浮点 dtype。在本例中,--dtype float16将这些权重设置为 FP16。
KV Cache 显存计算
对于结构统一且 Batch 内序列长度相同的 Decoder-only MHA 或 GQA 模型,KV Cache 主体显存可以用下面的公式估算:
可以使用 Modular LLM Inference Handbook 的 KV Cache 计算说明对照标准公式,也可以通过 KVCache.AI Calculator选择具体模型、序列数量和 KV 精度进行估算。
