Prhub

#25310 revert flashinfer 0.6.11 bumps

原始 PR 作者 hnyls2002 合并时间 2026-05-15 06:28 文件变更 7 提交数 2 评论 4 代码增减 +33 / -34

执行摘要

回退 FlashInfer 0.6.11 至 0.6.8,修复 MoE 崩溃

FlashInfer 0.6.11 在 4xH100 上导致 CUDA illegal-address crash,崩溃发生在 _matmul_ogs_NNT_bf16xbf16xmxfp4_128x256x128x1_swiglu 内核(Triton mxfp4 MoE 矩阵乘法),在 piecewise CUDA graph capture 时触发。同一失败签名出现在原始 PR CI 和 main 定时 CI 中,影响生产可用性。

该 PR 是快速的熔断操作,值得所有使用 FlashInfer 且涉及 MoE 模型的团队关注。回退逻辑清晰,但应跟踪 PR#24281 和 FlashInfer 上游的修复进展。建议在恢复升级前增加明确的 CI 测试(包含 4xH100 的 mxfp4 MoE 流程)。

讨论亮点

评论者 b8zhong 提出另一种修复思路:正在测试 PR#24281 是否能解决相同问题,并指出当前 Triton 和 Triton Kernels 版本不对齐。这表明崩溃可能根源在于 Triton 生态版本不一致,而非 FlashInfer 本身。目前回退是保守选择,待上游确认修复。

实现拆解

  1. 依赖版本回退 (python/pyproject.toml, docker/Dockerfile):将 flashinfer_pythonflashinfer_cubin0.6.11.post1 回退到 0.6.8.post1;同步回退 nvidia-cutlass-dsl4.4.2quack-kernels>=0.3.0,以保持与旧版 FlashInfer 的兼容性。
  2. 版本检查更新 (python/sglang/srt/entrypoints/engine.py, python/sglang/srt/utils/common.py):将 assert_pkg_versioncheck_pkg_version_at_least 中的最小版本要求从 0.6.11.post1 改回 0.6.8.post1,确保引导时代码与锁定的依赖一致。
  3. Workspace 初始化逻辑回退 (python/sglang/srt/layers/flashinfer_comm_fusion.py):移除 FlashInfer >=0.6.10 所需的 group=device_group 参数传递(0.6.8 不支持该参数);将 ensure_workspace_initialized 中的 subgroups 分组策略恢复为旧逻辑——当子组即全 TP 组时直接传递 None,避免 TorchDistBackend 参与,简化 CUDA graph capture 下的通信路径。
  4. FP4 量化调用回退 (python/sglang/srt/layers/quantization/fp4_utils.py):将 _flashinfer_fp4_quantize_impl 中的关键字参数调用改回位置参数调用,适配 FlashInfer 0.6.8 的 API 签名。
  5. 测试用例适配 (test/registered/moe/test_cutedsl_moe.py):回退 MoE 测试中因 API 变更导致的 a_global_scale 切分方式(从 input_global_scale[:1] 改回直接使用完整 input_global_scale),与 FP4 量化 API 保持一致。
文件 模块 状态 重要度
python/sglang/srt/layers/flashinfer_comm_fusion.py 通信层 modified 6.34
python/sglang/srt/layers/quantization/fp4_utils.py 量化层 modified 5.65
python/sglang/srt/entrypoints/engine.py 启动入口 modified 4.93
python/pyproject.toml 项目配置 modified 4.05
test/registered/moe/test_cutedsl_moe.py MoE 测试 modified 4.2

关键符号

_flashinfer_fp4_quantize_impl ensure_workspace_initialized FlashInferCommFusionWorkspace.initialize assert_pkg_version check_pkg_version_at_least _set_envs_and_config test_v1_masked_kernel_bf16_input test_v1_masked_kernel_fp4_input test_v1_masked_kernel_rejects_v2_w13_layout

关键源码片段

python/sglang/srt/layers/flashinfer_comm_fusion.py core-logic

核心通信库,回退 subgroup 分组策略和参数传递,直接影响 CUDA graph capture 稳定性和多进程组通信正确性。

# python/sglang/srt/layers/flashinfer_comm_fusion.py
# (ensure_workspace_initialized 函数,回退后的版本 )
def ensure_workspace_initialized(
    max_token_num: int = 2048,
    hidden_dim: int = 4096,
    dtype: torch.dtype = torch.float16,
    token_num: Optional[int] = None,
    use_oneshot: Optional[bool] = None,
    use_attn_tp_group: bool = True,
):
    """Ensure workspace is initialized"""
    if _flashinfer_allreduce_unavailable:
        return False
    if not is_flashinfer_available() or _flashinfer_comm is None:
        return False
​
    # 获取全 TP group 的协调者(用于后续比较)
    tp_coordinator = get_tp_group()
