Prhub

#48064 [Distributed][Perf] Enable FlashInfer MNNVL allreduce RMS quant fusion

原始 PR 作者 mmangkad 合并时间 2026-07-13 15:02 文件变更 2 提交数 2 评论 1 代码增减 +74 / -22

执行摘要

FlashInfer MNNVL 后端支持量化融合

FlashInfer 的 MNNVL 后端已经支持量化融合(FP8/FP4),见 FlashInfer 源码 flashinfer/comm/trtllm_mnnvl_allreduce.cuh 中的 QuantType::kFP8=1QuantType::kFP4=2,但 vLLM 之前仅限 trtllm 后端使用。本 PR 旨在让 MNNVL 后端也能利用这一性能收益,减少显存带宽开销。

建议合并。PR 改动量小、目标明确,符合 vLLM 现有架构设计。值得关注的是 quant workspace 初始化重构中显式抛 ValueError 的设计决策——避免静默降级有助于用户快速定位配置问题。建议后续补一则硬件可用性测试(如标记为 needs_hardware),确保在新的 CI runner 上能验证 MNNVL 量化融合路径。

讨论亮点

无 review 评论。仅有一条 mergify 的 pre-commit 自动提示和 reviewer mgoin 的 "LGTM thanks!" 批准。

实现拆解

  1. 添加 NVFP4 scale buffer 视图转换函数vllm/compilation/passes/fusion/allreduce_rms_fusion.py):新增 _view_nvfp4_scale_out_for_flashinfer 将 vLLM 的 NVFP4 scale 缓冲区视为 FP8 传递给 FlashInfer,新增 _view_flashinfer_nvfp4_scale_out_as_int32 将 FlashInfer 输出的 scale 转回 vLLM 的 int32 格式。这两个函数仅改变 tensor 的 dtype 视图,不涉及内存拷贝。

  2. 放宽 layout_code 的 backend 限制allreduce_rms_fusion.py):在 call_trtllm_fused_allreduce_norm 中,将 layout_code 只对 "trtllm" 设置改为对 ("trtllm", "mnnvl") 设置,使得 MNNVL 后端也能使用 SWIZZLED_128x4 layout。

  3. 重构 quant workspace 初始化vllm/distributed/device_communicators/flashinfer_all_reduce.py):get_fi_ar_quant_workspace 从固定使用 "trtllm" 改为遵循 VLLM_FLASHINFER_ALLREDUCE_BACKEND 环境变量,并与普通 workspace 共享后端选择逻辑(_resolve_fi_ar_backend),支持 mnnvl 优先、trtllm 兜底;同时将多节点限制从静默返回 None 改为显式 ValueError,避免静默降级。

  4. 更新模式匹配的 replacement 函数allreduce_rms_fusion.py):在 FP4 和 FP8 两种融合模式的 replacement 函数中,调用前述视图转换函数包装 output_scale,使其能正确与 FlashInfer 通信,并将返回值也做反向转换,保证上下文的 dtype 一致性。

文件 模块 状态 重要度
vllm/compilation/passes/fusion/allreduce_rms_fusion.py 编译融合 modified 7.58
vllm/distributed/device_communicators/flashinfer_all_reduce.py 分布式通信 modified 6.92

关键符号

_view_nvfp4_scale_out_for_flashinfer _view_flashinfer_nvfp4_scale_out_as_int32 get_fi_ar_quant_workspace call_trtllm_fused_allreduce_norm

关键源码片段

vllm/compilation/passes/fusion/allreduce_rms_fusion.py core-logic

核心 fusion pass 文件,新增 NVFP4 scale buffer 视图转换函数,修改 layout_code 条件以支持 MNNVL 后端,并更新替换模式以使用新视图函数。

# 新增 : 将 vLLM 的 NVFP4 scale buffer 视为 FP8, 供 FlashInfer 使用
# FlashInfer 内部以 FP8 视角处理 scale, 而 vLLM 的 NVFP4 scale 以 int32 打包存储
# 通过 view.dtype 实现零拷贝 reinterpretdef _view_nvfp4_scale_out_for_flashinfer(
    scale_out: torch.Tensor,
) -> torch.Tensor:
    """View vLLM's packed NVFP4 scale buffer as FP8 for FlashInfer."""
    return torch.ops.aten.view.dtype(scale_out, FP8_DTYPE)# 反向转换 : 将 FlashInfer 输出的 NVFP4 scale 转回 vLLM 的 int32 格式
def _view_flashinfer_nvfp4_scale_out_as_int32(
    scale_out: torch.Tensor,
) -> torch.Tensor:
    """View FlashInfer's NVFP4 scale buffer back as vLLM's int32 format."""
    return torch.ops.aten.view.dtype(scale_out, torch.int32)# 关键修改 : 在 replacement 函数中包装 scale_out, 使 FlashInfer 能正确处理 NVFP4 scale
