Skip to content

量化系统 — 概念

量化方法分类

量化框架架构

核心接口

python
class QuantizeMethodBase(ABC):
    @abstractmethod
    def create_weights(self, layer, *weight_args, **extra_weight_attrs):
        """为层创建量化权重"""
        ...

    @abstractmethod
    def apply(self, layer, *args, **kwargs) -> torch.Tensor:
        """将层中的量化权重应用到输入张量(量化 forward)"""
        ...

    def process_weights_after_loading(self, layer) -> None:
        """权重加载后处理(如重排、缩放),默认空实现"""
        ...

主流量化方法详解

FP8 量化

FP8(E4M3/E5M2)是 NVIDIA Hopper (H100) 原生支持的格式:

  • E4M3:用于前向传播(权重和激活)
  • E5M2:用于反向传播(梯度)
  • 几乎无精度损失(相比 FP16)
  • 需要 H100/RTX 4090+ 硬件支持(compute_capability >= 8.9
  • TorchAO 后端现在在初始化时验证 GPU 能力,不支持的设备给出清晰的降级建议
  • 旧的在线 FP8 MoE 量化类已弃用,逻辑迁移到 quantization/online/ 子包(online/fp8.pyonline/moe_base.py

NVFP4 量化

NVFP4 是最新的超低精度格式:

  • W4A4 NVFP4:权重和激活都使用 4-bit 浮点
  • W4A16 NVFP4:权重 4-bit,激活 16-bit(混合精度模式)。FlashInfer B12x 是其主力后端,对 W4A16 checkpoint 在 kernel 内合成 uniform-1.0 激活缩放
  • SwiGLU clamp:NVFP4 MoE 引入 SwiGLU clamp(swiglu_limit/alpha/beta),Marlin 路径为非 Blackwell 平台补齐 clamp;oracle/nvfp4.py 对 clamped model 在不支持 clamp 的后端上明确报错并建议 flashinfer_trtllm
  • 支持 MoE 模型的融合量化 + dispatch
  • 批量不变式内核消除了 padding 开销

GPTQ

基于 Hessian 近似的后训练量化:

  1. 逐层量化:每层独立处理
  2. 使用校准数据计算 Hessian
  3. 量化每个权重时补偿对未量化权重的影响
  4. 支持 2/3/4/8 bit,通常使用 4 bit

AWQ

激活感知权重量化:

  1. 观察激活值分布,识别重要权重通道
  2. 对重要通道使用更高的缩放因子
  3. 保护对激活值敏感的权重
  4. 通常 4 bit,精度接近 FP16
  5. AWQ-Marlin MoE 现在通过 oracle 层统一处理权重转换,去除了直接调用底层 kernel 的代码

量化对性能的影响

方法显存节省推理加速精度损失
FP8~50%1.5-2×极小
NVFP4 (W4A4)~87%1.5-2.5×
NVFP4 (W4A16)~75%1.3-2×
GPTQ-4bit~75%1.2-1.5×
AWQ-4bit~75%1.3-1.8×

量化框架变更

Compressed Tensors 稀疏性(2:4)移除

Compressed Tensors 框架移除了 2:4 稀疏性支持。检测到稀疏配置(非空 sparse_scheme_map)时直接 raise DeprecationWarning(报错中止,而非仅警告)。相关删除:

  • CompressedTensors24 scheme 类
  • supports_cutlass_24() 方法
  • sparsity_scheme_mapsparsity_ignore_list 配置字段

AWQ-Marlin 统一到 Oracle

AWQ-Marlin MoE 的权重处理现在委托给 oracle 层的 convert_to_wna16_moe_kernel_format(),去除了直接调用 ops.awq_marlin_moe_repackmarlin_moe_permute_scales 等底层函数的代码(awq_marlin.py 已重命名为 auto_awq.py,仅做委托)。所有 WNA16 格式(AWQ、GPTQ)的权重转换逻辑集中到 oracle/int_wna16.py,通过 WNA16MoEBackend 枚举与 select_wna16_moe_backend() 按硬件/精度排序,Marlin、FlashInfer、CPU、XPU 四套 _process_weights_* 实现集中在同一文件。

量化目录重组与新增后端

v0.23 把量化实现按来源重组为子包:

子包/文件说明
quantization/online/在线量化(FP8/INT8/MXFP8,含 MoE 专用基类 online/moe_base.py
quantization/inc/Intel INC 量化,引入 INCScheme orchestrator
quantization/turboquant/NVIDIA TurboQuant(centroid-based)
quantization/humming.py + kernels/linear/mixed_precision/humming.pyHumming 第三方混合精度 GEMM:支持 2/3/4/5/6/7-bit 等任意位宽的对称分组 pack-quantized 仅权重量化,激活保持 BF16/FP16;亦可用作 MoE 后端(--moe-backend humming,经 VLLM_HUMMING_MOE_GEMM_TYPE 选 indexed/grouped GEMM)
quantization/auto_awq.pyAWQ(重命名自 awq_marlin.py,委托 oracle)

其他扩展:modelopt_mixed 量化从 Hopper 扩展支持到 SM75(Turing)/SM80/SM86(Ampere);新增 FlashInfer CuTeDSL NVFP4 GEMM 后端(flashinfer_cutedsl_*_moe.py)与 MXFP8 linear kernel。NVFP4 在无原生硬件(Blackwell 之前)时由 EmulationNvFp4LinearKernelkernels/linear/nvfp4/emulation.py + quantization/utils/nvfp4_emulation_utils.py)提供 Triton 软件模拟 —— 其融合反量化内核用内联位构造(0x3F000000 + mag << 22)把 4-bit nibble 解码为 float32,并按 block 乘 FP8 scale,避免单独的反量化 kernel。

OCP MX(Microscaling):OCP 微缩放格式(mxfp4/mxfp8/nvfp4)用 block 间共享的 float8e8m0(仅指数)scale 因子(MXFP_SCALE_DTYPE = torch.uint8)表示,GPT-OSS 系模型用 mxfp4 MoE。曾一度把 EMULATION 软件模拟后端从 GPT-OSS MXFP4 的可用列表移除、要求非 gfx950 硬件显式 --moe-backend emulation;现又把 Mxfp4MoeBackend.EMULATION 加回 oracle/mxfp4.py 的优先级列表(PR #46629),使无原生 MX 支持的 GPU 自动回退到 Triton 模拟而无需手动指定。

CPU INT8 W8A8 MoE:compressed-tensors 的 INT8 W8A8 MoE(per-channel 静态权重 + per-token 动态激活)现支持 CPU,权重经 Intel VNNI 预打包(torch.ops._C.convert_weight_packed),由 CPUExpertsInt8 + fused_experts_cpu(is_vnni=True) 执行;oracle 的 Int8MoeBackend.CPU 在 CPU 平台优先(PR #42920)。CPU fused MoE 的 SiLU 激活也修为直接复用 SiluAndMul.forward_native 绑定方法,避免每次调用新建对象(PR #45961)。

GGUF 已移出主包

GGUF 量化支持已从 vLLM 主包中完全移除(不再内置 GGUF loader / 量化实现;包内无任何 *gguf* 源码)。早期曾迁移为独立 plugin(commit 6635279d8),现已不在仓库内维护。

ModelOpt QuantKey 重构(#49381)

quantization/modelopt.py 完成了一次大规模类结构重设计:删掉 ModelOptFp8LinearMethod / ModelOptNvFp4LinearMethod / ModelOptNvFp4W4A16LinearMethod 等一堆 per-algo 线性方法类,统一为单一 ModelOptLinearMethod,由 QuantKeyScheme 子类(KNvfp4Static / KNvfp4Dynamic / KFp8StaticTensor / KFp8StaticChannel / KFp8Block128 / KMxfp8Static / KDynamicNoParam——即 weight/activation 两个 quant key 的组合)+ FormatScheme 描述算法形态;resolve(algo, subcfg, prefix) 按 prefix + checkpoint 子配置(CkptCtx/RuntimeDtypes/Shapes)选 kernel。Quark 也整体迁到 QuantKeyweight_quant_key/act_quant_key)驱动(#52958)。后续:部分预量化 checkpoint 的在线量化(#51392)、Fast Start 跨进程 IPC 权重缓存(#54921,model_loader/weight_cache/ 的 daemon + ipc_loader,加速重启)。

本期其它量化进展

  • AMD Quark per-block FP8 fused MoE(#52263):quark/quark_moe.py 支持 128×128 per-block weight scale 的 QuarkW8A8Fp8MoEMethod 走 fused MoE(要求 dynamic group activation),per-block scale 注册为 weight_scale 参数。
  • NVFP4 内核优先级修正(#55170):kernels/linear/_POSSIBLE_NVFP4_KERNELS 中 W4A4 内核(FlashInfer Cutlass/B12x、Cutlass)必须排在 W4A16 之前——队首 W4A4 被 gate 到 sm_10x 时,SM120/121(RTX 50 系)上若 W4A16 排前会错选 weight-only 路径。
  • compressed-tensors WNA16 MoE(#53163):per-channel checkpoint 的 group_size=None 在 Marlin 路径会 TypeError,现规范化 unset group_size(Marlin 视 -1 合法);老的 compressed_tensors_moe_wna16_marlin.py 删除统一进 moe_wna16
  • 在线 MXFP4 量化(online/mxfp4.py,#49347)、Humming MXFP4 weight + block-FP8 activation MoE(#51332)、AutoRound block-wise FP8 与 2/3/5/6/7-bit CUDA、INC int4 W4A8、b12x FP4 MoE backend、FlashInfer CuTeDSL w4a16 linear。

权重加载流程

相关概念