Prhub

#42287 [Bugfix] Fix DSV4 swiglu_limit on marlin backend

原始 PR 作者 jeejeelee 合并时间 2026-05-12 04:03 文件变更 1 提交数 3 评论 1 代码增减 +4 / -0

执行摘要

修复 DSv4 Marlin 缺少 clamp_limit 参数

修复 DeepSeek-V4 在 Marlin 量化后端上因缺少 clamp_limit 参数导致的激活值溢出,确保激活值裁剪功能在非 LoRA 路径中正确生效。

该 PR 修复了关键 bug,推荐合并。同时建议后续补全 LoRA 路径的 clamp_limit 支持。

讨论亮点
  1. LoRA 路径缺失gemini-code-assist 指出 LoRA 路径缺少 clamp_limit 支持,建议修改 activation_with_lora 函数以直接支持裁剪,但当前未实现。
  2. 功能兼容性mgoin 建议为 MoE 的 clamp_limit 支持添加 supports 函数以进行特性检查,但未被采纳。

实现拆解

  1. 函数签名扩展:在 batched_fused_marlin_moe 函数的参数列表末尾新增 clamp_limit: float | None = None 参数。
  2. 传递调用链:在 _fused_marlin_moe 内部调用时,将 clamp_limit=clamp_limit 传递给底层 kernel。
  3. 类方法集成:在 MarlinExperts.apply 的非 LoRA 执行路径中,调用 batched_fused_marlin_moe 时传入 clamp_limit=self.gemm1_clamp_limit,确保 gemm1_clamp_limit 配置生效。
文件 模块 状态 重要度
vllm/model_executor/layers/fused_moe/experts/marlin_moe.py MoE 专家层 modified 5.68

关键符号

batched_fused_marlin_moe MarlinExperts.apply

关键源码片段

vllm/model_executor/layers/fused_moe/experts/marlin_moe.py data-contract

核心修改文件,新增 `clamp_limit` 参数并在非 LoRA 调用链中传递。

# 文件 : vllm/model_executor/layers/fused_moe/experts/marlin_moe.pydef batched_fused_marlin_moe(
    hidden_states: torch.Tensor,
    expert_num_tokens: torch.Tensor,
    w1: torch.Tensor,
    w2: torch.Tensor,
    bias1: torch.Tensor | None,
    bias2: torch.Tensor | None,
    w1_scale: torch.Tensor,
    w2_scale: torch.Tensor,
    quant_type_id: int,
    apply_router_weight_on_input: bool = False,
    global_num_experts: int = -1,
    activation: MoEActivation = MoEActivation.SILU,
    expert_map: torch.Tensor | None = None,
    global_scale1: torch.Tensor | None = None,
    global_scale2: torch.Tensor | None = None,
    g_idx1: torch.Tensor | None = None,
    g_idx2: torch.Tensor | None = None,
    sort_indices1: torch.Tensor | None = None,
    sort_indices2: torch.Tensor | None = None,
    w1_zeros: torch.Tensor | None = None,
    w2_zeros: torch.Tensor | None = None,
    workspace: torch.Tensor | None = None,
    intermediate_cache13: torch.Tensor | None = None,
    intermediate_cache2: torch.Tensor | None = None,
    is_k_full: bool = True,
    output: torch.Tensor | None = None,
    inplace: bool = False,
    # 新增 : 激活值裁剪限制,用于 DSv4 场景,解决精度溢出
    clamp_limit: float | None = None,
) -> torch.Tensor:
    ...
    output = _fused_marlin_moe(
        ...,
        # 将 clamp_limit 向下传递给底层 kernel
        clamp_limit=clamp_limit,
    )
    ...
    return outputclass MarlinExpertsBase(mk.FusedMoEExpertsModular):
    ...
    def apply(self, ...):
        ...
        if not self.use_lora:
            # 非 LoRA 路径 : 传入 clamp_limit 以启用激活值裁剪
            batched_fused_marlin_moe(
                ...,
                clamp_limit=self.gemm1_clamp_limit,
            )

评论区精华

LoRA 路径缺少 clamp_limit 设计

gemini-code-assist 指出 LoRA 分支未添加 clamp_limit,建议修改 activation_with_lora 函数以支持 clamp,但当前仅修复非 LoRA 路径。

结论:未解决,LoRA 路径后续需单独修复。 · 待处理

是否为 clamp 支持添加 supports 函数 设计

mgoin 建议在 MoE oracle 中添加 supports 函数以检查 clamp_limit 支持,但未在本次实现。

结论:未采纳,当前仅做 bugfix。 · 已解决

风险与影响

  1. LoRA 路径未覆盖:LoRA 分支未添加 clamp_limit,若用户启用 LoRA 且需要裁剪,会出现精度问题。
  2. 兼容性风险:新增参数为可选 None,默认向后兼容,不会破坏现有调用。

仅影响 DSv4 模型在 Marlin 量化后端上的推理精度,修复后激活值裁剪行为与预期一致。用户无需更改配置即可受益。

LoRA 路径缺失 兼容旧调用

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论