sgl-project/sglang · error · ValueError
moe_a2a_backend='pplx' only supports low-latency mode; set -
Error message
moe_a2a_backend='pplx' only supports low-latency mode; set --deepep-mode to 'low_latency' or 'auto'.
What it means
Raised when --moe-a2a-backend pplx is used with --deepep-mode normal. The pplx (ParallelRL) a2a backend only implements the low-latency masked dispatch path. 'auto' mode is auto-declared to low_latency, so only an explicit 'normal' triggers the error.
Source
Thrown at python/sglang/srt/server_args.py:7809
deepep_mode="normal",
)
logger.warning("auto set deepep_mode=`normal` for MORI EP")
# Check chunked prefill for mori
# Skip validation if chunked prefill is disabled (i.e., size <= 0).
# Skip validation if disaggregation mode is decode.
if cfg.chunked_prefill_size > 0 and cfg.disaggregation_mode != "decode":
assert (
self._required_mori_dispatch_tokens_per_rank()
) <= envs.SGLANG_MORI_NUM_MAX_DISPATCH_TOKENS_PER_RANK.get(), (
"SGLANG_MORI_NUM_MAX_DISPATCH_TOKENS_PER_RANK (default 4096) "
"must be >= the per-rank MoRI dispatch tokens "
"(chunked_prefill_size by default)"
)
if a2a_backend == "pplx":
if cfg.deepep_mode == "normal":
raise ValueError(
"moe_a2a_backend='pplx' only supports low-latency mode; "
"set --deepep-mode to 'low_latency' or 'auto'."
)
if cfg.deepep_mode == "auto":
self._declare(
"_handle_a2a_moe",
deepep_mode="low_latency",
)
logger.warning("auto set deepep_mode=`low_latency` for PPLX EP")
# pplx-kernels' AllToAll needs numDPGroups (== attention dp_size) > 1;
# without DP attention numDPGroups == 1 and construction fails deep in
# the kernel. This also implies ep_size >= 2.
assert resolved_view(self).enable_dp_attention and cfg.dp_size >= 2, (
"moe_a2a_backend='pplx' requires --enable-dp-attention with at "
"least 2 DP groups (--dp-size >= 2)."
)
# pplx runs the masked DeepGEMM expert path (sm_90a): reject other
# runners and resolve auto -> deep_gemm. Unquantized bf16 pplx needsView on GitHub (pinned to 0132848349)
Solutions
- Set --deepep-mode low_latency
- Set --deepep-mode auto (resolver forces low_latency for pplx)
- If normal-mode dispatch is required, use --moe-a2a-backend deepep instead of pplx
Example fix
# before --moe-a2a-backend pplx --deepep-mode normal # after --moe-a2a-backend pplx --deepep-mode low_latency
Defensive patterns
Strategy: validation
Validate before calling
if a2a_backend == "pplx" and deepep_mode == "normal":
deepep_mode = "low_latency" Prevention
- Use --deepep-mode auto with pplx so the resolver picks correctly
- Keep a matrix of a2a-backend vs supported deepep modes in deployment docs
When it happens
Trigger: Launching with --moe-a2a-backend pplx and --deepep-mode normal.
Common situations: Migrating a pplx-based RL serving stack onto a config template that pinned --deepep-mode normal for prefill-heavy workloads; mixing flags from different deployment playbooks.
Related errors
- DeepEP v2 MoE is not validated for {architecture!r}; support
- flashinfer_cutedsl FP4 MoE only supports DeepEP low_latency
- --ep-dispatch-algorithm {cfg.ep_dispatch_algorithm} picks a
- DeepSeekV4 CP supports moe_a2a_backend in {supported_a2a_bac
- DSpark with dp attention supports moe_a2a_backend 'none' (bu
AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28).
Data as JSON: /api/errors/90ccfca621309254.
Report an issue: GitHub.