​
    if use_attn_tp_group:
        world_size = get_attn_tensor_model_parallel_world_size()
        rank = get_attn_tensor_model_parallel_rank()
        coordinator = get_attn_tp_group()
    else:
        if get_moe_expert_parallel_world_size() > 1:
            world_size = get_moe_expert_parallel_world_size()
            rank = get_moe_expert_parallel_rank()
            coordinator = get_moe_ep_group()
        else:
            world_size = get_moe_tensor_parallel_world_size()
            rank = get_moe_tensor_parallel_rank()
            coordinator = get_moe_tp_group()
​
    # 当子组正是全 TP group 时,传递 None 让 workspace 直接使用默认进程组
    # (避免 TorchDistBackend 参与,从而避免 CUDA graph capture 干扰)
    if coordinator.device_group is tp_coordinator.device_group:
        device_group = None
        cpu_group = None
    else:
        device_group = coordinator.device_group
        cpu_group = coordinator.cpu_group
​
    if world_size <= 1:
        return False
    # ... 后续 workspace 初始化逻辑不变
python/sglang/srt/layers/quantization/fp4_utils.py core-logic

FP4 量化入口,回退后的 API 调用方式直接影响 MOE 量化推理的正确性。

# python/sglang/srt/layers/quantization/fp4_utils.py
# ( 回退后版本,0.6.8 的 flashinfer.fp4_quantize 不支持关键字参数 )
def _flashinfer_fp4_quantize_impl(
    input: torch.Tensor,
    global_scale: Optional[torch.Tensor] = None,
    sf_vec_size: int = 16,
    sf_use_ue8m0: bool = False,
    is_sf_swizzled_layout: bool = True,
    is_sf_8x4_layout: bool = False,
    enable_pdl: Optional[bool] = None,
) -> tuple[torch.Tensor, torch.Tensor]:
    # 使用位置参数调用(0.6.8 签名:f(input, global_scale, sf_vec_size, ...))
    return _flashinfer_fp4_quantize(
        input,
        global_scale,
        sf_vec_size,
        sf_use_ue8m0,
        is_sf_swizzled_layout,
        is_sf_8x4_layout,
        enable_pdl,
        backend=_flashinfer_fp4_quantize_backend,
    )
python/sglang/srt/entrypoints/engine.py core-logic

启动入口中的版本检查,确保运行时依赖版本符合要求。

# python/sglang/srt/entrypoints/engine.py
# (_set_envs_and_config 函数内的版本检查片段,回退后 )
    # Check flashinfer version
    if not get_bool_env_var("SGLANG_SKIP_SGL_KERNEL_VERSION_CHECK"):
        if server_args.attention_backend == "flashinfer":
            assert_pkg_version(
                "flashinfer_python",
                "0.6.8.post1", # 回退自 0.6.11.post1,等待上游修复
                "Please uninstall the old version and "
                "reinstall the latest version by following the instructions "
                "at https://docs.flashinfer.ai/installation.html.",
            )
        if _is_cuda:
            assert_pkg_version(
                "sglang-kernel",
                "0.4.2.post1",
                "Please reinstall the latest version with `pip install sglang-kernel --force-reinstall`",
            )

评论区精华

替代修复方案:PR#24281 及 Triton 版本不对齐 正确性

b8zhong 正在测试 PR#24281 能否修复同一崩溃,并指出当前 Triton 和 Triton Kernels 版本不匹配,暗示根本原因可能并非 FlashInfer 本身,而是 Triton 版本不一致导致的 MoE kernel 崩溃。

结论:未达成正式结论,回退是临时熔断;PR#24281 可能提供更彻底的修复。 · 待处理

风险与影响

  1. 功能回退:失去 FlashInfer 0.6.11 引入的优化和 bug 修复(如准确的多进程组渲染),但通过移除可能导致 CUDA graph 挂起的 subgroup 逻辑,实际上避免了原有风险。
  2. 上游依赖延迟:pin 住旧版可能使后续升级爆炸,需持续跟踪 FlashInfer 对 mxfp4 MoE 路径的修复。
  3. 测试覆盖不足:仅回退测试中与 API 相关的局部调用,未覆盖完整回归场景,存在未发现的兼容问题。
  4. Dockerfile 不一致:Dockerfile 中仅 flashinfer_python 版本更新,未同步修改 cubin 及其他依赖的 Docker 构建,但已通过 pip 约束保证一致性。

用户:使用 4xH100 运行 gpt-oss-120b 等 MoE 模型的用户将避免崩溃,恢复正常推理;但可能错过 0.6.11 中其他改进。系统:回退操作本身无破坏性,CI/CD 管道中的版本检查将强制使用 0.6.8,新部署不会自动升级到有问题的版本。团队:需与 FlashInfer 上游协调修复,待确认后重新升级,并验证 Trition kernel 版本对齐。

依赖回退 MoE 内核崩溃 CUDA graph 兼容性 上游等待修复

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论