Prhub

#28604 [Fix] don't force hybrid-SWA when sliding_window is disabled

原始 PR 作者 Jiminator 合并时间 2026-06-18 13:11 文件变更 2 提交数 1 评论 2 代码增减 +8 / -4

执行摘要

修复 Laguna 在 sliding_window=0 时错误启用 hybrid-SWA

当使用 sliding_window=0 的 Laguna 模型配置时,is_hybrid_swa_model() 函数仍返回 True,导致 SGLang 尝试混合全注意力与滑动窗口注意力,而模型实际没有滑动窗口层,引发下游错误(如索引越界或维度不匹配)。PR 在 Body 中未详细描述,但从源码变更可知目的是修复这一逻辑错误。

值得合并。该 PR 修复了一个影响 Laguna 模型在无滑动窗口下运行的 bug,逻辑清晰,风险低。建议阅读 is_hybrid_swa_model 中的新增判断和 laguna.py 中默认层类型的变更,以确保理解 hybrid-SWA 识别的边界条件。

讨论亮点

无 review 评论。审核人 kpham-sgl 直接批准。

实现拆解

  1. 修改 model_config.py 中的 is_hybrid_swa_model() 函数:在为 LagunaForCausalLM 返回 True 之前,增加条件判断——如果 hf_text_config.sliding_window 为 0 或 falsy(且 hf_text_config 非 None),则返回 False。该优先于模型架构名称匹配,确保无滑动窗口时不误判。

  2. 修改 laguna.py 中的 LagunaConfig 构造函数:当 layer_types 参数未提供时,原默认逻辑生成长度为 num_hidden_layers 的交替序列(每隔 4 层 full_attention,其余 sliding_attention)。现改为全部填充 "full_attention",因为如果 sliding_window 为 0,模型不应包含任何滑动注意力层。该默认值变更与 is_hybrid_swa_model 的修复共同作用,避免无滑动窗口时产生不一致的层类型配置。

  3. 影响范围:仅影响 LagunaForCausalLM 模型。其他 hybrid-SWA 模型(如 Llama4、DeepseekV4、Gemma4 等)不受影响。

文件 模块 状态 重要度
python/sglang/srt/configs/model_config.py 模型配置 modified 5.84
python/sglang/srt/configs/laguna.py 模型配置 modified 5.13

关键符号

is_hybrid_swa_model LagunaConfig.__init__

关键源码片段

python/sglang/srt/configs/model_config.py data-contract

修复 `is_hybrid_swa_model()` 函数,增加对 `LagunaForCausalLM` 且 `sliding_window=0` 时的显式返回 `False` 逻辑。

def is_hybrid_swa_model(
    model_architectures: List[str],
    hf_text_config: Optional[PretrainedConfig] = None,
):
    hybrid_swa_archs = {
        "Llama4ForConditionalGeneration",
        "DeepseekV4ForCausalLM",
        "DeepseekV4ForCausalLMNextN",
        "GptOssForCausalLM",
        *MIMO_V2_MODEL_ARCHS,
        "MiMoV2MTP",
        "Step3p5ForCausalLM",
        "Step3p5MTP",
        "Step3p7ForConditionalGeneration",
        "Gemma4ForCausalLM",
        "Gemma4ForConditionalGeneration",
        "Gemma4UnifiedForConditionalGeneration",
        "LagunaForCausalLM",
    }
    if any(arch in hybrid_swa_archs for arch in model_architectures):
        # Only treat Laguna as hybrid SWA when it actually has a sliding window.
        if (
            "LagunaForCausalLM" in model_architectures
            and hf_text_config is not None
            and not getattr(hf_text_config, "sliding_window", 0)
        ):
            return False
        return True
    # Also recognize models that explicitly opt-in via their HF text config.
    if hf_text_config is not None and getattr(hf_text_config, "is_hybrid_swa", False):
        return True
    return False

评论区精华

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

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

风险与影响

风险较低。修改仅限于 is_hybrid_swa_model 中针对 LagunaForCausalLM 的特判分支和 laguna.py 中的默认值合成逻辑,不影响其他 hybrid-SWA 模型。但未添加测试用例覆盖 sliding_window=0 的场景,未来重构可能遗漏此边界。

对使用 sliding_window=0 的 Laguna 模型用户,错误 hybrid-SWA 识别将不再触发,模型可正常加载。其他用户无影响。影响范围小,仅限于特定配置的 Laguna 模型。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论