| |
| """Aggregate raw benchmark samples across fresh device processes.""" |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import hashlib |
| import json |
| import math |
| import statistics |
| from collections import defaultdict |
| from pathlib import Path |
| from typing import Iterable |
|
|
|
|
| def distribution(values: Iterable[float]) -> dict[str, float]: |
| ordered = sorted(float(value) for value in values) |
| if not ordered: |
| raise SystemExit("cannot summarize an empty distribution") |
| if any(not math.isfinite(value) or value <= 0 for value in ordered): |
| raise SystemExit("timing samples must be finite and positive") |
|
|
| def quantile(q: float) -> float: |
| at = q * (len(ordered) - 1) |
| lower = int(at) |
| upper = min(lower + 1, len(ordered) - 1) |
| return ordered[lower] + (ordered[upper] - ordered[lower]) * (at - lower) |
|
|
| return { |
| "mean": statistics.fmean(ordered), |
| "median": quantile(0.5), |
| "p25": quantile(0.25), |
| "p75": quantile(0.75), |
| "min": ordered[0], |
| "max": ordered[-1], |
| } |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--records", required=True, type=Path) |
| parser.add_argument("--metadata", required=True, type=Path) |
| parser.add_argument("--output-json", required=True, type=Path) |
| parser.add_argument("--output-markdown", required=True, type=Path) |
| args = parser.parse_args() |
|
|
| artifact = json.loads(args.records.read_text(encoding="utf-8-sig")) |
| metadata = json.loads(args.metadata.read_text(encoding="utf-8-sig")) |
| if int(metadata["processes"]) < 3: |
| raise SystemExit("paper protocol requires at least three processes") |
| expected_samples = int(metadata["retained_samples_per_workload"]) |
| if expected_samples < 20: |
| raise SystemExit("paper protocol requires at least 20 samples per process") |
|
|
| grouped: dict[str, list[dict[str, object]]] = defaultdict(list) |
| for record in artifact.get("records", []): |
| if record.get("kind") != "dinovision_benchmark": |
| raise SystemExit("unexpected benchmark record kind") |
| samples = record.get("samples_ms", []) |
| if len(samples) != expected_samples: |
| raise SystemExit( |
| f"{record.get('label')} has {len(samples)} samples, expected {expected_samples}" |
| ) |
| computed = distribution(float(value) for value in samples) |
| for field, key in ( |
| ("median_ms", "median"), |
| ("p25_ms", "p25"), |
| ("p75_ms", "p75"), |
| ("min_ms", "min"), |
| ("max_ms", "max"), |
| ("mean_ms", "mean"), |
| ): |
| if not math.isclose( |
| float(record[field]), computed[key], rel_tol=0.0, abs_tol=1e-4 |
| ): |
| raise SystemExit( |
| f"{record.get('label')} has inconsistent {field}: " |
| f"{record[field]} vs {computed[key]} from raw samples" |
| ) |
| grouped[str(record["label"])].append(record) |
|
|
| workloads: list[dict[str, object]] = [] |
| for label, records in sorted(grouped.items()): |
| if len(records) != int(metadata["processes"]): |
| raise SystemExit( |
| f"{label!r} occurs in {len(records)} processes, expected {metadata['processes']}" |
| ) |
| sources = {str(record.get("artifact_source")) for record in records} |
| if len(sources) != len(records): |
| raise SystemExit(f"{label!r} does not have one record per distinct process log") |
| macs = {int(record["macs"]) for record in records} |
| if len(macs) != 1: |
| raise SystemExit(f"{label!r} has inconsistent MAC counts") |
| mac_count = next(iter(macs)) |
| samples = [float(value) for record in records for value in record["samples_ms"]] |
| timings = distribution(samples) |
| process_medians = distribution(float(record["median_ms"]) for record in records) |
| median_ms = timings["median"] |
| workloads.append( |
| { |
| "label": label, |
| "macs": mac_count, |
| "processes": len(records), |
| "samples": len(samples), |
| "timing_ms": timings, |
| "process_median_ms": process_medians, |
| "median_gflops": (2.0 * mac_count) / (median_ms / 1000.0) / 1e9, |
| } |
| ) |
|
|
| private_metadata = { |
| "device_serial", |
| "binary", |
| "recovery_manifest", |
| "recovery_manifest_sha256", |
| } |
| public_metadata = { |
| key: value for key, value in metadata.items() if key not in private_metadata |
| } |
| result = { |
| "schema_version": 1, |
| "benchmark_metadata": public_metadata, |
| "records_sha256": hashlib.sha256(args.records.read_bytes()).hexdigest(), |
| "workloads": workloads, |
| } |
| args.output_json.parent.mkdir(parents=True, exist_ok=True) |
| args.output_markdown.parent.mkdir(parents=True, exist_ok=True) |
| args.output_json.write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") |
|
|
| lines = [ |
| "# Isolated Quest benchmark", |
| "", |
| f"Condition: `{metadata['condition']}`. Each workload has {metadata['processes']} processes x {expected_samples} retained samples after {metadata['warmups_per_process']} warmups/process.", |
| "", |
| "| Workload | Pooled median [IQR] (ms) | Process medians: median [min, max] (ms) | Pooled min-max (ms) | Median GFLOP/s |", |
| "|---|---:|---:|---:|---:|", |
| ] |
| for workload in workloads: |
| timing = workload["timing_ms"] |
| lines.append( |
| f"| {workload['label']} " |
| f"| {timing['median']:.2f} [{timing['p25']:.2f}, {timing['p75']:.2f}] " |
| f"| {workload['process_median_ms']['median']:.2f} " |
| f"[{workload['process_median_ms']['min']:.2f}, {workload['process_median_ms']['max']:.2f}] " |
| f"| {timing['min']:.2f}-{timing['max']:.2f} " |
| f"| {workload['median_gflops']:.1f} |" |
| ) |
| args.output_markdown.write_text("\n".join(lines) + "\n", encoding="utf-8") |
| print(f"wrote {args.output_json} and {args.output_markdown}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|