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
162 lines
4.9 KiB
Python
162 lines
4.9 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
import torch
|
|
import torch.distributed as dist
|
|
|
|
from sglang.multimodal_gen.runtime.distributed import (
|
|
get_sp_group,
|
|
model_parallel_is_initialized,
|
|
)
|
|
from sglang.multimodal_gen.runtime.distributed.group_coordinator import GroupCoordinator
|
|
from sglang.multimodal_gen.runtime.distributed.parallel_state import get_world_rank
|
|
from sglang.multimodal_gen.runtime.vla.prefix_cache import (
|
|
PrefixContext,
|
|
VLADensePrefixCache,
|
|
)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class VLASplitGroup:
|
|
"""Runtime view for VLA prefix/action split execution.
|
|
|
|
This reuses the existing SP group as the coordination group. It is not a
|
|
separate parallel topology:
|
|
1. `prefix_root` computes/fetches PrefixContext and broadcasts it once.
|
|
2. `action_root` owns fallback action denoise and initial noise broadcast.
|
|
3. `action_ranks` may all participate in action SP when the policy allows it.
|
|
|
|
All rank fields are global ranks; GroupCoordinator APIs take group-local
|
|
ranks, so call `group_rank_for` before collective helpers.
|
|
"""
|
|
|
|
group: GroupCoordinator
|
|
prefix_root: int
|
|
action_root: int
|
|
action_ranks: tuple[int, ...]
|
|
rank: int
|
|
|
|
@property
|
|
def is_prefix_rank(self) -> bool:
|
|
return self.rank == self.prefix_root
|
|
|
|
@property
|
|
def is_action_rank(self) -> bool:
|
|
return self.rank in self.action_ranks
|
|
|
|
@property
|
|
def uses_action_sp(self) -> bool:
|
|
return len(self.action_ranks) > 1
|
|
|
|
def group_rank_for(self, global_rank: int) -> int:
|
|
return self.group.ranks.index(global_rank)
|
|
|
|
def broadcast_object_from_rank(self, obj, *, src: int):
|
|
return self.group.broadcast_object(
|
|
obj if self.rank == src else None,
|
|
src=self.group_rank_for(src),
|
|
)
|
|
|
|
|
|
def get_vla_split_group() -> VLASplitGroup | None:
|
|
if not dist.is_available() or not dist.is_initialized():
|
|
return None
|
|
if not model_parallel_is_initialized():
|
|
return None
|
|
group = get_sp_group()
|
|
if group.world_size <= 1:
|
|
return None
|
|
# v1 maps the split view onto SP: first rank does prefix encode, last rank
|
|
# is the action fallback/root, and all SP ranks are eligible action ranks.
|
|
return VLASplitGroup(
|
|
group=group,
|
|
prefix_root=group.ranks[0],
|
|
action_root=group.ranks[-1],
|
|
action_ranks=tuple(group.ranks),
|
|
rank=get_world_rank(),
|
|
)
|
|
|
|
|
|
def broadcast_tensor_from_rank(
|
|
tensor: torch.Tensor | None,
|
|
split: VLASplitGroup,
|
|
*,
|
|
src: int,
|
|
device: torch.device,
|
|
) -> torch.Tensor | None:
|
|
payload = (
|
|
{"is_none": tensor is None, "tensor": tensor} if split.rank == src else None
|
|
)
|
|
payload = split.group.broadcast_tensor_dict(
|
|
payload,
|
|
src=split.group_rank_for(src),
|
|
)
|
|
if payload["is_none"]:
|
|
return None
|
|
output = payload["tensor"]
|
|
if output.device != device:
|
|
output = output.to(device)
|
|
return output
|
|
|
|
|
|
def broadcast_prefix_context(
|
|
context: PrefixContext | None,
|
|
split: VLASplitGroup,
|
|
*,
|
|
src: int,
|
|
) -> PrefixContext | None:
|
|
if split.rank == src and context is None:
|
|
payload = {"is_none": True}
|
|
elif split.rank == src:
|
|
prefix_pad_masks = context.prefix_pad_masks
|
|
prefix_pad_masks_is_bool = prefix_pad_masks.dtype == torch.bool
|
|
if prefix_pad_masks_is_bool:
|
|
prefix_pad_masks = prefix_pad_masks.to(torch.uint8)
|
|
payload = {
|
|
"is_none": False,
|
|
"prefix_pad_masks": prefix_pad_masks,
|
|
"prefix_pad_masks_is_bool": prefix_pad_masks_is_bool,
|
|
"prefix_len": context.prefix_len,
|
|
"layout": dict(context.layout),
|
|
"cache_key_digest": context.cache_key_digest,
|
|
"num_layers": len(context.past_key_values),
|
|
}
|
|
for i, (keys, values, sliding_window) in enumerate(context.past_key_values):
|
|
payload[f"layer_{i}_keys"] = keys
|
|
payload[f"layer_{i}_values"] = values
|
|
payload[f"layer_{i}_sliding_window"] = sliding_window
|
|
else:
|
|
payload = None
|
|
|
|
payload = split.group.broadcast_tensor_dict(
|
|
payload,
|
|
src=split.group_rank_for(src),
|
|
)
|
|
if payload["is_none"]:
|
|
return None
|
|
|
|
kv_layers = []
|
|
for i in range(int(payload["num_layers"])):
|
|
kv_layers.append(
|
|
(
|
|
payload[f"layer_{i}_keys"],
|
|
payload[f"layer_{i}_values"],
|
|
payload[f"layer_{i}_sliding_window"],
|
|
)
|
|
)
|
|
|
|
prefix_pad_masks = payload["prefix_pad_masks"]
|
|
if payload.get("prefix_pad_masks_is_bool"):
|
|
prefix_pad_masks = prefix_pad_masks.to(torch.bool)
|
|
|
|
return PrefixContext(
|
|
past_key_values=VLADensePrefixCache(tuple(kv_layers)),
|
|
prefix_pad_masks=prefix_pad_masks,
|
|
prefix_len=int(payload["prefix_len"]),
|
|
layout=dict(payload["layout"]),
|
|
cache_key_digest=payload["cache_key_digest"],
|
|
)
|