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
134 lines
4.2 KiB
Python
134 lines
4.2 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
"""Observability metrics for disaggregated diffusion pipelines."""
|
|
|
|
import threading
|
|
import time
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class _RequestTiming:
|
|
start_time: float
|
|
stage_start: float = 0.0
|
|
|
|
|
|
@dataclass
|
|
class RoleStats:
|
|
role: str
|
|
requests_completed: int = 0
|
|
requests_failed: int = 0
|
|
requests_in_flight: int = 0
|
|
requests_timed_out: int = 0
|
|
queue_depth: int = 0
|
|
last_latency_s: float = 0.0
|
|
avg_latency_s: float = 0.0
|
|
max_latency_s: float = 0.0
|
|
throughput_rps: float = 0.0
|
|
uptime_s: float = 0.0
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
"role": self.role,
|
|
"requests_completed": self.requests_completed,
|
|
"requests_failed": self.requests_failed,
|
|
"requests_in_flight": self.requests_in_flight,
|
|
"requests_timed_out": self.requests_timed_out,
|
|
"queue_depth": self.queue_depth,
|
|
"last_latency_s": round(self.last_latency_s, 4),
|
|
"avg_latency_s": round(self.avg_latency_s, 4),
|
|
"max_latency_s": round(self.max_latency_s, 4),
|
|
"throughput_rps": round(self.throughput_rps, 4),
|
|
"uptime_s": round(self.uptime_s, 1),
|
|
}
|
|
|
|
|
|
class DisaggMetrics:
|
|
"""Thread-safe metrics collector for a single disagg role."""
|
|
|
|
def __init__(self, role: str):
|
|
self._role = role
|
|
self._lock = threading.Lock()
|
|
self._start_time = time.monotonic()
|
|
|
|
self._completed = 0
|
|
self._failed = 0
|
|
self._timed_out = 0
|
|
|
|
self._in_flight: dict[str, _RequestTiming] = {}
|
|
|
|
self._last_latency = 0.0
|
|
self._max_latency = 0.0
|
|
self._total_latency = 0.0
|
|
|
|
self._completion_times: list[float] = []
|
|
self._throughput_window_s = 60.0
|
|
|
|
self._queue_depth = 0
|
|
|
|
@property
|
|
def role(self) -> str:
|
|
return self._role
|
|
|
|
def record_request_start(self, request_id: str) -> None:
|
|
with self._lock:
|
|
self._in_flight[request_id] = _RequestTiming(start_time=time.monotonic())
|
|
|
|
def record_request_complete(self, request_id: str) -> None:
|
|
now = time.monotonic()
|
|
with self._lock:
|
|
timing = self._in_flight.pop(request_id, None)
|
|
if timing is not None:
|
|
latency = now - timing.start_time
|
|
self._last_latency = latency
|
|
self._max_latency = max(self._max_latency, latency)
|
|
self._total_latency += latency
|
|
|
|
self._completed += 1
|
|
self._completion_times.append(now)
|
|
self._prune_completion_times(now)
|
|
|
|
def record_request_failed(self, request_id: str) -> None:
|
|
with self._lock:
|
|
self._in_flight.pop(request_id, None)
|
|
self._failed += 1
|
|
|
|
def record_request_timeout(self, request_id: str) -> None:
|
|
with self._lock:
|
|
self._in_flight.pop(request_id, None)
|
|
self._timed_out += 1
|
|
|
|
def update_queue_depth(self, depth: int) -> None:
|
|
with self._lock:
|
|
self._queue_depth = depth
|
|
|
|
def snapshot(self) -> RoleStats:
|
|
now = time.monotonic()
|
|
with self._lock:
|
|
self._prune_completion_times(now)
|
|
total = self._completed + self._failed
|
|
avg_latency = self._total_latency / total if total > 0 else 0.0
|
|
rps = (
|
|
len(self._completion_times) / self._throughput_window_s
|
|
if self._completion_times
|
|
else 0.0
|
|
)
|
|
|
|
return RoleStats(
|
|
role=self._role,
|
|
requests_completed=self._completed,
|
|
requests_failed=self._failed,
|
|
requests_in_flight=len(self._in_flight),
|
|
requests_timed_out=self._timed_out,
|
|
queue_depth=self._queue_depth,
|
|
last_latency_s=self._last_latency,
|
|
avg_latency_s=avg_latency,
|
|
max_latency_s=self._max_latency,
|
|
throughput_rps=rps,
|
|
uptime_s=now - self._start_time,
|
|
)
|
|
|
|
def _prune_completion_times(self, now: float) -> None:
|
|
cutoff = now - self._throughput_window_s
|
|
while self._completion_times and self._completion_times[0] < cutoff:
|
|
self._completion_times.pop(0)
|