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
166 lines
4.7 KiB
Python
166 lines
4.7 KiB
Python
from __future__ import annotations
|
|
|
|
import functools
|
|
import re
|
|
from pathlib import Path
|
|
from typing import TYPE_CHECKING, Callable, Generic, Optional, Tuple, TypeVar
|
|
|
|
import torch
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
_T = TypeVar("_T")
|
|
_U = TypeVar("_U")
|
|
|
|
|
|
def _check_equal_lengths(**named_lists: list) -> None:
|
|
lengths: dict[str, int] = {name: len(lst) for name, lst in named_lists.items()}
|
|
unique: set[int] = set(lengths.values())
|
|
if len(unique) > 1:
|
|
details: str = ", ".join(f"{name}={length}" for name, length in lengths.items())
|
|
raise ValueError(f"Length mismatch: {details}")
|
|
|
|
|
|
def auto_descend_dir(directory: Path, label: str) -> Path:
|
|
"""If directory has no .pt files but exactly one subdirectory does, descend into it.
|
|
|
|
Raises ValueError when the layout is ambiguous (>=2 subdirs with .pt)
|
|
or when no .pt data is found at all.
|
|
"""
|
|
if any(directory.glob("*.pt")):
|
|
return directory
|
|
|
|
candidates: list[Path] = [
|
|
sub for sub in directory.iterdir() if sub.is_dir() and any(sub.glob("*.pt"))
|
|
]
|
|
|
|
if len(candidates) >= 2:
|
|
names: str = ", ".join(sorted(c.name for c in candidates))
|
|
raise ValueError(
|
|
f"{label}: directory {directory} has no .pt files at top level "
|
|
f"and multiple subdirectories contain data ({names}). "
|
|
f"Please specify the exact subdirectory."
|
|
)
|
|
|
|
if len(candidates) == 0:
|
|
raise ValueError(
|
|
f"{label}: no .pt files found in {directory} or any of its subdirectories."
|
|
)
|
|
|
|
resolved: Path = candidates[0]
|
|
|
|
from sglang.srt.debug_utils.comparator.log_sink import log_sink
|
|
from sglang.srt.debug_utils.comparator.output_types import InfoLog
|
|
|
|
log_sink.add(
|
|
InfoLog(
|
|
category="auto_descend",
|
|
message=f"auto-descend {label}: {directory} -> {resolved}",
|
|
)
|
|
)
|
|
return resolved
|
|
|
|
|
|
class _StrictBase(BaseModel):
|
|
model_config = ConfigDict(extra="forbid")
|
|
|
|
|
|
class _FrozenBase(BaseModel):
|
|
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
|
|
|
|
class Pair(_FrozenBase, Generic[_T]):
|
|
x: _T
|
|
y: _T
|
|
|
|
def map(self, fn: Callable[[_T], _U]) -> Pair[_U]:
|
|
return Pair(x=fn(self.x), y=fn(self.y))
|
|
|
|
|
|
def argmax_coord(x: torch.Tensor) -> Tuple[int, ...]:
|
|
flat_idx = x.argmax()
|
|
return tuple(idx.item() for idx in torch.unravel_index(flat_idx, x.shape))
|
|
|
|
|
|
def compute_smaller_dtype(
|
|
dtypes: Pair[torch.dtype],
|
|
) -> Optional[torch.dtype]:
|
|
info_dict = {
|
|
(torch.float32, torch.bfloat16): torch.bfloat16,
|
|
# ... add more ...
|
|
}
|
|
return info_dict.get((dtypes.x, dtypes.y)) or info_dict.get((dtypes.y, dtypes.x))
|
|
|
|
|
|
def try_unify_shape(x: torch.Tensor, target_shape: torch.Size) -> torch.Tensor:
|
|
x_shape = x.shape
|
|
num_dim_to_remove = len(x_shape) - len(target_shape)
|
|
if (x_shape[num_dim_to_remove:] == target_shape) and all(
|
|
val == 1 for val in x_shape[:num_dim_to_remove]
|
|
):
|
|
return functools.reduce(lambda a, _: a.squeeze(0), range(num_dim_to_remove), x)
|
|
|
|
return x
|
|
|
|
|
|
# Copied from DeepGEMM
|
|
def calc_rel_diff(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor:
|
|
x, y = x.double(), y.double()
|
|
denominator = (x * x + y * y).sum()
|
|
sim = 2 * (x * y).sum() / denominator
|
|
return 1 - sim
|
|
|
|
|
|
def calc_per_token_rel_diff(
|
|
x: torch.Tensor, y: torch.Tensor, *, seq_dim: int
|
|
) -> torch.Tensor:
|
|
"""Cosine-distance-like metric per token position.
|
|
|
|
Sums over all dims except seq_dim.
|
|
"""
|
|
x, y = x.double(), y.double()
|
|
other_dims: list[int] = [d for d in range(x.dim()) if d != seq_dim]
|
|
|
|
if other_dims:
|
|
denominator: torch.Tensor = (x * x + y * y).sum(dim=other_dims)
|
|
sim: torch.Tensor = 2 * (x * y).sum(dim=other_dims) / (denominator + 1e-10)
|
|
else:
|
|
denominator = x * x + y * y
|
|
sim = 2 * (x * y) / (denominator + 1e-10)
|
|
|
|
return (1 - sim).float()
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
from sglang.srt.debug_utils.comparator.output_types import SummaryRecord
|
|
|
|
|
|
def compute_exit_code(
|
|
summary: SummaryRecord,
|
|
*,
|
|
allow_skipped_pattern: str,
|
|
skipped_names: list[str],
|
|
allow_failed_pattern: Optional[str],
|
|
failed_names: list[str],
|
|
errored_names: Optional[list[str]] = None,
|
|
) -> int:
|
|
if summary.passed == 0:
|
|
return 1
|
|
|
|
if errored_names:
|
|
return 1
|
|
|
|
if not _is_all_match_pattern(pattern=allow_failed_pattern, strings=failed_names):
|
|
return 1
|
|
|
|
if not _is_all_match_pattern(pattern=allow_skipped_pattern, strings=skipped_names):
|
|
return 1
|
|
|
|
return 0
|
|
|
|
|
|
def _is_all_match_pattern(*, pattern: Optional[str], strings: list[str]) -> bool:
|
|
if pattern is None:
|
|
return len(strings) == 0
|
|
compiled: re.Pattern[str] = re.compile(pattern)
|
|
return all(compiled.fullmatch(s) for s in strings)
|