94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
306 lines
9.7 KiB
Python
306 lines
9.7 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
from abc import ABC, abstractmethod
|
|
from typing import TYPE_CHECKING
|
|
|
|
import torch
|
|
|
|
if TYPE_CHECKING:
|
|
from sglang.srt.server_args import ServerArgs
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MambaSSUBackend(ABC):
|
|
@property
|
|
@abstractmethod
|
|
def name(self) -> str:
|
|
"""Human-readable name used for logging."""
|
|
|
|
@abstractmethod
|
|
def __call__(
|
|
self,
|
|
state: torch.Tensor,
|
|
x: torch.Tensor,
|
|
dt: torch.Tensor,
|
|
A: torch.Tensor,
|
|
B: torch.Tensor,
|
|
C: torch.Tensor,
|
|
D: torch.Tensor | None = None,
|
|
z: torch.Tensor | None = None,
|
|
dt_bias: torch.Tensor | None = None,
|
|
dt_softplus: bool = False,
|
|
state_batch_indices: torch.Tensor | None = None,
|
|
pad_slot_id: int = -1,
|
|
out: torch.Tensor | None = None,
|
|
disable_state_update: bool = False,
|
|
intermediate_states_buffer: torch.Tensor | None = None,
|
|
cache_steps: int | None = None,
|
|
retrieve_parent_token: torch.Tensor | None = None,
|
|
intermediate_state_indices: torch.Tensor | None = None,
|
|
) -> None: ...
|
|
|
|
|
|
class TritonSSUBackend(MambaSSUBackend):
|
|
"""Triton-based selective-state-update backend."""
|
|
|
|
def __init__(
|
|
self,
|
|
*,
|
|
enable_stochastic_rounding: bool = False,
|
|
cache_philox_rounds: int = 0,
|
|
) -> None:
|
|
from sglang.srt.layers.attention.mamba.ops.mamba_ssm import (
|
|
selective_state_update,
|
|
)
|
|
|
|
self._kernel = selective_state_update
|
|
self._enable_stochastic_rounding = enable_stochastic_rounding
|
|
self._cache_philox_rounds = cache_philox_rounds
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return "triton"
|
|
|
|
def __call__(
|
|
self,
|
|
state: torch.Tensor,
|
|
x: torch.Tensor,
|
|
dt: torch.Tensor,
|
|
A: torch.Tensor,
|
|
B: torch.Tensor,
|
|
C: torch.Tensor,
|
|
D: torch.Tensor | None = None,
|
|
z: torch.Tensor | None = None,
|
|
dt_bias: torch.Tensor | None = None,
|
|
dt_softplus: bool = False,
|
|
state_batch_indices: torch.Tensor | None = None,
|
|
pad_slot_id: int = -1,
|
|
out: torch.Tensor | None = None,
|
|
disable_state_update: bool = False,
|
|
intermediate_states_buffer: torch.Tensor | None = None,
|
|
cache_steps: int | None = None,
|
|
retrieve_parent_token: torch.Tensor | None = None,
|
|
intermediate_state_indices: torch.Tensor | None = None,
|
|
) -> None:
|
|
self._kernel(
|
|
state,
|
|
x,
|
|
dt,
|
|
A,
|
|
B,
|
|
C,
|
|
D=D,
|
|
z=z,
|
|
dt_bias=dt_bias,
|
|
dt_softplus=dt_softplus,
|
|
state_batch_indices=state_batch_indices,
|
|
pad_slot_id=pad_slot_id,
|
|
out=out,
|
|
disable_state_update=disable_state_update,
|
|
intermediate_states_buffer=intermediate_states_buffer,
|
|
cache_steps=cache_steps,
|
|
retrieve_parent_token=retrieve_parent_token,
|
|
intermediate_state_indices=intermediate_state_indices,
|
|
enable_stochastic_rounding=self._enable_stochastic_rounding,
|
|
cache_philox_rounds=self._cache_philox_rounds,
|
|
)
|
|
|
|
|
|
class FlashInferSSUBackend(MambaSSUBackend):
|
|
"""FlashInfer-based selective-state-update backend."""
|
|
|
|
def __init__(
|
|
self,
|
|
*,
|
|
enable_stochastic_rounding: bool = False,
|
|
cache_philox_rounds: int = 0,
|
|
) -> None:
|
|
from flashinfer.mamba import selective_state_update
|
|
|
|
self._kernel = selective_state_update
|
|
self._enable_stochastic_rounding = enable_stochastic_rounding
|
|
self._cache_philox_rounds = cache_philox_rounds
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return "flashinfer"
|
|
|
|
def __call__(
|
|
self,
|
|
state: torch.Tensor,
|
|
x: torch.Tensor,
|
|
dt: torch.Tensor,
|
|
A: torch.Tensor,
|
|
B: torch.Tensor,
|
|
C: torch.Tensor,
|
|
D: torch.Tensor | None = None,
|
|
z: torch.Tensor | None = None,
|
|
dt_bias: torch.Tensor | None = None,
|
|
dt_softplus: bool = False,
|
|
state_batch_indices: torch.Tensor | None = None,
|
|
pad_slot_id: int = -1,
|
|
out: torch.Tensor | None = None,
|
|
disable_state_update: bool = False,
|
|
intermediate_states_buffer: torch.Tensor | None = None,
|
|
cache_steps: int | None = None,
|
|
retrieve_parent_token: torch.Tensor | None = None,
|
|
intermediate_state_indices: torch.Tensor | None = None,
|
|
) -> None:
|
|
if retrieve_parent_token is not None:
|
|
raise ValueError(
|
|
"FlashInfer backend does not support retrieve_parent_token. "
|
|
"Use --mamba-backend triton for EAGLE tree attention."
|
|
)
|
|
rand_seed = (
|
|
torch.randint(0, 2**32, (1,), device=state.device)
|
|
if self._enable_stochastic_rounding
|
|
else None
|
|
)
|
|
# FlashInfer expects cache_steps as an int (0 when unused).
|
|
self._kernel(
|
|
state,
|
|
x,
|
|
dt,
|
|
A,
|
|
B,
|
|
C,
|
|
D=D,
|
|
z=z,
|
|
dt_bias=dt_bias,
|
|
dt_softplus=dt_softplus,
|
|
state_batch_indices=state_batch_indices,
|
|
pad_slot_id=pad_slot_id,
|
|
out=out,
|
|
disable_state_update=disable_state_update,
|
|
intermediate_states_buffer=intermediate_states_buffer,
|
|
cache_steps=0 if cache_steps is None else cache_steps,
|
|
intermediate_state_indices=intermediate_state_indices,
|
|
rand_seed=rand_seed,
|
|
philox_rounds=self._cache_philox_rounds or 10,
|
|
)
|
|
|
|
|
|
_BACKEND_REGISTRY: dict[str, type[MambaSSUBackend]] = {
|
|
"triton": TritonSSUBackend,
|
|
"flashinfer": FlashInferSSUBackend,
|
|
}
|
|
|
|
_mamba_ssu_backend: MambaSSUBackend | None = None
|
|
|
|
|
|
def initialize_mamba_selective_state_update_backend(server_args: ServerArgs) -> None:
|
|
"""Instantiate the selective-state-update backend from server config.
|
|
|
|
This should be called once during scheduler initialization.
|
|
|
|
Args:
|
|
server_args: Server arguments containing ``mamba_backend`` setting.
|
|
|
|
Raises:
|
|
ValueError: If the requested backend is unavailable or cannot be imported.
|
|
"""
|
|
global _mamba_ssu_backend
|
|
|
|
requested = server_args.mamba_backend or "triton"
|
|
|
|
backend_cls = _BACKEND_REGISTRY.get(requested)
|
|
if backend_cls is None:
|
|
raise ValueError(
|
|
f"Unknown mamba backend '{requested}'. "
|
|
f"Available backends: {list(_BACKEND_REGISTRY.keys())}"
|
|
)
|
|
|
|
try:
|
|
_mamba_ssu_backend = backend_cls(
|
|
enable_stochastic_rounding=(
|
|
server_args.enable_mamba_cache_stochastic_rounding
|
|
),
|
|
cache_philox_rounds=server_args.mamba_cache_philox_rounds,
|
|
)
|
|
except ImportError:
|
|
raise ValueError(
|
|
f"Mamba backend '{requested}' requested but its dependencies are not "
|
|
f"available. Install the required package or use a different "
|
|
f"--mamba-backend value."
|
|
)
|
|
|
|
logger.debug(
|
|
"Mamba selective_state_update backend initialized: %s",
|
|
_mamba_ssu_backend.name,
|
|
)
|
|
|
|
|
|
def selective_state_update(
|
|
state: torch.Tensor,
|
|
x: torch.Tensor,
|
|
dt: torch.Tensor,
|
|
A: torch.Tensor,
|
|
B: torch.Tensor,
|
|
C: torch.Tensor,
|
|
D: torch.Tensor | None = None,
|
|
z: torch.Tensor | None = None,
|
|
dt_bias: torch.Tensor | None = None,
|
|
dt_softplus: bool = False,
|
|
state_batch_indices: torch.Tensor | None = None,
|
|
pad_slot_id: int = -1,
|
|
out: torch.Tensor | None = None,
|
|
disable_state_update: bool = False,
|
|
intermediate_states_buffer: torch.Tensor | None = None,
|
|
cache_steps: int | None = None,
|
|
retrieve_parent_token: torch.Tensor | None = None,
|
|
intermediate_state_indices: torch.Tensor | None = None,
|
|
) -> None:
|
|
"""Dispatch selective-state-update to the configured backend.
|
|
|
|
This function provides a unified interface regardless of the underlying
|
|
backend. Backend-specific argument adaptation is handled inside each
|
|
:class:`MambaSSUBackend` subclass.
|
|
|
|
Args:
|
|
state: SSM state tensor (batch, nheads, dim, dstate)
|
|
x: Input tensor
|
|
dt: Delta time tensor
|
|
A: A matrix
|
|
B: B matrix
|
|
C: C matrix
|
|
D: Optional D vector
|
|
z: Optional z tensor for gating
|
|
dt_bias: Optional dt bias
|
|
dt_softplus: Whether to apply softplus to dt
|
|
state_batch_indices: Optional batch indices for state
|
|
out: Preallocated output tensor (in-place updated)
|
|
disable_state_update: If True, don't write back to state (for speculative verify)
|
|
intermediate_states_buffer: Buffer to cache intermediate states
|
|
cache_steps: Total number of steps in the buffer
|
|
retrieve_parent_token: (batch, T) tensor of parent token indices for EAGLE tree attention
|
|
intermediate_state_indices: (batch,) tensor of indices for intermediate_states_buffer operations.
|
|
If provided, uses these indices instead of state_batch_indices for the buffer.
|
|
"""
|
|
assert _mamba_ssu_backend is not None, (
|
|
"Mamba selective_state_update backend not initialized. "
|
|
"Call initialize_mamba_selective_state_update_backend() first."
|
|
)
|
|
|
|
_mamba_ssu_backend(
|
|
state,
|
|
x,
|
|
dt,
|
|
A,
|
|
B,
|
|
C,
|
|
D=D,
|
|
z=z,
|
|
dt_bias=dt_bias,
|
|
dt_softplus=dt_softplus,
|
|
state_batch_indices=state_batch_indices,
|
|
pad_slot_id=pad_slot_id,
|
|
out=out,
|
|
disable_state_update=disable_state_update,
|
|
intermediate_states_buffer=intermediate_states_buffer,
|
|
cache_steps=cache_steps,
|
|
retrieve_parent_token=retrieve_parent_token,
|
|
intermediate_state_indices=intermediate_state_indices,
|
|
)
|