vegarl / tests /test_workload_replay.py
ronitraj's picture
Deploy Space without oversized raw dataset
4fbc241
from __future__ import annotations
from pathlib import Path
from llmserve_env.task_catalog import get_task_config
from server.trace_simulator import TraceSimulator
from server.workload_generator import WorkloadGenerator
ROOT_DIR = Path(__file__).resolve().parents[1]
def _percentile(values: list[float], pct: float) -> float:
ordered = sorted(values)
index = int((len(ordered) - 1) * pct)
return ordered[index]
def test_replay_assets_exist() -> None:
expected = [
ROOT_DIR / "server" / "data" / "traces" / "static_workload_trace.parquet",
ROOT_DIR / "server" / "data" / "traces" / "bursty_workload_trace.parquet",
ROOT_DIR / "server" / "data" / "traces" / "adversarial_multitenant_trace.parquet",
ROOT_DIR / "server" / "data" / "traces" / "sharegpt_prompt_lengths.parquet",
ROOT_DIR / "server" / "data" / "lookup_tables" / "serving_profile_table.parquet",
]
for path in expected:
assert path.exists(), f"Missing replay asset: {path}"
def test_bursty_workload_prompt_distribution_is_heavy_tailed() -> None:
generator = WorkloadGenerator(get_task_config("bursty_workload"), seed=7)
samples = [generator.next_snapshot(step).mean_prompt_length for step in range(200)]
p50 = _percentile(samples, 0.50)
p95 = _percentile(samples, 0.95)
assert p95 > p50 * 3.0
def test_trace_simulator_is_deterministic_for_same_seed() -> None:
config = get_task_config("bursty_workload")
generator_a = WorkloadGenerator(config, seed=21)
generator_b = WorkloadGenerator(config, seed=21)
workload_a = generator_a.next_snapshot(15)
workload_b = generator_b.next_snapshot(15)
simulator_a = TraceSimulator(seed=21)
simulator_b = TraceSimulator(seed=21)
from llmserve_env.models import default_action
metrics_a = simulator_a.simulate_step("bursty_workload", default_action(), workload_a)
metrics_b = simulator_b.simulate_step("bursty_workload", default_action(), workload_b)
assert metrics_a == metrics_b