[Bug]: Nemotron-3-Super-120B NVFP4 generation degenerates on recent `main` — bisected to #46756

用户使用 vLLM main 分支推理 nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4 模型(NVFP4 量化),在贪婪解码( temperature=0 )下,短文本回答基本正确,但需要多步推理的复杂问题(如 GSM8K)输出崩溃为重复乱码。同一环境中

快速结论:此 Bug 出现在 vLLM main 分支(约 0.22.1rc1.dev)上,加载 nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4 模型进行多步推理时,输出会退化为重复/无意义内容。优先排查 #46756 引入的 parent-prefix fallback 逻辑是否错误地将 Mamba 层(conv1dnorm)的量化算法从 bf16 提升为 FP8。

问题场景

用户使用 vLLM main 分支推理 nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4 模型(NVFP4 量化),在贪婪解码(temperature=0)下,短文本回答基本正确,但需要多步推理的复杂问题(如 GSM8K)输出崩溃为重复乱码。同一环境中,nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4 模型不受影响。

报错原文

Prompt: "What is 2+2? Reply with just the number."
Output on recent main: "The answer is 4. The the answer is the."

Prompt: "Name the largest planet in our solar system."
Output: "...Jupiter... The largest planet in the the world is a giant planet..."

Prompt: "A shop has 5 apples and sells 2. How many remain?"
Output: "The answer is 2. The number of oranges is 1... 1000000000000..."

原因分析

通过 git bisect 定位到 #46756debec6440)是引入退化的提交。该提交修改了共享的 ModelOpt-NVFP4 量化路径,在 ModelOptMixedPrecisionConfig._resolve_quant_algo 中增加了步骤4的 “parent-prefix fallback” 逻辑。该步骤没有像步骤2那样使用 packed_modules_mapping 守卫,因此对每个前缀都会触发,导致 MIXED_PRECISION 检查点中的 Mamba 层(conv1dnormgate)被错误地从 bf16 提升为 FP8 量化。量化 causal-conv1d 和 norm 会破坏 Mamba 混合器,从而造成随序列长度积累的生成退化。

Nano 模型是纯 NVFP4(非 MIXED_PRECISION),不会进入此路径,因此不受影响。

环境排查

  • vLLM 版本:main 分支(~0.22.1rc1.dev),复现涉及 ac521f6238cf7c4d8a
  • PyTorch 版本2.11.0+cu130
  • CUDA 版本:13.0。
  • FlashInfer 版本:0.6.12/0.6.13(已排除依赖变更影响,保持不变)。
  • GPU 架构:sm120(RTX PRO 6000)和 sm121(DGX Spark/GB10)均已复现,非硬件特定。
  • 模型名称
    • 受影响:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4
    • 不受影响:nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4
  • 推理配置moe_backend=marlinlinear_backend=cutlass,默认 fp8 KV 缓存。但问题源自 MoE 后端上游的量化路径,因此不是后端特定的。

解决步骤

注意:以下修复基于 Issue #47241 中的 PR #47445,它与 #47354 有实质区别。 #47445 移除了 parent-sibling 推断,并为 MiniMax-M3 显式添加了 packed 映射。在 B300 上验证通过。

  1. 定位文件 vllm/model_executor/layers/quantization/modelopt.py
  2. 找到 ModelOptMixedPrecisionConfig._resolve_quant_algo 方法中的步骤4(parent-prefix fallback)。
  3. 当前 #47354 的修复是为步骤4添加 packed_modules_mapping 守卫(与步骤2一致),防止未注册的 sibling 层被错误继承量化算法。但 #47354 对 Qwen3.6 仍会导致退化。
  4. 推荐采用 #47445 的方案
    • 移除 parent-sibling 推断逻辑(步骤4的内容)。
    • 为 MiniMax-M3 模型显式添加 qkv_proj / gate_up_proj 的 packed 映射。
  5. 在修复后重新构建 vLLM(pip install -e . 或相关编译命令)。

验证方法

使用以下测试提示在修复后的版本上运行贪婪解码(temperature=0),确认输出正确且不退化:

  • "What is 2+2? Reply with just the number." → 应输出 4
  • "Name the largest planet in our solar system." → 应输出 Jupiter
  • "A shop has 5 apples and sells 2. How many remain?" → 应输出 3
  • "60 km / 2 h" → 应输出 30

在验证中,使用 moe_backend=marlinenforce_eager=Truemax_model_len=2048。修复后可在 RTX PRO 6000 和 DGX Spark 上均得到正确结果。

参考来源

vllm-project/vllm #47241

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 15224

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注