Appearance
量化系统 — 概念
量化方法分类
量化框架架构
核心接口
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.py、online/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 近似的后训练量化:
- 逐层量化:每层独立处理
- 使用校准数据计算 Hessian
- 量化每个权重时补偿对未量化权重的影响
- 支持 2/3/4/8 bit,通常使用 4 bit
AWQ
激活感知权重量化:
- 观察激活值分布,识别重要权重通道
- 对重要通道使用更高的缩放因子
- 保护对激活值敏感的权重
- 通常 4 bit,精度接近 FP16
- 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(报错中止,而非仅警告)。相关删除:
CompressedTensors24scheme 类supports_cutlass_24()方法sparsity_scheme_map和sparsity_ignore_list配置字段
AWQ-Marlin 统一到 Oracle
AWQ-Marlin MoE 的权重处理现在委托给 oracle 层的 convert_to_wna16_moe_kernel_format(),去除了直接调用 ops.awq_marlin_moe_repack、marlin_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.py | Humming 第三方混合精度 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.py | AWQ(重命名自 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 之前)时由 EmulationNvFp4LinearKernel(kernels/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 也整体迁到 QuantKey(weight_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。
权重加载流程
相关概念
- MoE — MoE 模型也可以使用量化
- Tensor Parallelism — 量化与张量并行的兼容
- torch compile — 编译优化与量化的协同