sgl-project/sglang · error · ValueError

experimental_sgl_marlin EP requires --moe-a2a-backend none

Error message

experimental_sgl_marlin EP requires --moe-a2a-backend none

What it means

Startup validation for the experimental SGLang Marlin runner: when expert parallelism (ep_size > 1) is combined with an actual --moe-a2a-backend other than 'none', the experimental runner refuses to start because its EP path does not implement the deepep-style all-to-all dispatch.

Source

Thrown at python/sglang/srt/lora/marlin_lora_temp/policy.py:22

tests.  The backend deliberately supports a narrow configuration: widening it
requires implementing the corresponding Marlin activation/EP semantics first.
"""

from __future__ import annotations

from typing import Any


def validate_experimental_sgl_marlin_server_args(
    server_args: Any, resolved_args: Any
) -> None:
    """Validate startup options before the experimental runner is constructed."""
    from sglang.srt.arg_groups.overrides import resolving_view

    cfg = resolving_view(server_args)

    if resolved_args.ep_size > 1 and resolved_args.moe_a2a_backend != "none":
        raise ValueError("experimental_sgl_marlin EP requires --moe-a2a-backend none")

    # A provided adapter path implicitly enables LoRA later unless it was
    # explicitly disabled. No-LoRA delegates to the stock Marlin fused path.
    lora_enabled = bool(resolved_args.enable_lora) or (
        resolved_args.enable_lora is None and bool(cfg.lora_paths)
    )
    if not lora_enabled:
        return

    if not cfg.lora_use_virtual_experts:
        raise ValueError(
            "experimental_sgl_marlin LoRA requires --lora-use-virtual-experts"
        )
    if cfg.lora_backend != "triton":
        # The temporary dense/sink kernels consume Triton SGEMM batch metadata
        # directly; other global backends are not adapted in this tree.
        raise ValueError("experimental_sgl_marlin LoRA requires --lora-backend triton")
    if resolved_args.ep_size <= 1:

View on GitHub (pinned to 0132848349)

Solutions

  1. Set --moe-a2a-backend none when using experimental_sgl_marlin with EP > 1
  2. Run with EP disabled (tp-only) for the experimental path
  3. Fall back to the stock MoE runner backend if a2a is required

Example fix

# before
--ep-size 8 --moe-a2a-backend deepep
# after
--ep-size 8 --moe-a2a-backend none
Defensive patterns

Strategy: validation

Validate before calling

assert not (server_args.ep_size > 1 and server_args.moe_a2a_backend != 'none'), 'experimental_sgl_marlin EP requires --moe-a2a-backend none'

Prevention

When it happens

Trigger: Launching with resolved ep_size > 1 and --moe-a2a-backend set to something other than none (e.g. deepep) while the experimental_sgl_marlin runner/policy is active.

Common situations: Copying a production multi-GPU EP config (deepep a2a) onto a node being used to test the experimental Marlin LoRA path.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/1e70b415b5fcbbef. Report an issue: GitHub.