Prhub

#35859 [Quark] Support loading Quark NVFP4 checkpoints in vLLM

原始 PR 作者 fxmarty-amd 合并时间 2026-05-14 02:17 文件变更 6 提交数 112 评论 23 代码增减 +503 / -4

执行摘要

支持加载 Quark NVFP4 检查点

Quark (amd/Quark) 的实验性 NVFP4 支持可用于导出 NVFP4 检查点。本 PR 使 vLLM 能直接加载这些检查点,无需重新导出或转换,从而扩展了 vLLM 支持的量化格式生态。

该 PR 设计清晰,复用现有 NVFP4 内核基础设施,整体风险可控。推荐阅读 QuarkNVFP4 的实现,了解多级量化方案扩展的方法论。对于使用 Quark 的用户,该 PR 是运行 NVFP4 模型的关键入口。

讨论亮点

讨论中最核心的问题是关于 emulation_dequantize_weights 参数设计。Kyle Sayrs 在 review 中指出,引入该参数会导致公共函数接口膨胀,建议改为独立的联机反量化方案。作者最终采纳,将其移除从而简化了 emulation 分支。另一关键讨论是自动评测生成的 scale 反转问题(Gemini Code Assist 指出 critical 错误),作者在后续提交中已修正。此外,围绕并行层全局尺度不一致的警告详细度也有改进。

实现拆解

  1. 新增量化方案类 (quark_nvfp4.py):定义 QuarkNVFP4,继承 QuarkScheme,指定 NVFP4 权重的张量布局——uint8 打包的 FP4、per-group scale (fp8_e4m3fn)、全局 weight/input scale (fp32)。通过 create_weights 注册参数,process_weights_after_loading 处理全局尺度的聚合与一致性检查。

  2. 自动检测 NVFP4 配置 (quark.py):添加 _is_nvfp4 方法,根据 Quark 配置中权重和激活的量化结构(两层列表:首元素 fp4 per_group 且 group_size=16,次元素 fp8 per_tensor)来识别 NVFP4 格式。在 _get_scheme_from_config 中优先检测 NVFP4,以选择 QuarkNVFP4

  3. MoE 方案扩展 (quark_moe.py):新增 QuarkNvfp4MoEMethod,引入 fused_moe/oracle/nvfp4 模块的 select_nvfp4_moe_backendmake_nvfp4_moe_quant_config 等接口,完成 MoE 层的权重创建、后处理和前向 apply。在 get_moe_method 中添加 _is_nvfp4 分支。

  4. 测试集成 (test_quark.py):添加 test_nvfp4_wikitext_correctness 测试,对 amd-quark/Qwen3-30B-A3B-nvfp4-quark 模型在 tp=1,2 下验证 perplexity 在允许容差内。

  5. 工具方法调整 (utils.py):修复 deep_compare 对字典列表的比较逻辑,以正确匹配量化配置。

文件 模块 状态 重要度
vllm/model_executor/layers/quantization/quark/schemes/quark_nvfp4.py 量化方案 added 9.04
vllm/model_executor/layers/quantization/quark/quark_moe.py MOE 量化 modified 8.73
vllm/model_executor/layers/quantization/quark/quark.py 配置识别 modified 7.0
tests/quantization/test_quark.py 测试 modified 5.24

关键符号

QuarkNVFP4.__init__ QuarkNVFP4.get_min_capability QuarkNVFP4.create_weights QuarkNVFP4.process_weights_after_loading QuarkNVFP4.apply_weights QuarkConfig._is_nvfp4 QuarkNvfp4MoEMethod.__init__ QuarkNvfp4MoEMethod.create_weights QuarkNvfp4MoEMethod.process_weights_after_loading QuarkNvfp4MoEMethod.get_fused_moe_quant_config QuarkNvfp4MoEMethod.apply test_nvfp4_wikitext_correctness

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

emulation_dequantize_weights 参数设计与方案拆分 设计

Kyle Sayrs 在 review 中指出,引入 emulation_dequantize_weights 参数会导致公共函数接口膨胀,建议改为独立的联机反量化方案。作者后续移除了该参数,将模拟路径与原生路径通过不同的 scheme 类分离。

结论:已解决,参数移除,采用独立方案。 · 已解决

权重全局尺度反转逻辑正确性 正确性

Gemini Code Assist 指出 quark_nvfp4.py 中 weight_scale_2 的倒置逻辑在原生后端与模拟后端方向相反,可能导致错误输出。作者在后续提交中修复。

结论:已解决,反转逻辑已修正。 · 已解决

并行层全局尺度不一致警告详细度 正确性

在 process_weights_after_loading 中,对 q/k/v 投影层等并行层的 weight_scale_2 不相等时仅打印 warning。Kyle Sayrs 建议提高警告详细度,作者已改进。

结论:已解决,警告信息更精确。 · 已解决

风险与影响

  • quark_nvfp4.pyprocess_weights_after_loading 对并行层全局尺度不做严格对齐,仅 warning,可能导致精度退化。
  • 测试仅覆盖模拟后端 (EmulationNvFp4LinearKernel),原生 NVFP4 内核路径未验证。
  • _is_nvfp4 的检测依赖 Quark 配置字典的具体结构,若 Quark 库未来调整格式,可能失效。
  • 权重尺度倒置逻辑的修正可能导致未知回归,需关注后续测试反馈。

用户现在可以加载使用 Quark 量化工具生成的 NVFP4 模型,无需额外转换。该功能扩大了 vLLM 的量化模型生态,尤其对 AMD 用户(Quark 主要支持 ROCm)和 NVIDIA 用户(NVFP4 原生)均有价值。但对已有 NVFP4 内核(非模拟)的验证仍在进行中。

权重尺度倒置可能的回归 并行层全局尺度不一致降精度 仅模拟后端验证 Quark 配置格式变化风险

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论