vLLM-Omni 在线量化(Online Quantization)完全指南:加载期动态量化 FP8 / Int8 / MXFP8 / MXFP4
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
导读
本文聚焦 vLLM-Omni 的在线量化(Online Quantization)能力:在模型加载阶段实时计算量化权重与缩放因子,无需预先准备独立的量化 checkpoint,即可获得显存收益。文章完整覆盖在线量化的支持矩阵、Python API 与 CLI 配置方式、核心参数语义,并结合仓库源码(quantization 工厂、MXFP8 配置、MXFP4 配置、Int8 配置)深入讲解底层加载流程与平台分发机制,帮助读者在 Qwen-Image、Wan2.2 等扩散模型上正确启用并验证在线量化。
什么是在线量化
在线量化(Online Quantization)指的是 vLLM-Omni 在加载模型的过程中实时计算量化权重(quantized weights)与缩放因子(scales)的工作模式。它的核心价值在于:只需一份 BF16/FP16 原始 checkpoint,即可在启动阶段完成量化,省去单独准备量化 checkpoint 的全部预处理流程。
这一模式与"预量化 checkpoint 格式"有本质区别。GGUF、AutoRound、msModelSlim、序列化 TorchAO checkpoint、序列化 Int8 checkpoint 等格式均在服务启动前完成量化,权重与缩放因子直接存储在磁盘上,由各自方法专属的文档说明(参见 量化概览 中的模式对比表)。对于 MXFP8 与 MXFP4,本页负责说明从 BF16 checkpoint 出发的加载期量化;而由 msModelSlim 与合并工具产出的离线 checkpoint,则应遵循 MXFP8 与 MXFP4 页面中的离线模式说明。
从源码结构看,在线/离线两条路径共用同一套方法名(如mxfp8、mxfp4_dualscale),由配置中的is_checkpoint_*_serialized系列标志区分模式,get_quant_method()依据该标志选择对应的线性层实现。这一设计在 量化设计文档 的 "Online and pre-quantized checkpoints" 一节有明确阐述:方法配置拥有模式标志的所有权,加载器据此消费序列化张量或实时量化权重。
硬件支持矩阵
在线量化在不同硬件平台上的支持情况由方法实现内的平台检查决定(参见 量化设计文档 中 "Platform and parallelism boundaries" 一节——平台检查放在方法实现而非公共工厂中,以保证配置解析可移植)。当前各平台支持情况如下:
| 设备 | FP8 W8A8 | Int8 W8A8 | MXFP8 W8A8 | MXFP4 W4A4 |
|---|---|---|---|---|
| NVIDIA Blackwell GPU (SM 100+) | ✅ | ✅ | ⭕ | ⭕ |
| NVIDIA Ada/Hopper GPU (SM 89+) | ✅ | ✅ | ⭕ | ⭕ |
| NVIDIA Ampere GPU (SM 80+) | ✅ | ✅ | ⭕ | ⭕ |
| AMD ROCm | ⭕ | ⭕ | ⭕ | ⭕ |
| Intel XPU | ⭕ | ⭕ | ✅ | ⭕ |
| Ascend NPU | ❌ | ✅ | ✅ | ✅ |
图例:✅表示支持,❌表示不支持,⭕表示本指南未验证。Ampere 上的 FP8 在可用时会走 weight-only 路径。MXFP8 与 MXFP4 的文档说明面向 Ascend NPU 路径。
几点值得注意的源码级佐证与补充:
- Int8 同时覆盖 CUDA 与 Ascend NPU:从 DiffusionInt8Config.get_quant_method() 可以看出,非序列化(即在线)模式下,CUDA 平台选择
Int8OnlineLinearMethod,NPU 平台选择NPUInt8OnlineLinearMethod,其他平台直接抛出NotImplementedError。 - MXFP8 覆盖 NPU 与 Intel XPU:在 DiffusionMXFP8Config.get_quant_method() 中,NPU 在线路径使用
NPUMxfp8OnlineLinearMethod(基于npu_dynamic_mx_quant),XPU 在线路径则复用 vLLM 的Mxfp8OnlineLinearMethod内核并通过VllmMxfp8OnlineLinearMethod扩展了 3D 张量支持。 - MXFP4 的 NPU 与 ROCm 分支:在线 MXFP4 除 Ascend NPU 外,还在 ROCm 上提供了 gfx950(MI355X)路径(见 ROCmMxfp4OnlineLinearMethod),通过 AITER 的
gemm_a4w4实现 W4A4 在线量化;不过本指南的验证矩阵仍以 NPU 路径为主。
模型类型支持
在线量化在不同模型类型上的验证状态分为三类,均以扩散模型(Diffusion Model)为主要验证目标。
扩散模型(Qwen-Image、Wan2.2)
| 方法 | 指南 | 示例模型 | 状态 |
|---|---|---|---|
| FP8 W8A8 | FP8 | Qwen-Image;Wan2.2 未验证 | 已验证 Qwen-Image 系列及其他 DiT 模型 |
| Int8 W8A8 | Int8 | Qwen-Image;Wan2.2 未验证 | 已验证 Qwen-Image 与 Z-Image |
| MXFP8 W8A8 | MXFP8 | Wan2.2-T2V-A14B、Wan2.2-I2V-A14B、Wan2.2-TI2V-5B | 已在 Ascend NPU 与 Intel XPU 上验证 |
| MXFP4 W4A4 | MXFP4 | Wan2.2-T2V-A14B、Wan2.2-I2V-A14B | 仅 Ascend NPU;TI2V-5B 不支持 |
补充说明(来自方法页面的交叉信息):
- FP8 的
ignored_layers建议:Qwen-Image 在质量回退时建议跳过图像流 MLP(img_mlp),因为去噪 latent 范围随 timestep 漂移,深层 DiT 块中的小误差会累积(见 FP8 指南)。 - MXFP8 的级联模型处理:Wan2.2-T2V-A14B / I2V-A14B 是 MoE 级联模型,在线量化会同时量化
transformer与transformer_2两个 transformer(见 MXFP8 指南)。 - MXFP4 的 TI2V-5B 排除原因:Wan2.2-TI2V-5B 参数量过小,对 4-bit 量化噪声过于敏感,W4A4 会造成不可接受的精度损失,请改用 MXFP8(见 MXFP4 指南)。
多阶段 Omni/TTS 模型(Qwen3-Omni、Qwen3-TTS)
在线量化目前未对 omni/TTS 阶段进行验证。对于 Qwen3-Omni 及相关模型,当 checkpoint 可用时,优先采用 checkpoint 声明的 ModelOpt 或 AutoRound 路径(这两者属于预量化 checkpoint 模式)。这与 Int8 指南 中 "Multi-Stage Omni/TTS Model" 一节的结论一致:omni/TTS 阶段的量化作用域默认限定在 AR 语言模型阶段,且需要 checkpoint 内含受支持的quantization_config才会生效。
多阶段扩散模型(BAGEL、GLM-Image)
在线量化必须被路由到预期的 stage。BAGEL 与 GLM-Image 在列入受支持目标之前,需要先完成模型专属验证。这与 FP8 指南 中 "Multi-Stage Diffusion Model" 一节一致:量化需附加到指定 stage,而非全局应用。
配置方式
Python API
from vllm_omni import Omni omni_fp8 = Omni(model="<your-model>", quantization="fp8") omni_int8 = Omni(model="<your-model>", quantization="int8") omni_mxfp8 = Omni(model="<your-model>", quantization="mxfp8") omni_mxfp4 = Omni(model="<your-model>", quantization="mxfp4") omni_mxfp4_dualscale = Omni(model="<your-model>", quantization="mxfp4_dualscale")CLI
vllm serve <your-model> --omni --quantization fp8 vllm serve <your-model> --omni --quantization int8 vllm serve <your-model> --omni --quantization mxfp8 vllm serve <your-model> --omni --quantization mxfp4 vllm serve <your-model> --omni --quantization mxfp4_dualscale按组件路由(Per-component routing)
对于多组件流水线(如扩散 transformer + VAE),可以使用build_quant_config()构建按组件区分的量化配置:
from vllm_omni.quantization import build_quant_config config = build_quant_config({ "transformer": {"method": "fp8"}, "vae": None, })build_quant_config()的完整签名与解析逻辑见 factory.py:它接受None/"none"、方法名字符串、含method键的扁平字典、按组件区分的字典、既有QuantizationConfig对象等五种输入。其中:
- 字符串
"fp8"这类输入,会先查 Omni 覆盖表(_OVERRIDES),未命中再落到 vLLM 的量化注册表(QUANTIZATION_METHODS);未知方法会抛出ValueError并列出受支持方法。 - 按组件区分的字典会被识别为
ComponentQuantizationConfig,其判定逻辑_is_per_component_dict()要求字典不含method/quant_method键,且所有值均为 str、dict 或 None。
ComponentQuantizationConfig的路由规则(见 component_config.py):
- 组件键被解释为运行时层前缀(runtime layer-prefix);
- 最长前缀匹配优先(前缀按长度降序排列);
None值表示对匹配组件禁用量化(如示例中的"vae": None使 VAE 保持 checkpoint 精度);default键(如有)处理无显式匹配的前缀;- 匹配到的子配置正常委托其
get_quant_method(layer, prefix)。
需要特别留意:前缀匹配发生在模型权重名映射(WeightsMapper)之后。若映射后前缀不匹配,层会静默落入 default 配置。因此新增模型集成时必须验证实际运行时前缀(参见 量化设计文档 的 "Per-component routing" 一节)。
此外,build_quant_config()也支持在扁平字典中附加额外参数,例如:
config = build_quant_config( {"method": "fp8", "ignored_layers": ["img_mlp"]}, # 或直接传关键字参数 )方法别名是大小写不敏感且-/_等价的(例如auto-round与auto_round均归一到 INC/AutoRound 适配器)。若 checkpoint 的config.json中声明了quantization_config,resolve_quant_config_from_disk() 会在加载时进行元数据对账:无活动配置时自动检测;方法不匹配时直接报错(防止权重被静默错误解释);磁盘标记为序列化但活动配置为在线时自动重建为离线配置;ignored_layers不一致时按 checkpoint 重建。
核心参数详解
| 参数 | 适用方法 | 说明 |
|---|---|---|
method | FP8、Int8、MXFP8、MXFP4 | 量化方法:"fp8"、"int8"、"mxfp8"、"mxfp4"或"mxfp4_dualscale" |
ignored_layers | FP8、Int8、MXFP8、MXFP4 | 保持 BF16/FP16 精度的层名模式 |
activation_scheme | FP8、Int8 | 运行值"dynamic"选择在线激活缩放 |
weight_block_size | FP8 | 可选的按块(block-wise)FP8 权重量化大小 |
num_bf16_fallback_layers | MXFP4 DualScale | 在线mxfp4_dualscale模式下保持 BF16 的前置 transformer 块数量;默认5 |
各参数的源码级语义如下:
ignored_layers:在所有方法配置中生效。配置的get_quant_method()会调用is_layer_skipped(prefix, ignored_layers, fused_mapping),命中的层返回UnquantizedLinearMethod()(即保持 BF16 原权重),其余线性层才进入量化路径。可用名称取决于模型架构,例如to_qkv、to_out、img_mlp、txt_mlp(见 FP8 指南 参数表)。ignored_layers同样会经受WeightsMapper映射(apply_vllm_mapper),以保证与映射后的运行时前缀一致。
activation_scheme:对 Int8 而言,当前仅支持"dynamic"(在线激活缩放),静态方案会直接抛ValueError(见 int8_config.py 中ACTIVATION_SCHEMES = ["dynamic"]的约束);对 FP8 而言"dynamic"为默认且无需校准,"static"在具备校准缩放信息时可用(见 FP8 指南)。
num_bf16_fallback_layers(MXFP4 DualScale 在线模式):该参数仅在mxfp4_dualscale在线模式中生效。从 DiffusionMXFP4DualScaleMixedConfig.get_quant_method() 可以看出,在线路由按优先级应用三条规则:
- 显式
ignored_layers命中的层 → BF16(用户指定、可任意交错); - 块索引小于
num_bf16_fallback_layers的前置块(blocks.0.*~blocks.N-1.*,通过正则^blocks\.(\d+)\.解析)→ BF16; - 其余线性层 →
NPUMxfp4DualScaleOnlineLinearMethod。
默认值为5(__init__中num_bf16_fallback_layers: int = 5)。对 Wan2.2-A14B 的精度评估表明该默认值是合理起点(见 MXFP4 指南)。blocks.N.*之外的层(如condition_embedder)默认始终走在线 MXFP4,除非显式列入ignored_layers。
在线量化的底层工作原理
在线量化之所以能"加载即量化",依赖一整套按平台分发的线性层实现。以 NPU 上的 MXFP8 在线路径为例,其核心流程可以拆解为三个阶段(见 mxfp8_config.py):
1. 惰性权重创建(meta device + 补丁加载器):_LazyWeightMixin.create_weights()将权重先注册在 meta device 上,并包装一个补丁版weight_loader。当第一片loaded_weight到达时,参数在目标设备上即时物化(just-in-time materialization);随后每片权重通过CopyNumelCounter累计加载元素数,当_loaded_numel == weight.numel()时自动触发process_weights_after_loading()并置位_already_called_process_weights_after_loading防止重复处理。这一机制同样用于 Int8 与 MXFP4 的在线路径(int8_config.py 中的LazyWeightMixin还支持enable_offload_after_quant():每层量化完成后立即归还主机内存,把加载期设备占用封顶为单层规模)。
2. 权重实时量化:process_weights_after_loading()中调用 NPU 算子torch_npu.npu_dynamic_mx_quant(weight, dst_type=float8_e4m3fn),把 BF16/FP16 权重实时量化为 FP8 权重加 MX 缩放(每 32 个 K 维元素共享一个float8_e8m0fnu指数缩放),然后规整为与离线路径共享的规范 GEMM 布局(权重转置为(K, N),缩放重塑为(S/2, N, 2))。
3. 前向量化算子:_quantize_activation()与_quant_matmul()分别对激活做动态 MX 量化并调用npu_quant_matmul完成 W8A8 量化 GEMM。MXFPLinearMethodBase.apply()提供了平台无关的骨架:展平 →_apply_inner→ 还原形状,子类只需实现量化/矩阵乘两个钩子(或像 dual-scale 那样重写_apply_inner)。
MXFP4 在线路径与此同构,差异在于精度为float4_e2m1fn_x2(FP4 打包、每字节两个值)、权重不做预转置(打包张量转置不保证连续)、GEMM 需显式指定x1_dtype/x2_dtype(见 mxfp4_config.py)。mxfp4_dualscale在线模式则使用npu_dynamic_dual_level_mx_quant实时计算细粒度(per-32)与粗粒度(per-512)两级缩放,无校准mul_scale时以单位向量填充(见 NPUMxfp4DualScaleOnlineLinearMethod)。
Int8 在线路径在 CUDA 上通过ops.scaled_int8_quant生成量化权重与权重缩放(见 Int8OnlineLinearMethod),在 NPU 上通过torch_npu.npu_dynamic_quant实现,并受NPU_QUANT_MATMUL_MAX_OUT_FEATURES = 65535上限约束——输出维度超过该限值的层会在 TP 分片后仍超限时自动回退为未量化层(日志警告并建议提高 TP 度数使该层回到范围内,见 int8_config.py)。
FP8 在线路径本身经由 vLLM 注册表解析(Omni 未为其注册覆盖项),Blackwell 上还可在安装可选quack内核后自动融合alpha * (A @ B) + bias,进一步提升视频 DiT 小 GEMM 场景的性能(详见 FP8 指南 的 "Faster FP8 GEMM on Blackwell" 小节)。
分布式场景的边界:在线量化生成的权重与缩放是在普通加载器中创建的,因此直接 checkpoint mmap(--enable-distributed-layerwise-offload的直读路径)无法准备在线量化张量。per-tensor 在线 FP8 可与 DLO 的默认 AllGather 路径组合(各 rank 先经由普通加载器生成最终 FP8 权重再分片),其他在线方法在打包与缩放布局验证完成前仅限--dlo-no-use-allgather(见 量化设计文档 的 "Platform and parallelism boundaries" 一节)。
验证与注意事项
- 对比 BF16 基线:将在线量化输出与相同种子(seed)和生成参数下的 BF16 基线进行对比,确认质量损失在可接受范围内。仓库提供了专门的轨迹相似度对比工具
vllm_omni/quantization/tools/compare_diffusion_trajectory_similarity.py(入口与参数见其parse_args()),例如:
python -m vllm_omni.quantization.tools.compare_diffusion_trajectory_similarity \ --task t2i \ --model Qwen/Qwen-Image \ --candidate-quantization fp8 \ --ignored-layers img_mlp \ --prompt "a cup of coffee on the table" \ --height 512 --width 512 \ --num-inference-steps 20 \ --seed 142 \ --output-json /tmp/qwen_image_fp8_similarity/result.json \ --save-output-dir /tmp/qwen_image_fp8_similarity/images \ --enforce-eager该工具使用相同 prompt、种子、分辨率、调度器设置与推理步数,对比参考运行与量化候选运行,报告cosine_similarity、mae、mse/rmse、max_abs、l2/relative_l2、psnr_db以及生成时延与峰值显存等指标(详见 量化概览 的 "Output Similarity Comparison Tool" 一节,其中给出了建议的起步阈值,如psnr_db >= 20.0、cosine_similarity >= 0.98)。
使用
ignored_layers保护敏感层:对质量敏感的 MLP 或输出投影层(如img_mlp、to_out)建议通过ignored_layers保留 BF16。FP8 指南指出,图像流 MLP 是常见敏感目标,因为去噪 latent 范围随 timestep 漂移,深层 DiT 块中逐层小误差会累积放大。文档化跳过层:在把新模型标记为受支持之前,先在对应方法页面记录任何必需的跳过层(
ignored_layers选择)。已有量化权重的模型请走预量化路径:如果模型本身已携带量化权重,应使用匹配的预量化方法指南(如 ModelOpt、AutoRound、序列化 Int8、msModelSlim、离线 MXFP8/MXFP4 DualScale),而非在线量化。源码层面,
resolve_quant_config_from_disk()会在 checkpoint 声明序列化标志但活动配置为在线时自动重建为离线配置;方法不匹配时则直接报错而非隐式转换。Ascend MXFP4 生产部署建议:当生产质量比避免预处理更重要时,优先使用离线
mxfp4_dualscalecheckpoint。离线 checkpoint 从磁盘加载经校准的mul_scale张量,精度可测优于任何在线方法(见 MXFP4 指南 的推荐框);在线mxfp4_dualscale由于没有校准mul_scale,两级缩放均为实时计算。另需注意:在线单尺度mxfp4与离线双尺度mxfp4_dualscale的加载方法不可混用,否则会产生错误结果或形状错误。
小结
在线量化是 vLLM-Omni 在"无需预处理、开箱即省显存"场景下的首选路径:FP8 与 Int8 面向 NVIDIA CUDA 平台(Ampere 及以上),MXFP8 面向 Intel XPU 与 Ascend NPU,MXFP4 目前仅验证于 Ascend NPU。它通过统一的quantization="<method>"入口与build_quant_config()组件路由机制接入任意流水线,底层由_LazyWeightMixin+ 平台专属process_weights_after_loading实现"边加载边量化",并在ignored_layers、num_bf16_fallback_layers等参数配合下为质量敏感层保留 BF16。启用任何新模型前,务必使用轨迹相似度工具对照 BF16 基线完成数值验证,并在方法页面记录必需的跳过层。
更进一步,读者可结合 量化设计文档 了解配置解析、组件路由与 checkpoint 元数据对账的完整架构;结合 FP8、Int8、MXFP8、MXFP4 各方法页获取模型级验证细节与离线模式指引。
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考