[diffusion] CI: expose nightly server telemetry coverage (#38782)

Co-authored-by: Mick Qian <mickqian@users.noreply.github.com>
This commit is contained in:
Mick
2026-09-11 23:07:37 +08:00
committed by GitHub
co-authored by Mick Qian
parent 7f09fbcd25
commit e016de462c
3 changed files with 61 additions and 4 deletions
@@ -258,6 +258,23 @@ def _stage_group_seconds(result: dict, suffixes: str | tuple[str, ...]) -> float
return sum(values) / 1000.0
def _server_sample_coverage(result: dict) -> tuple[int, int] | None:
total = result.get("measurement_count")
if not isinstance(total, int) or total <= 0:
return None
samples = result.get("server_latency_samples_s")
if isinstance(samples, list):
available = len(samples)
elif "missing_perf_dumps" in result:
available = total - int(result["missing_perf_dumps"])
elif result.get("server_latency_s") is not None:
available = total
else:
available = 0
return max(0, min(available, total)), total
def _sanitize_filename(name: str) -> str:
"""Sanitize a case ID to be a safe filename."""
return name.replace("/", "_").replace(" ", "_").replace(":", "_")
@@ -289,6 +306,16 @@ def generate_dashboard(
current_records = _extract_case_records(current)
case_ids = list(current_cases.keys())
incomplete_server_telemetry = []
for cid in case_ids:
record = current_records.get(cid, {}).get("sglang", {})
coverage = _server_sample_coverage(record)
if coverage is not None and coverage[0] < coverage[1]:
model = record.get("model", cid).split("/")[-1]
incomplete_server_telemetry.append(
f"**{model}**: {coverage[0]}/{coverage[1]}"
)
# ---- Regression detection ----
regressions: list[str] = []
if history:
@@ -311,6 +338,16 @@ def generate_dashboard(
lines.append(f"> - {reg}")
lines.append("\n")
if incomplete_server_telemetry:
lines.append(
"> [!WARNING]\n> **Incomplete Server Telemetry**\n>\n"
"> Client-side latency includes every measured request, but server-side "
"stage medians use only the readable perf dumps."
)
for coverage in incomplete_server_telemetry:
lines.append(f"> - {coverage} server samples available")
lines.append("\n")
# Discover all frameworks present in results
all_frameworks = []
seen_fw = set()
@@ -334,8 +371,8 @@ def generate_dashboard(
risk_map[cid] = _assess_risk(cid, current_cases, history, other_frameworks)
# Dynamic header
header = "| Model | Risk | Samples |"
sep = "|-------|------|---------|"
header = "| Model | Risk | Client samples | Server samples |"
sep = "|-------|------|----------------|----------------|"
for fw in all_frameworks:
header += f" {fw} median (s) |"
sep += "---------|"
@@ -359,10 +396,17 @@ def generate_dashboard(
sample_count = sg_record.get("measurement_count")
if not sample_count and sg_lat is not None:
sample_count = 1
server_coverage = _server_sample_coverage(sg_record)
server_samples = (
f"{server_coverage[0]}/{server_coverage[1]}"
if server_coverage is not None
else "N/A"
)
risk_emoji, _ = risk_map.get(cid, ("✅", ""))
row = (
f"| {r['model'].split('/')[-1]} | {risk_emoji} | {sample_count or 'N/A'} |"
f"| {r['model'].split('/')[-1]} | {risk_emoji} | "
f"{sample_count or 'N/A'} | {server_samples} |"
)
# Latency columns -- bold the fastest
lats = {fw: case_fws.get(fw) for fw in all_frameworks}