在线量化¶
在线量化允许您在加载时将 BF16/FP16 模型将其 Linear 和 MoE 权重转换为更低精度(如 FP8),而无需预量化的检查点或校准数据。权重在模型加载期间进行转换,激活值在每次前向传递中动态缩放。
快速入门¶
将方案名称传递给 quantization 参数
from vllm import LLM
# Per-tensor FP8 quantization (one scale per weight tensor)
llm = LLM("meta-llama/Llama-3.1-8B", quantization="fp8_per_tensor")
# Per-block FP8 quantization (128x128 block scaling for weights and 1x128 block scaling for activations)
llm = LLM("meta-llama/Llama-3.1-8B", quantization="fp8_per_block")
# MXFP8 quantization for weights and activations
llm = LLM("meta-llama/Llama-3.1-8B", quantization="mxfp8")
或者通过 CLI 命令行
vllm serve meta-llama/Llama-3.1-8B --quantization fp8_per_tensor
vllm serve meta-llama/Llama-3.1-8B --quantization fp8_per_block
vllm serve meta-llama/Llama-3.1-8B --quantization mxfp8
支持的方案¶
| Scheme | 权重配方 (Weight recipe) | 激活值配方 (Activation recipe) | 注意事项 |
|---|---|---|---|
fp8_per_tensor | fp8_e4m3 数据,fp32 per-tensor 缩放 | fp8_e4m3 数据,fp32 per-tensor 缩放 | 在某些 GPU(Ada、Hopper)上,线性激活使用 per-token 缩放以获得更好的性能 |
fp8_per_block | fp8_e4m3 数据,fp32 per-128x128-block 缩放 | fp8_e4m3 数据,fp32 per-1x128-block 缩放 | |
mxfp8 | fp8_e4m3 数据,e8m0 per-1x32-block 缩放 | fp8_e4m3 数据,e8m0 per-1x32-block 缩放 | w8a8 需要 SM 100+(Blackwell 或更新版本),其他 GPU 使用 w8a16 回退方案 |
高级配置¶
如需精细控制,请使用 quantization_config 字典。
Schema¶
quantization_config:
linear:
weight: <name> # see QUANT_KEY_NAMES in vllm/config/quantization.py
activation: <name>
moe:
weight: <name>
activation: <name>
ignore: [<layer-name-or-regex>, ...]
linear 和 moe 接受一个完整的 {weight, activation} 字典,或一个裸字符串。字符串首先根据 --quantization 简写进行解析(采用匹配的层类型槽位),然后作为权重名称对照 QUANT_KEY_NAMES 解析。未设置的字段将回退到 --quantization 简写的默认值,或者对于已量化的检查点,回退到检查点声明的任何值。
在 XPU 上,非块级 (non-block) FP8 scaled-mm 线性层默认为 W8A16;设置 --linear-backend xpu 将强制使用 W8A8。使用 --linear-backend xpu_woq 来显式选择仅权重算法 (W8A16)。
CLI 接受 JSON 格式或点分键 (dotted keys) 格式的参数
vllm serve <model> --quantization-config '{"moe":{"activation":"mxfp8"}}'
vllm serve <model> --quantization-config.moe.activation mxfp8
已量化检查点的激活值覆盖¶
对于检查点已量化的模型,quantization_config 允许您独立于内置权重选择激活格式。支持的覆盖取决于特定的检查点;目前这已支持 MXFP4 MoE 检查点 (gpt-oss),您可以选择启用 FP8 激活值。
结合 --moe-backend 使用以固定特定的内核系列。
Dense 层和 MoE 层的独立方案¶
您可以通过 linear 和 moe 字段对密集线性层 (dense linear layers) 和 MoE 专家层应用不同的量化方案。每个字段都接受完整的规格字典,或者是一个在线量化简写名称(如 "fp8_per_block")或权重格式(如 "fp8_per_block_static");未设置的字段将回退到简写默认值。
from vllm import LLM
# Linear: per-block FP8; MoE: per-tensor FP8 (inherited from the shorthand)
llm = LLM(
"ibm-granite/granite-3.0-1b-a400m-base",
quantization="fp8_per_tensor",
quantization_config={
"linear": "fp8_per_block",
},
)
或者,
from vllm import LLM
# Linear: per-tensor FP8 (inherited); MoE: per-block FP8
llm = LLM(
"ibm-granite/granite-3.0-1b-a400m-base",
quantization="fp8_per_tensor",
quantization_config={
"moe": "fp8_per_block",
},
)
从量化中排除特定层¶
使用 ignore 参数跳过特定层。它接受精确的层名称和正则表达式模式(以 re: 为前缀)
from vllm import LLM
llm = LLM(
"ibm-granite/granite-3.0-1b-a400m-base",
quantization="fp8_per_tensor",
quantization_config={
"ignore": [
# exact layer name
"model.layers.1.self_attn.o_proj",
# regex: skip all QKV projections
"re:.*[qkv]_proj",
],
},
)
注意
对于融合层(例如融合了 q_proj、k_proj、v_proj 的 qkv_proj),忽略模式必须匹配**未融合**的分片名称(q_proj、k_proj、v_proj),而不是融合后的名称。