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
118 lines
3.9 KiB
Python
118 lines
3.9 KiB
Python
"""Process a raw srt-slurm benchmark result JSON into an aggregated format.
|
|
|
|
Usage (called once per result file):
|
|
RESULT_FILENAME=<path_without_.json> PREFILL_GPUS=<n> DECODE_GPUS=<n> \\
|
|
RECIPE_FILE=<path_to_recipe.yaml> python3 process_result.py
|
|
|
|
Required env vars:
|
|
RESULT_FILENAME - path to the result file without the .json extension
|
|
FRAMEWORK - e.g. dynamo-sglang
|
|
PRECISION - e.g. fp8, fp4
|
|
MODEL_PREFIX - short model label, e.g. dsr1
|
|
ISL - input sequence length
|
|
OSL - output sequence length
|
|
PREFILL_GPUS - number of prefill GPUs (extracted from result filename)
|
|
DECODE_GPUS - number of decode GPUs (extracted from result filename)
|
|
|
|
Optional env vars:
|
|
RECIPE_FILE - path to the srt-slurm recipe YAML; if set, topology
|
|
fields (TP, EP, DP, workers) are parsed from it
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
def require(var):
|
|
val = os.environ.get(var)
|
|
if val is None:
|
|
print(f"ERROR: Missing required env var: {var}", file=sys.stderr)
|
|
sys.exit(1)
|
|
return val
|
|
|
|
|
|
result_filename = require("RESULT_FILENAME")
|
|
framework = require("FRAMEWORK")
|
|
precision = require("PRECISION")
|
|
model_prefix = require("MODEL_PREFIX")
|
|
isl = int(require("ISL"))
|
|
osl = int(require("OSL"))
|
|
prefill_gpus = int(require("PREFILL_GPUS"))
|
|
decode_gpus = int(require("DECODE_GPUS"))
|
|
|
|
with open(f"{result_filename}.json") as f:
|
|
raw = json.load(f)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Topology — parse from recipe YAML if available, otherwise default to 0/"-"
|
|
# ---------------------------------------------------------------------------
|
|
prefill_tp = prefill_ep = prefill_dp_attn = 0
|
|
prefill_num_workers = decode_tp = decode_ep = decode_dp_attn = decode_num_workers = 0
|
|
|
|
recipe_file = os.environ.get("RECIPE_FILE")
|
|
if recipe_file and Path(recipe_file).exists():
|
|
import yaml
|
|
|
|
with open(recipe_file) as f:
|
|
recipe = yaml.safe_load(f)
|
|
|
|
res = recipe.get("resources", {})
|
|
prefill_num_workers = res.get("prefill_workers", 0)
|
|
decode_num_workers = res.get("decode_workers", 0)
|
|
|
|
sgl = recipe.get("backend", {}).get("sglang_config", {})
|
|
p = sgl.get("prefill", {})
|
|
d = sgl.get("decode", {})
|
|
|
|
prefill_tp = p.get("tensor-parallel-size", 0)
|
|
prefill_ep = p.get("expert-parallel-size", 0)
|
|
prefill_dp_attn = p.get("data-parallel-size", "-")
|
|
decode_tp = d.get("tensor-parallel-size", 0)
|
|
decode_ep = d.get("expert-parallel-size", 0)
|
|
decode_dp_attn = d.get("data-parallel-size", "-")
|
|
|
|
total_gpus = prefill_gpus + decode_gpus
|
|
|
|
data = {
|
|
"hw": os.environ.get("HW", "gb200"),
|
|
"conc": int(raw["max_concurrency"]),
|
|
"model": raw["model_id"],
|
|
"infmax_model_prefix": model_prefix,
|
|
"framework": framework,
|
|
"precision": precision,
|
|
"isl": isl,
|
|
"osl": osl,
|
|
"is_multinode": True,
|
|
"disagg": True,
|
|
"num_prefill_gpu": prefill_gpus,
|
|
"num_decode_gpu": decode_gpus,
|
|
"prefill_num_workers": prefill_num_workers,
|
|
"prefill_tp": prefill_tp,
|
|
"prefill_ep": prefill_ep,
|
|
"prefill_dp_attention": prefill_dp_attn,
|
|
"decode_num_workers": decode_num_workers,
|
|
"decode_tp": decode_tp,
|
|
"decode_ep": decode_ep,
|
|
"decode_dp_attention": decode_dp_attn,
|
|
"tput_per_gpu": float(raw["total_token_throughput"]) / total_gpus,
|
|
"output_tput_per_gpu": float(raw["output_throughput"]) / decode_gpus,
|
|
"input_tput_per_gpu": (
|
|
float(raw["total_token_throughput"]) - float(raw["output_throughput"])
|
|
)
|
|
/ prefill_gpus,
|
|
}
|
|
|
|
for key, value in raw.items():
|
|
if key.endswith("_ms"):
|
|
data[key.replace("_ms", "")] = float(value) / 1000.0
|
|
if "tpot" in key:
|
|
data[key.replace("_ms", "").replace("tpot", "intvty")] = 1000.0 / float(value)
|
|
|
|
out_path = Path(result_filename).parent / f"agg_{Path(result_filename).name}.json"
|
|
with open(out_path, "w") as f:
|
|
json.dump(data, f, indent=2)
|
|
|
|
print(f"Written: {out_path}")
|