[Bug]: Qwen3.5-35B-A3B merged SFT BF16 intermittently produces NaN logits and exclamation-only output on H20 (v0.19.1; HF control finite)

该问题出现在 vLLM 0.19.1 以 BF16 加载 Qwen3.5-35B-A3B(MoE + GDN)合并 SFT 权重做长输入生成时,偶发出现 NaN logits,并整段输出 token ID 0(渲染为连续英文感叹号)。优先排查点是 GDN prefill 内核与缓存路径是否触发了非有

快速结论:该问题出现在 vLLM 0.19.1 以 BF16 加载 Qwen3.5-35B-A3B(MoE + GDN)合并 SFT 权重做长输入生成时,偶发出现 NaN logits,并整段输出 token ID 0(渲染为连续英文感叹号)。优先排查点是 GDN prefill 内核与缓存路径是否触发了非有限数值,而不是模型权重本身(HF 对照全程有限)。

适用环境:vLLM 0.19.1;PyTorch 2.10.0+cu128;CUDA 12.8;Triton 3.6.0;Transformers 5.7.0;flash-linear-attention 0.4.0;causal-conv1d 1.6.0;Python 3.12.13;Linux x86_64(kernel 5.4.119-19-0009.56);1 × NVIDIA H20-3e(SM 9.0,driver 580.159.03);模型为基于 Qwen3.5-35B-A3B 的私有 merged SFT checkpoint,BF16 加载,quantization=None;无 LoRA、无投机解码、无 sleep/wake。

最快修复方案:暂无确认的一步修复方案。Issue 在关闭时未给出已验证的一行式修复;复核者在 vLLM nightly(commit 18f8f960)上以 30 次串行请求未能复现,但属于弱否定证据(对照设置与报告存在模型与 token 序列差异)。

注意事项:不要把“nightly 未复现”理解为已修复。复核者自身也指出:原报告 9 次请求中出现 1 次(约 11%),30 次干净的统计学概率约 3.3%,样本量不足以定性;而且复核使用的是公共 base 权重与合成重复英文段落,而非报告中的私有 SFT 权重与真实多轮工具调用对话,权重取值和具体 token 序列都会影响 GDN 状态轨迹。开启 VLLM_COMPUTE_NANS_IN_LOGITS=1 只是暴露与计数,并非修复。

问题场景

在单机 vLLM 0.19.1 的 OpenAI 兼容服务上,用同一个已合并的 BF16 SFT checkpoint(基于 Qwen3.5-35B-A3B)对一段冻结的 11,686 token 输入做生成,temperature=0、max_tokens=2500。该请求为串行请求,首次串行 B 请求直接吐出 2,500 个 token ID 0(即 2,500 个“!”),同时 vllm:corrupted_requests_total 从 0 增至 1;同一 server 内后续相同请求又能正常结束。使用者是在监控 NaN logits 的指标时发现该异常的。

报错原文

[Bug]: Qwen3.5-35B-A3B merged SFT BF16 intermittently produces NaN logits and exclamation-only output on H20 (v0.19.1; HF control finite)

corrupted_requests_total before: 0
corrupted_requests_total after:  1
usage.prompt_tokens:             11686
usage.completion_tokens:         2500
finish_reason:                  length
unique output token IDs:        [0]
longest identical-token run:    2500
returned text:                  "!" repeated exactly 2500 times

原因分析

最可能的原因是 vLLM 0.19.1 执行栈在该输入/权重组合下出现偶发非有限数值(NaN logits),随后采样退化到 token ID 0,表现为整段“!”。报告者本人并未把问题归因到某个具体 kernel 或 cache bug,只提供了 vLLM 后端间歇性数值失败的证据。结合环境,可疑路径包括 GDN prefill 内核(Triton/FLA)与相关状态/缓存计算;但由于同一 server 不重启的情况下重试即可恢复,且 HF 后端全程有限,暂时不确定是内核、缓存(如 chunked prefill 路径)还是二者组合触发,属于可能性排序而非结论。

