352 lines
13 KiB
Python
352 lines
13 KiB
Python
#!/usr/bin/env python3
|
|
"""Materialize session-disjoint pilot repeats and freeze attainable anchors.
|
|
|
|
The private outputs retain prompt text and stay on the experiment host. The
|
|
public manifest contains only aggregate counts, hashes, paths, and parameters.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import hashlib
|
|
import json
|
|
import math
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
|
|
AITUNER_ROOT = Path(os.environ.get("AITUNER_ROOT", Path(__file__).resolve().parents[2]))
|
|
sys.path.insert(0, str(AITUNER_ROOT / "src"))
|
|
|
|
from aituner.spec import load_study_spec # noqa: E402
|
|
from aituner.trace import load_trace_requests, select_requests_for_threshold # noqa: E402
|
|
|
|
|
|
ROLES = ("burnin", "low1", "high1", "low2", "high2", "low3", "high3")
|
|
CELLS = {
|
|
"tp1_mns8": {"tp": 1, "mns": 8, "frontier_req_s_gpu": 2.3833333333333333},
|
|
"tp1_mns64": {"tp": 1, "mns": 64, "frontier_req_s_gpu": 2.3833333333333333},
|
|
"tp2_mns8": {"tp": 2, "mns": 8, "frontier_req_s_gpu": 2.2416666666666667},
|
|
"tp2_mns64": {"tp": 2, "mns": 64, "frontier_req_s_gpu": 2.3},
|
|
"tp4_mns16": {"tp": 4, "mns": 16, "frontier_req_s_gpu": 2.5},
|
|
"tp4_mns64": {"tp": 4, "mns": 64, "frontier_req_s_gpu": 2.5},
|
|
}
|
|
TARGET_MULTIPLIERS = {"low": 0.85, "high": 1.25}
|
|
|
|
|
|
def atomic_json(path: Path, payload: Any) -> None:
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
tmp = path.with_suffix(path.suffix + ".tmp")
|
|
tmp.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
os.replace(tmp, path)
|
|
|
|
|
|
def sha256_file(path: Path) -> str:
|
|
digest = hashlib.sha256()
|
|
with path.open("rb") as source:
|
|
for chunk in iter(lambda: source.read(1 << 20), b""):
|
|
digest.update(chunk)
|
|
return digest.hexdigest()
|
|
|
|
|
|
def order_hash(values: list[str]) -> str:
|
|
return hashlib.sha256("\n".join(values).encode()).hexdigest()
|
|
|
|
|
|
def resolve_source_trace(windows_path: Path, window_id: str) -> tuple[dict[str, Any], Path]:
|
|
payload = json.loads(windows_path.read_text(encoding="utf-8"))
|
|
for window in payload["windows"]:
|
|
if window["window_id"] != window_id:
|
|
continue
|
|
trace = Path(window["trace_file"])
|
|
if not trace.is_absolute():
|
|
trace = (windows_path.parent / trace).resolve()
|
|
return window, trace
|
|
raise ValueError(f"window not found: {window_id}")
|
|
|
|
|
|
def materialize_bands(
|
|
source_trace: Path,
|
|
source_window: dict[str, Any],
|
|
private_root: Path,
|
|
) -> tuple[Path, dict[str, Any]]:
|
|
traces_root = private_root / "traces"
|
|
traces_root.mkdir(parents=True, exist_ok=True)
|
|
temporary = {role: traces_root / f".{role}.jsonl.tmp" for role in ROLES}
|
|
final = {role: traces_root / f"{role}.jsonl" for role in ROLES}
|
|
handles = {role: temporary[role].open("w", encoding="utf-8") for role in ROLES}
|
|
stats = {
|
|
role: {
|
|
"rows": 0,
|
|
"sum_input_tokens": 0,
|
|
"min_timestamp": None,
|
|
"max_timestamp": None,
|
|
}
|
|
for role in ROLES
|
|
}
|
|
try:
|
|
with source_trace.open(encoding="utf-8") as source:
|
|
for line_number, line in enumerate(source):
|
|
row = json.loads(line)
|
|
value = float(row["sampling_u"])
|
|
if not 0.0 <= value <= 1.0:
|
|
raise ValueError(f"sampling_u outside [0,1] at line {line_number}")
|
|
band = min(len(ROLES) - 1, int(value * len(ROLES)))
|
|
role = ROLES[band]
|
|
remapped = value * len(ROLES) - band
|
|
row["sampling_u"] = min(remapped, math.nextafter(1.0, 0.0))
|
|
row["fidelity_pilot_band"] = role
|
|
handles[role].write(json.dumps(row, ensure_ascii=False) + "\n")
|
|
timestamp = float(row["timestamp"])
|
|
item = stats[role]
|
|
item["rows"] += 1
|
|
item["sum_input_tokens"] += int(row.get("input_length") or 0)
|
|
item["min_timestamp"] = (
|
|
timestamp if item["min_timestamp"] is None
|
|
else min(float(item["min_timestamp"]), timestamp)
|
|
)
|
|
item["max_timestamp"] = (
|
|
timestamp if item["max_timestamp"] is None
|
|
else max(float(item["max_timestamp"]), timestamp)
|
|
)
|
|
finally:
|
|
for handle in handles.values():
|
|
handle.close()
|
|
for role in ROLES:
|
|
os.replace(temporary[role], final[role])
|
|
stats[role]["sha256"] = sha256_file(final[role])
|
|
stats[role]["bytes"] = final[role].stat().st_size
|
|
|
|
windows = []
|
|
for role in ROLES:
|
|
window = dict(source_window)
|
|
window["window_id"] = f"fidelity_pilot_{role}"
|
|
window["trace_file"] = f"traces/{role}.jsonl"
|
|
window["num_requests"] = stats[role]["rows"]
|
|
window["sum_input_length"] = stats[role]["sum_input_tokens"]
|
|
window["sampling_strategy"] = "session_uniform_seven_disjoint_bands_remapped"
|
|
window["fidelity_pilot_role"] = role
|
|
windows.append(window)
|
|
private_windows = private_root / "windows.json"
|
|
atomic_json(
|
|
private_windows,
|
|
{
|
|
"schema": "fidelity-pilot-private-windows-v1",
|
|
"roles": list(ROLES),
|
|
"windows": windows,
|
|
},
|
|
)
|
|
return private_windows, stats
|
|
|
|
|
|
def write_studies(
|
|
*,
|
|
base_primary: Path,
|
|
base_tp4: Path,
|
|
private_windows: Path,
|
|
private_root: Path,
|
|
) -> dict[str, dict[str, Path]]:
|
|
bases = {
|
|
"primary": json.loads(base_primary.read_text(encoding="utf-8")),
|
|
"tp4": json.loads(base_tp4.read_text(encoding="utf-8")),
|
|
}
|
|
result: dict[str, dict[str, Path]] = {}
|
|
for role in ROLES:
|
|
result[role] = {}
|
|
for tier, base in bases.items():
|
|
payload = json.loads(json.dumps(base))
|
|
payload["study_id"] = f"fidelity-prefix-pilot-{role}-{tier}"
|
|
payload["hardware"]["host_candidates"] = ["dash0"]
|
|
payload["engine"]["engine_version"] = "0.24.1.dev3+opprof"
|
|
payload["trace"]["windows_path"] = str(private_windows)
|
|
payload["trace"]["window_id"] = f"fidelity_pilot_{role}"
|
|
path = private_root / "studies" / f"{role}-{tier}.json"
|
|
atomic_json(path, payload)
|
|
result[role][tier] = path
|
|
return result
|
|
|
|
|
|
def attainable_anchor(requests: list[Any], target_count: int) -> tuple[float, list[Any]]:
|
|
ordered = sorted(float(request.sampling_u) for request in requests)
|
|
if not ordered:
|
|
raise ValueError("no requests after study filtering")
|
|
candidate_indices = sorted({
|
|
max(0, min(len(ordered) - 1, target_count - 1)),
|
|
max(0, min(len(ordered) - 1, target_count)),
|
|
})
|
|
candidates = []
|
|
for index in candidate_indices:
|
|
anchor = ordered[index]
|
|
selected = select_requests_for_threshold(requests, threshold=anchor)
|
|
candidates.append((abs(len(selected) - target_count), len(selected), anchor, selected))
|
|
_error, _count, anchor, selected = min(candidates, key=lambda item: (item[0], item[1]))
|
|
return anchor, selected
|
|
|
|
|
|
def selected_record(selected: list[Any], *, tp: int, duration_s: float) -> dict[str, Any]:
|
|
return {
|
|
"anchor": max(float(request.sampling_u) for request in selected),
|
|
"selected_count": len(selected),
|
|
"offered_req_s": len(selected) / duration_s,
|
|
"offered_req_s_per_gpu": len(selected) / duration_s / tp,
|
|
"request_id_order_sha256": order_hash([request.row_id for request in selected]),
|
|
"arrival_order_sha256": order_hash([f"{request.arrival_s:.12f}" for request in selected]),
|
|
"input_length_order_sha256": order_hash(
|
|
[str(request.prompt_tokens_hint) for request in selected]
|
|
),
|
|
}
|
|
|
|
|
|
def build_manifest(
|
|
*,
|
|
studies: dict[str, dict[str, Path]],
|
|
private_windows: Path,
|
|
band_stats: dict[str, Any],
|
|
source_trace: Path,
|
|
source_windows: Path,
|
|
source_window_id: str,
|
|
) -> dict[str, Any]:
|
|
loaded = {}
|
|
durations = {}
|
|
for role, tiers in studies.items():
|
|
loaded[role] = {}
|
|
for tier, path in tiers.items():
|
|
study = load_study_spec(path)
|
|
window, requests = load_trace_requests(study, study_spec_path=path)
|
|
loaded[role][tier] = requests
|
|
durations[role] = float(window.window_end - window.window_start)
|
|
|
|
cells = {}
|
|
all_hashes = []
|
|
for cell, config in CELLS.items():
|
|
tp = int(config["tp"])
|
|
tier = "tp4" if tp == 4 else "primary"
|
|
targets = {}
|
|
for level, multiplier in TARGET_MULTIPLIERS.items():
|
|
target_rate = float(config["frontier_req_s_gpu"]) * multiplier
|
|
target_count = round(target_rate * durations["low1"] * tp)
|
|
roles = [role for role in ROLES if role == "burnin" or role.startswith(level)]
|
|
selections = {}
|
|
for role in roles:
|
|
anchor, selected = attainable_anchor(loaded[role][tier], target_count)
|
|
record = selected_record(selected, tp=tp, duration_s=durations[role])
|
|
record["anchor"] = anchor
|
|
record["study"] = str(studies[role][tier])
|
|
selections[role] = record
|
|
all_hashes.append(record["request_id_order_sha256"])
|
|
targets[level] = {
|
|
"multiplier": multiplier,
|
|
"target_req_s_per_gpu": target_rate,
|
|
"target_count": target_count,
|
|
"selections": selections,
|
|
}
|
|
cells[cell] = {**config, "targets": targets}
|
|
|
|
red_flags = []
|
|
for cell, config in cells.items():
|
|
for level, target in config["targets"].items():
|
|
if not target["selections"]:
|
|
red_flags.append(f"missing_{cell}_{level}")
|
|
for selection in target["selections"].values():
|
|
if selection["selected_count"] <= 0:
|
|
red_flags.append(f"empty_{cell}_{level}")
|
|
per_cell_distinct = {}
|
|
for cell, config in cells.items():
|
|
hashes = [
|
|
selection["request_id_order_sha256"]
|
|
for target in config["targets"].values()
|
|
for selection in target["selections"].values()
|
|
]
|
|
per_cell_distinct[cell] = len(hashes) == len(set(hashes))
|
|
if not per_cell_distinct[cell]:
|
|
red_flags.append(f"session_bands_overlap_{cell}")
|
|
return {
|
|
"schema": "fidelity-prefix-pilot-manifest-v1",
|
|
"status": "PASS" if not red_flags else "STOP",
|
|
"source": {
|
|
"windows": str(source_windows),
|
|
"window_id": source_window_id,
|
|
"trace": str(source_trace),
|
|
"trace_sha256": sha256_file(source_trace),
|
|
},
|
|
"private": {
|
|
"windows": str(private_windows),
|
|
"windows_sha256": sha256_file(private_windows),
|
|
"band_stats": band_stats,
|
|
"studies": {
|
|
role: {tier: str(path) for tier, path in tiers.items()}
|
|
for role, tiers in studies.items()
|
|
},
|
|
},
|
|
"roles": list(ROLES),
|
|
"cells": cells,
|
|
"execution": {
|
|
"cutoff_s": 5.0,
|
|
"replicates_per_level": 3,
|
|
"label": "2-of-3 session-disjoint repetitions",
|
|
"even_cell_order": ["low1", "high1", "high2", "low2", "low3", "high3"],
|
|
"odd_cell_order": ["high1", "low1", "low2", "high2", "high3", "low3"],
|
|
"hard_cap_h20_hours": 3.5,
|
|
},
|
|
"sanity": {
|
|
"red_flags": red_flags,
|
|
"n_cells": len(cells),
|
|
"n_roles": len(ROLES),
|
|
"selected_sets": len(all_hashes),
|
|
"distinct_selected_sets": len(set(all_hashes)),
|
|
"per_cell_selected_sets_distinct": per_cell_distinct,
|
|
"invariants": {
|
|
"cells_6": len(cells) == 6,
|
|
"roles_7": len(ROLES) == 7,
|
|
"band_rows_nonzero": all(stats["rows"] > 0 for stats in band_stats.values()),
|
|
"session_bands_disjoint_per_cell": all(per_cell_distinct.values()),
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--source-windows", type=Path, required=True)
|
|
parser.add_argument("--source-window-id", default="chat_w20260312_1000")
|
|
parser.add_argument("--base-primary-study", type=Path, required=True)
|
|
parser.add_argument("--base-tp4-study", type=Path, required=True)
|
|
parser.add_argument("--private-root", type=Path, required=True)
|
|
parser.add_argument("--public-manifest", type=Path, required=True)
|
|
args = parser.parse_args()
|
|
|
|
source_window, source_trace = resolve_source_trace(
|
|
args.source_windows, args.source_window_id
|
|
)
|
|
private_windows, band_stats = materialize_bands(
|
|
source_trace, source_window, args.private_root
|
|
)
|
|
studies = write_studies(
|
|
base_primary=args.base_primary_study,
|
|
base_tp4=args.base_tp4_study,
|
|
private_windows=private_windows,
|
|
private_root=args.private_root,
|
|
)
|
|
manifest = build_manifest(
|
|
studies=studies,
|
|
private_windows=private_windows,
|
|
band_stats=band_stats,
|
|
source_trace=source_trace,
|
|
source_windows=args.source_windows,
|
|
source_window_id=args.source_window_id,
|
|
)
|
|
atomic_json(args.public_manifest, manifest)
|
|
print(json.dumps({
|
|
"status": manifest["status"],
|
|
"manifest": str(args.public_manifest),
|
|
"sanity": manifest["sanity"],
|
|
}, sort_keys=True))
|
|
if manifest["status"] != "PASS":
|
|
raise RuntimeError(f"pilot preflight failed: {manifest['sanity']['red_flags']}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|