hizrianraz's picture
Harden August 3 Spark launch candidate
9a5e3ef verified
Raw
History Blame Contribute Delete
5.93 kB
#!/usr/bin/env python3
"""Run a small, fixed-workload, end-to-end generation measurement.
This intentionally reports request-level output tokens per second. It does not
claim decode-only throughput or transfer results between runtimes.
"""
from __future__ import annotations
import json
import os
import statistics
import sys
import time
import urllib.error
import urllib.request
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
ROOT = Path(__file__).resolve().parents[2]
OUT = ROOT / "results" / "server_bench.json"
PROMPT = """Implement this Python 3 function and return code only, with no Markdown fence:
def merge_intervals(items: list[tuple[int, int]]) -> list[tuple[int, int]]:
\"\"\"Merge overlapping or touching closed intervals.
Normalize each reversed pair first, do not mutate the input, sort the
result, return [] for empty input, and include a short docstring.
\"\"\"
"""
def _positive_int(name: str, default: int) -> int:
value = int(os.environ.get(name, str(default)))
if value < 1:
raise ValueError(f"{name} must be at least 1")
return value
def _request(
base: str,
key: str | None,
model: str,
timeout: int,
max_tokens: int,
) -> tuple[dict[str, Any], float]:
headers = {"Content-Type": "application/json"}
if key:
headers["Authorization"] = f"Bearer {key}"
payload = {
"model": model,
"messages": [{"role": "user", "content": PROMPT}],
"temperature": 0,
"seed": 20260803,
"max_tokens": max_tokens,
}
request = urllib.request.Request(
base.rstrip("/") + "/chat/completions",
data=json.dumps(payload).encode(),
headers=headers,
method="POST",
)
started = time.perf_counter()
try:
with urllib.request.urlopen(request, timeout=timeout) as response:
body = json.loads(response.read().decode())
except urllib.error.HTTPError as exc:
detail = exc.read().decode(errors="replace")[:2000]
raise RuntimeError(f"HTTP {exc.code}: {detail}") from exc
elapsed = time.perf_counter() - started
return body, elapsed
def _sample(body: dict[str, Any], elapsed: float, index: int) -> dict[str, Any]:
usage = body.get("usage") or {}
prompt_tokens = usage.get("prompt_tokens")
completion_tokens = usage.get("completion_tokens")
if not isinstance(prompt_tokens, int) or prompt_tokens < 1:
raise ValueError("response is missing a positive usage.prompt_tokens")
if not isinstance(completion_tokens, int) or completion_tokens < 1:
raise ValueError("response is missing a positive usage.completion_tokens")
choices = body.get("choices") or []
if len(choices) != 1:
raise ValueError(f"expected one response choice, got {len(choices)}")
message = choices[0].get("message") or {}
content = message.get("content")
if not isinstance(content, str) or not content.strip():
raise ValueError("response content is empty")
return {
"index": index,
"prompt_tokens": prompt_tokens,
"completion_tokens": completion_tokens,
"elapsed_seconds": elapsed,
"output_tokens_per_second_end_to_end": completion_tokens / elapsed,
"finish_reason": choices[0].get("finish_reason"),
"response_text": content,
}
def main() -> int:
base = os.environ.get("OPENAI_BASE_URL", "http://127.0.0.1:8001/v1")
key = os.environ.get("OPENAI_API_KEY")
model = os.environ.get("SMOKE_MODEL", "local-qwen3-coder-next")
timeout = _positive_int("REQUEST_TIMEOUT", 300)
warmup_runs = _positive_int("WARMUP_RUNS", 1)
measured_runs = _positive_int("MEASURED_RUNS", 5)
max_tokens = _positive_int("MAX_TOKENS", 256)
payload: dict[str, Any] = {
"schema_version": 1,
"suite": "fixed_generation_end_to_end",
"status": "failed_run",
"measured_at_utc": datetime.now(timezone.utc).isoformat(),
"endpoint": base,
"model": model,
"settings": {
"prompt": PROMPT,
"temperature": 0,
"seed": 20260803,
"max_tokens": max_tokens,
"concurrency": 1,
"warmup_runs": warmup_runs,
"measured_runs": measured_runs,
},
"warmup_completed": 0,
"samples": [],
"metric_definition": (
"completion_tokens divided by full HTTP request elapsed seconds; "
"includes prefill, decode, scheduling, serialization, and loopback overhead"
),
"limitations": (
"One short fixed coding prompt at concurrency one; not decode-only throughput, "
"a coding-quality benchmark, a long-context test, or a sustained-load result."
),
}
try:
for _ in range(warmup_runs):
body, elapsed = _request(base, key, model, timeout, max_tokens)
_sample(body, elapsed, 0)
payload["warmup_completed"] += 1
for index in range(1, measured_runs + 1):
body, elapsed = _request(base, key, model, timeout, max_tokens)
payload["samples"].append(_sample(body, elapsed, index))
rates = [sample["output_tokens_per_second_end_to_end"] for sample in payload["samples"]]
payload["summary"] = {
"output_tokens_per_second_end_to_end_p50": statistics.median(rates),
"output_tokens_per_second_end_to_end_min": min(rates),
"output_tokens_per_second_end_to_end_max": max(rates),
}
payload["status"] = "measured"
except Exception as exc:
payload["error"] = str(exc)
OUT.parent.mkdir(parents=True, exist_ok=True)
OUT.write_text(json.dumps(payload, indent=2) + "\n")
print(json.dumps(payload, indent=2))
return 0 if payload["status"] == "measured" else 1
if __name__ == "__main__":
sys.exit(main())