# ( 位于 FP4 quant 融合模式中 )
def replacement(...):
    output_scale_fp8 = _view_nvfp4_scale_out_for_flashinfer(output_scale) # 转 FP8
    assert flashinfer_comm is not None, "FlashInfer must be enabled"
    allreduce = auto_functionalized(
        flashinfer_trtllm_fused_allreduce_norm,
        allreduce_in=input,
        residual=residual,
        norm_out=result_rms,
        quant_out=quant_result,
        scale_out=output_scale_fp8, # 传入 FP8 视图
        ...
    )
    # 返回值也需转回 int32, 保持后续计算 dtype 一致
    return (
        allreduce[4],
        allreduce[1],
        _view_flashinfer_nvfp4_scale_out_as_int32(allreduce[5]), # 转回 int32
    )
vllm/distributed/device_communicators/flashinfer_all_reduce.py core-logic

重构 quant workspace 初始化逻辑,使其遵循与普通 workspace 一致的 backend 选择策略,支持 mnnvl 后端。

def get_fi_ar_quant_workspace(
    world_size: int,
    rank: int,
    max_token_num: int,
    hidden_dim: int,
    dtype: torch.dtype,
    group: ProcessGroup,
):
    """
    Return the allreduce workspace for quant patterns, initializing if needed.    Backend is controlled by VLLM_FLASHINFER_ALLREDUCE_BACKEND env var, matching
    non-quant fusion. With ``auto`` this prefers mnnvl and falls back to trtllm
    only on single-node topologies where mnnvl multicast is unavailable.
    """
    global _fi_ar_quant_workspace
    if _fi_ar_quant_workspace is not None:
        return _fi_ar_quant_workspace
​
    # 解析 backend: 与环境变量一致 , 支持 auto/mnnvl/trtllm
    backend, allow_trtllm_fallback = _resolve_fi_ar_backend()
​
    # 多节点场景 : trtllm 不支持 , 改为显式错误
    if get_node_count() > 1 and backend == "trtllm":
        raise ValueError(
            "Flashinfer allreduce quantization fusion is not supported for "
            "multi-node allreduce with 'trtllm' backend. Please use 'mnnvl' "
            "backend instead."
        )
​
    # 复用已有 workspace (backend 相同 )
    if _fi_ar_workspace is not None and _fi_ar_workspace.backend == backend:
        _fi_ar_quant_workspace = _fi_ar_workspace
        return _fi_ar_quant_workspace
​
    # 允许回退 : 已有 trtllm workspace, 且允许 fallback
    if (_fi_ar_workspace is not None
        and _fi_ar_workspace.backend == "trtllm"
        and allow_trtllm_fallback
        and backend != "trtllm"):
        _fi_ar_quant_workspace = _fi_ar_workspace
        return _fi_ar_quant_workspace
​
    # 创建新 workspace ( 使用解析出的 backend)
    _fi_ar_quant_workspace = _create_workspace(
        backend, world_size, rank, max_token_num, hidden_dim, dtype, group
    )
    # 回退 : mnnvl 不可用时尝试 trtllm
    if _fi_ar_quant_workspace is None and allow_trtllm_fallback and backend != "trtllm":
        logger.warning_once(...)
        backend = "trtllm"
        if _fi_ar_workspace is not None and _fi_ar_workspace.backend == backend:
            _fi_ar_quant_workspace = _fi_ar_workspace
        else:
            _fi_ar_quant_workspace = _create_workspace(...)
    ...
    return _fi_ar_quant_workspace

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 回归风险(低):变更集中在量化融合路径,非量化融合路径不受影响。但 quant workspace 初始化逻辑重构后,后端选择路径变多,可能引入条件遗漏。
  2. 兼容性风险(低)get_fi_ar_quant_workspace 对多节点 + trtllm 场景从静默返回 None 改为抛 ValueError,可能影响已配置多节点 + trtllm 但不经意的用户,需确保文档/配置同步更新。
  3. 性能风险(低):新增的视图转换函数不涉及内存拷贝,开销可忽略。
  4. 缺少测试覆盖:本 PR 未包含对应单元测试或集成测试,量化融合的 MNNVL 路径依赖实际 NVSwitch 硬件,CI 可能无法覆盖。

影响范围:使用 FlashInfer 通信库并在 NVSwitch 拓扑上运行 FP8/FP4 量化模型的 NVIDIA GPU 用户。
影响程度:中。对于符合条件的用户,可提升 allreduce + RMSNorm 融合的端到端性能(减少显存读/写),具体提升幅度取决于模型和 batch size。非量化路径或非 FlashInfer 用户无影响。
团队影响:低。变更涉及 2 个源文件,逻辑清晰,易于维护。

核心路径变更 缺少测试覆盖 多节点兼容性变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论