184 lines
5.6 KiB
Python
184 lines
5.6 KiB
Python
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import csv
|
|
import json
|
|
import math
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
from common_state import numeric, residual, summarize_engine, summarize_frontier
|
|
from run_frontier_state import enable_state_outputs
|
|
|
|
|
|
def engine_record(
|
|
step: int,
|
|
timestamp_ns: int,
|
|
*,
|
|
batch: int,
|
|
prefill: int,
|
|
decode: int,
|
|
waiting: int,
|
|
running: int,
|
|
kv: float,
|
|
) -> dict[str, object]:
|
|
return {
|
|
"step_index": step,
|
|
"submit_mono_ns": timestamp_ns,
|
|
"model_executed": True,
|
|
"scheduled_requests": batch,
|
|
"decode_batch_size": decode,
|
|
"prefill_tokens": prefill,
|
|
"decode_tokens": decode,
|
|
"preemptions": 0,
|
|
"queues": {"waiting": waiting, "running": running},
|
|
"kv": {"usage": kv},
|
|
"cudagraph": {
|
|
"runtime_mode": "NONE" if step == 0 else "FULL",
|
|
"bucket_tokens": prefill + decode + 1,
|
|
"padding_tokens": 1,
|
|
},
|
|
"dropped_records_before": 0,
|
|
}
|
|
|
|
|
|
def main() -> None:
|
|
assert numeric((-2.0, -1.0))["cv"] >= 0.0
|
|
command = [
|
|
"python3",
|
|
"-m",
|
|
"frontier.main",
|
|
"--no-metrics_config_store_frontier_stage_batch_ledger",
|
|
]
|
|
state_command = enable_state_outputs(command)
|
|
assert "--metrics_config_store_frontier_stage_batch_ledger" in state_command
|
|
assert "--metrics_config_keep_individual_batch_metrics" in state_command
|
|
assert "--no-metrics_config_store_frontier_stage_batch_ledger" not in state_command
|
|
|
|
engine = summarize_engine(
|
|
[
|
|
engine_record(
|
|
0,
|
|
0,
|
|
batch=2,
|
|
prefill=6,
|
|
decode=0,
|
|
waiting=1,
|
|
running=2,
|
|
kv=0.1,
|
|
),
|
|
engine_record(
|
|
1,
|
|
1_000_000_000,
|
|
batch=4,
|
|
prefill=0,
|
|
decode=4,
|
|
waiting=3,
|
|
running=4,
|
|
kv=0.3,
|
|
),
|
|
],
|
|
start_ns=0,
|
|
end_ns=2_000_000_000,
|
|
request_count=2,
|
|
)
|
|
assert math.isclose(engine["common"]["queue_waiting_mean"], 2.0)
|
|
assert math.isclose(engine["common"]["queue_running_mean"], 3.0)
|
|
assert math.isclose(
|
|
engine["common"]["queue_waiting_time_per_request_ms"], 2000.0
|
|
)
|
|
assert engine["common"]["batch_size"]["distinct_n"] == 2
|
|
assert math.isclose(engine["common"]["prefill_token_fraction"], 0.6)
|
|
|
|
with tempfile.TemporaryDirectory() as temporary:
|
|
root = Path(temporary)
|
|
system = root / "system.json"
|
|
requests = root / "requests.csv"
|
|
batches = root / "batches.csv"
|
|
ledger = root / "ledger.jsonl"
|
|
system.write_text(
|
|
json.dumps(
|
|
{
|
|
"throughput_metrics": {
|
|
"total_duration_seconds": 2.0,
|
|
}
|
|
}
|
|
),
|
|
encoding="utf-8",
|
|
)
|
|
with requests.open("w", encoding="utf-8", newline="") as output:
|
|
writer = csv.DictWriter(
|
|
output,
|
|
fieldnames=[
|
|
"request_e2e_time",
|
|
"request_waiting_time_total",
|
|
"request_total_preemption_count",
|
|
],
|
|
)
|
|
writer.writeheader()
|
|
writer.writerow(
|
|
{
|
|
"request_e2e_time": 2000,
|
|
"request_waiting_time_total": 1000,
|
|
"request_total_preemption_count": 0,
|
|
}
|
|
)
|
|
writer.writerow(
|
|
{
|
|
"request_e2e_time": 3000,
|
|
"request_waiting_time_total": 3000,
|
|
"request_total_preemption_count": 0,
|
|
}
|
|
)
|
|
with batches.open("w", encoding="utf-8", newline="") as output:
|
|
writer = csv.DictWriter(
|
|
output,
|
|
fieldnames=[
|
|
"batch_size",
|
|
"batch_num_tokens",
|
|
"batch_num_prefill_tokens",
|
|
"batch_num_decode_tokens",
|
|
],
|
|
)
|
|
writer.writeheader()
|
|
writer.writerow(
|
|
{
|
|
"batch_size": 2,
|
|
"batch_num_tokens": 6,
|
|
"batch_num_prefill_tokens": 6,
|
|
"batch_num_decode_tokens": 0,
|
|
}
|
|
)
|
|
writer.writerow(
|
|
{
|
|
"batch_size": 4,
|
|
"batch_num_tokens": 4,
|
|
"batch_num_prefill_tokens": 0,
|
|
"batch_num_decode_tokens": 4,
|
|
}
|
|
)
|
|
ledger.write_text(
|
|
json.dumps({"stage_start_ts": 0.0, "stage_end_ts": 1.0}) + "\n"
|
|
+ json.dumps({"stage_start_ts": 1.0, "stage_end_ts": 2.0})
|
|
+ "\n",
|
|
encoding="utf-8",
|
|
)
|
|
simulator = summarize_frontier(
|
|
system_metrics_path=system,
|
|
request_metrics_path=requests,
|
|
batch_metrics_path=batches,
|
|
ledger_path=ledger,
|
|
)
|
|
assert math.isclose(simulator["common"]["queue_waiting_mean"], 2.0)
|
|
assert math.isclose(simulator["common"]["queue_running_mean"], 0.5)
|
|
assert simulator["common"]["batch_size"]["distinct_n"] == 2
|
|
difference = residual(engine, simulator)
|
|
assert difference["coverage"]["missing"] == 0
|
|
assert difference["coverage"]["available"] == 16
|
|
assert math.isclose(difference["values"]["queue_waiting_mean"], 0.0)
|
|
print("telemetry common state: PASS")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|