[Bug]: FlashInfer fused allreduce + residual RMSNorm + quant produces corrupted output with FP32 norm weights

用户在使用 vLLM 服务( vllm serve )加载 FP4 量化模型(如 nvidia/Qwen3.6-27B-NVFP4 )时,启用了 --tensor-parallel-size 2 (多 GPU),并传入编译配置 {"pass_config":{"fuse_allreduce_rms"

[Bug]: FlashInfer fused allreduce + residual RMSNorm + quant produces corrupted output with FP32 norm weights

[Bug]: FlashInfer fused allreduce + residual RMSNorm + quant produces corrupted output with FP32 norm weights

快速结论:当启用 fuse_allreduce_rms 编译优化,且 FlashInfer all-reduce backend 为 trtllm 时,如果 RMSNorm 权重为 FP32,在 tensor parallelism 模式下(≥2 GPU)会导致模型输出损坏。优先排查 RMSNorm 权重的数据类型,并尝试将其转换为 FP16/BF16。

问题场景

用户在使用 vLLM 服务(vllm serve)加载 FP4 量化模型(如 nvidia/Qwen3.6-27B-NVFP4)时,启用了 --tensor-parallel-size 2(多 GPU),并传入编译配置 {"pass_config":{"fuse_allreduce_rms":true}} 以及环境变量 VLLM_FLASHINFER_ALLREDUCE_BACKEND=trtllm。在此组合下,模型输出出现乱码或语义错误的“corrupted output”。单 GPU(tensor-parallel-size=1)时未复现此问题。

报错原文

# 没有直接报错日志,输出表现为生成内容异常。例如:
# 用户通过 curl 调用 chat completions,返回的 content 包含异常内容
# 如模型自我介绍中出现不完整的句子或语法错误。
# 但在某些条件下(例如去掉 fuse_allreduce_rms)后输出恢复正常。

原因分析

可能原因:FlashInfer 的 fused allreduce + residual RMSNorm + quant 融合内核在处理 FP32 精度的归一化权重时,与量化路径产生了数值不匹配或精度截断错误。融合操作(allreduce + RMSNorm + quantization)在 data type 转换链上的不兼容假设(例如混合了 FP32 与 FP16 数据流)导致了最终输出损坏。这在高并行度(tensor-parallel-size ≥ 2)时由于 allreduce 参与更易触发。

环境排查

  • 确认 tensor-parallel-size 是否 ≥ 2(单 GPU 不会触发 fused allreduce)。
  • 确认 VLLM_FLASHINFER_ALLREDUCE_BACKEND 是否为 trtllm(非默认值)。
  • 确认模型权重中的 RMSNorm 参数(如 model.layers.*.input_layernorm.weight)是否为 torch.float32
  • 确认 vLLM 版本(Issue 中测试于版本 0.23.1rc1.dev10010.24.0)。
  • 确认 PyTorch 版本(Issue 环境为 2.11.0 + CUDA 13.0,GPU 为 H100)。

解决步骤

  1. 检查模型 RMSNorm 权重数据类型:加载模型后打印 model.layers[0].input_layernorm.weight.dtype 等是否为 torch.float32
  2. 可优先尝试将 RMSNorm 权重手动转换为 FP16 或 BF16:
    for name, param in model.named_parameters():
    if 'layernorm' in name and param.dtype == torch.float32:
    param.data = param.data.half()
    然后重新启动服务。
  3. 临时解决方案(Issue 中未验证但符合逻辑):禁用 fuse_allreduce_rms 编译 pass,即启动时移除 --compilation-config '{"pass_config":{"fuse_allreduce_rms":true}}',或设置为 false。
  4. 如果不需要 FlashInfer all-reduce,可切换 backend 为默认值,或设置 VLLM_FLASHINFER_ALLREDUCE_BACKEND=nccl 绕过。
  5. 若上述均无效,可回退 tensor-parallel-size=1 作为临时工作流。

验证方法

重新启动 vLLM 服务后,使用 curl 发送相同的 chat completion 请求,检查返回的 content 是否语义正确、无乱码或截断。与未开启 fuse_allreduce_rms 时的输出做对比确认修复。

参考来源

vllm-project/vllm #48324

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 12810

发表回复

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