跳到内容

在线量化

在线量化允许您在加载时将 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>, ...]

linearmoe 接受一个完整的 {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 激活值。

vllm serve openai/gpt-oss-20b --quantization-config.moe.activation mxfp8

结合 --moe-backend 使用以固定特定的内核系列。

Dense 层和 MoE 层的独立方案

您可以通过 linearmoe 字段对密集线性层 (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_projk_projv_projqkv_proj),忽略模式必须匹配**未融合**的分片名称(q_projk_projv_proj),而不是融合后的名称。