环境排查

  • 确认 vLLM 版本:报告为 0.19.1;复核为 nightly,版本串 0.30.1rc1.dev630+g18f8f9602(commit 18f8f96025b556071eb627076f94df560fbd3a22,2026-10-04)。
  • 确认 PyTorch / CUDA / cuDNN / Triton 版本:2.10.0+cu128、CUDA 12.8、cuDNN 91002、Triton 3.6.0。
  • 确认 Transformers、flash-linear-attention、causal-conv1d 版本:5.7.0、0.4.0、1.6.0。
  • 确认 Python 与操作系统:3.12.13、Linux x86_64 kernel 5.4.119-19-0009.56。
  • 确认硬件:NVIDIA H20-3e,SM 9.0,143,771 MiB 显存;driver 报告为 580.159.03,复核为 615.71.09。
  • 确认加载参数:--dtype bfloat16、quantization=None、speculative_config=None、enable_prefix_caching=False、无 LoRA。
  • 确认 GDN prefill 后端:报告中需关注是否走 Triton/FLA GDN prefill kernel;复核命令显式使用 --gdn-prefill-backend triton,日志显示 Using Triton/FLA GDN prefill kernel (requested=triton, head_k_dim=128)。
  • 确认是否开启 NaN 计数:需要设置 VLLM_COMPUTE_NANS_IN_LOGITS=1 才能看到 vllm:corrupted_requests_total 增长。
  • 确认输入是否与报告一致:报告使用 11,686 token 的真实多轮工具调用 token 数组;复核使用合成重复英文段落,二者不可等价。
  • 确认权重是否一致:报告为私有 merged SFT checkpoint;复核为 Qwen/Qwen3.5-35B-A3B 公共 base,权重不同。

解决步骤

  1. 先固定可复现环境:保持报告中的 vLLM 0.19.1、PyTorch 2.10.0+cu128、Triton 3.6.0、H20-3e、driver 580.159.03 等版本不变,避免多变量干扰。
  2. 开启 NaN 监控:设置 VLLM_COMPUTE_NANS_IN_LOGITS=1,请求前后读取 /metrics 中的 corrupted_requests_total,确认“失败”是否真的对应 NaN 计数 +1。
  3. 记录失败请求的完整可辨认信息:输入 token 数组(11,686 token)、input tokens 数、output budget(2500)、finish_reason、输出是否全为 token ID 0、以及该请求在串行序列中的位置(报告是第二条串行请求,早于并发阶段)。
  4. 做 HF 对照:用完全相同的权重文件和相同的冻结 token 数组跑 Transformers,检查是否仍能正常终止、输出是否有限,以区分“权重问题”与“vLLM 执行栈问题”。
  5. 在同一 server 不重启的前提下重发相同请求,观察是否自愈:报告显示同一进程内后续相同请求可正常完成,且无 NaN 计数增长,说明是间歇性而非稳定失败。
  6. 可优先尝试的排查方向:更换 / 关闭 GDN prefill 后端相关选项(例如在能复现的前提下对比 --gdn-prefill-backend 的不同取值),或改用与本 Issue 对照设置更接近的 nightly/较新 commit 做长跑验证;注意这些均未在 Issue 中被验证为修复。
  7. 如仍能复现,按 Issue 建议补充最小证据:保持生成预算不变(不要把输出缩短到几个 token),并提供 corrupted_requests_total before/after、usage 统计、unique output token IDs、longest identical-token run 等观测值。

验证方法

一次请求结束后,确认三件事同时成立,才算问题已消失:(1)vllm:corrupted_requests_total 没有增长;(2)finish_reason 不是因为整段重复 token 0 而被 length 截断,输出 token 不再是单一 token ID 0;(3)HF 对照与 vLLM 在该输入上都能正常终止且 logits 有限。由于原报告只是间歇性失败(9 次 1 次),单次通过不能证明修复,需要用相同冻结输入做足够多次串行 + 并发混合请求,并持续对比 NaN 计数器,才能判断是否真正解决。

参考来源

vllm-project/vllm #59381

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29173

发表回复

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