Make telemetry audit replay-phase aware
This commit is contained in:
467
runs/intervention-response-v2/analyze_existing.py
Normal file
467
runs/intervention-response-v2/analyze_existing.py
Normal file
@@ -0,0 +1,467 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Audit telemetry responses over every uncensored replay decile.
|
||||
|
||||
This corrective analysis keeps the frozen P1 pairs and thresholds, but replaces
|
||||
the absolute 5/10-second cutoff with cumulative and non-overlapping 10%-of-trace
|
||||
windows. It deliberately reports every common decile instead of selecting the
|
||||
best-looking horizon.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import importlib.util
|
||||
import json
|
||||
import math
|
||||
from pathlib import Path
|
||||
from statistics import median
|
||||
from typing import Any, Iterable, Mapping
|
||||
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
P1_PATH = HERE.parent / "intervention-response-v0" / "analyze_p1.py"
|
||||
SCHEMA = "intervention-response-phase-aware-existing-v2"
|
||||
DECILE_FRACTION = 0.1
|
||||
MAX_DECILES = 10
|
||||
|
||||
|
||||
def _load_p1():
|
||||
spec = importlib.util.spec_from_file_location("intervention_response_p1", P1_PATH)
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
assert spec.loader is not None
|
||||
spec.loader.exec_module(module)
|
||||
return module
|
||||
|
||||
|
||||
P1 = _load_p1()
|
||||
|
||||
|
||||
def numeric(values: Iterable[float | int]) -> dict[str, Any]:
|
||||
finite = [float(value) for value in values]
|
||||
result = P1.V0.numeric(finite)
|
||||
result["median"] = median(finite)
|
||||
return result
|
||||
|
||||
|
||||
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 trial_directories(run_root: Path) -> list[Path]:
|
||||
result = []
|
||||
for cell in sorted((run_root / "cells").iterdir()):
|
||||
if not cell.is_dir():
|
||||
continue
|
||||
for candidate in sorted(cell.iterdir()):
|
||||
if candidate.is_dir() and P1.RUN_PATTERN.match(candidate.name):
|
||||
result.append(candidate)
|
||||
if not result:
|
||||
raise ValueError("P1 run root contains no measured trial directories")
|
||||
return result
|
||||
|
||||
|
||||
def load_metadata(run_root: Path) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
|
||||
metadata = []
|
||||
streams = []
|
||||
for cell in sorted((run_root / "cells").iterdir()):
|
||||
if not cell.is_dir():
|
||||
continue
|
||||
stream_paths = sorted((cell / "opprof").glob("*.jsonl"))
|
||||
if len(stream_paths) != 1:
|
||||
raise ValueError(f"{cell}: expected one Layer-1 stream")
|
||||
stream_path = stream_paths[0]
|
||||
streams.append(
|
||||
{
|
||||
"cell": cell.name,
|
||||
"path": str(stream_path.resolve()),
|
||||
"sha256": sha256_file(stream_path),
|
||||
"bytes": stream_path.stat().st_size,
|
||||
}
|
||||
)
|
||||
for run_dir in trial_directories(run_root):
|
||||
match = P1.RUN_PATTERN.match(run_dir.name)
|
||||
assert match is not None
|
||||
level, replicate_text = match.groups()
|
||||
result_path = run_dir / "result.json"
|
||||
requests_path = run_dir / "requests.jsonl"
|
||||
result = json.loads(result_path.read_text(encoding="utf-8"))
|
||||
selected = int(result["selection"]["count"])
|
||||
offered = float(result["selection"]["offered_req_s"])
|
||||
if selected <= 0 or offered <= 0.0:
|
||||
raise ValueError(f"{result_path}: invalid selected count or offered rate")
|
||||
metadata.append(
|
||||
{
|
||||
"trial_id": str(result_path.relative_to(run_root)),
|
||||
"cell": str(result["cell"]),
|
||||
"tp": int(result["tp"]),
|
||||
"mns": int(result["mns"]),
|
||||
"level": level,
|
||||
"replicate": int(replicate_text),
|
||||
"elapsed_s": float(result["interval"]["elapsed_s"]),
|
||||
"trace_duration_s": round(selected / offered, 9),
|
||||
"early_stopped": bool(result["early_stopped"]),
|
||||
"request_count": selected,
|
||||
"result_sha256": sha256_file(result_path),
|
||||
"requests_sha256": sha256_file(requests_path),
|
||||
}
|
||||
)
|
||||
return metadata, streams
|
||||
|
||||
|
||||
def common_decile_fractions(
|
||||
*, trace_duration_s: float, minimum_elapsed_s: float
|
||||
) -> tuple[float, ...]:
|
||||
if trace_duration_s <= 0.0 or minimum_elapsed_s <= 0.0:
|
||||
raise ValueError("trace duration and elapsed time must be positive")
|
||||
supported = min(
|
||||
MAX_DECILES,
|
||||
int(math.floor((minimum_elapsed_s / trace_duration_s) * 10.0 + 1e-12)),
|
||||
)
|
||||
return tuple(
|
||||
round(index * DECILE_FRACTION, 10) for index in range(1, supported + 1)
|
||||
)
|
||||
|
||||
|
||||
def _trial_record(
|
||||
*,
|
||||
run_root: Path,
|
||||
run_dir: Path,
|
||||
result: Mapping[str, Any],
|
||||
state: dict[str, float],
|
||||
outcome: dict[str, float],
|
||||
) -> dict[str, Any]:
|
||||
match = P1.RUN_PATTERN.match(run_dir.name)
|
||||
assert match is not None
|
||||
level, replicate_text = match.groups()
|
||||
result_path = run_dir / "result.json"
|
||||
requests_path = run_dir / "requests.jsonl"
|
||||
return {
|
||||
"trial_id": str(result_path.relative_to(run_root)),
|
||||
"cell": str(result["cell"]),
|
||||
"tp": int(result["tp"]),
|
||||
"mns": int(result["mns"]),
|
||||
"level": level,
|
||||
"replicate": int(replicate_text),
|
||||
"offered_rate_per_gpu": float(
|
||||
result["selection"]["offered_req_s_per_gpu"]
|
||||
),
|
||||
"request_hash": str(result["selection"]["request_id_order_sha256"]),
|
||||
"request_count": int(result["selection"]["count"]),
|
||||
"result_sha256": sha256_file(result_path),
|
||||
"requests_sha256": sha256_file(requests_path),
|
||||
"full_pass_rate": float(result["pass_rate"]),
|
||||
"full_feasible": bool(result["feasible"]),
|
||||
"early_stopped": bool(result["early_stopped"]),
|
||||
"state": state,
|
||||
"outcome": outcome,
|
||||
}
|
||||
|
||||
|
||||
def load_interval_trials(
|
||||
run_root: Path,
|
||||
intervals_s: tuple[tuple[float, float], ...],
|
||||
) -> tuple[dict[tuple[float, float], list[dict[str, Any]]], list[dict[str, Any]]]:
|
||||
by_interval = {interval: [] for interval in intervals_s}
|
||||
stream_provenance = []
|
||||
for cell in sorted((run_root / "cells").iterdir()):
|
||||
if not cell.is_dir():
|
||||
continue
|
||||
stream_paths = sorted((cell / "opprof").glob("*.jsonl"))
|
||||
if len(stream_paths) != 1:
|
||||
raise ValueError(f"{cell}: expected one Layer-1 stream")
|
||||
stream_path = stream_paths[0]
|
||||
stream = P1.load_jsonl(stream_path)
|
||||
stream_provenance.append(
|
||||
{
|
||||
"cell": cell.name,
|
||||
"path": str(stream_path.resolve()),
|
||||
"sha256": sha256_file(stream_path),
|
||||
"bytes": stream_path.stat().st_size,
|
||||
}
|
||||
)
|
||||
for run_dir in sorted(cell.iterdir()):
|
||||
if not run_dir.is_dir() or P1.RUN_PATTERN.match(run_dir.name) is None:
|
||||
continue
|
||||
result_path = run_dir / "result.json"
|
||||
requests_path = run_dir / "requests.jsonl"
|
||||
result = json.loads(result_path.read_text(encoding="utf-8"))
|
||||
requests = P1.load_jsonl(requests_path)
|
||||
start_ns = int(result["interval"]["start_mono_ns"])
|
||||
elapsed_s = float(result["interval"]["elapsed_s"])
|
||||
for interval in intervals_s:
|
||||
start_s, end_s = interval
|
||||
if start_s < 0.0 or end_s <= start_s:
|
||||
raise ValueError(f"invalid analysis interval: {interval}")
|
||||
if elapsed_s + 1e-9 < end_s:
|
||||
raise ValueError(
|
||||
f"{result_path}: elapsed {elapsed_s} shorter than {end_s}s"
|
||||
)
|
||||
state = P1.V0.flatten_state(
|
||||
P1.summarize_engine(
|
||||
stream,
|
||||
start_ns=start_ns + int(start_s * 1e9),
|
||||
end_ns=start_ns + int(end_s * 1e9),
|
||||
request_count=int(result["selection"]["count"]),
|
||||
)
|
||||
)
|
||||
outcome = P1._prefix_outcome(result, requests, end_s)
|
||||
by_interval[interval].append(
|
||||
_trial_record(
|
||||
run_root=run_root,
|
||||
run_dir=run_dir,
|
||||
result=result,
|
||||
state=state,
|
||||
outcome=outcome,
|
||||
)
|
||||
)
|
||||
return by_interval, stream_provenance
|
||||
|
||||
|
||||
def coverage(trials: list[dict[str, Any]]) -> dict[str, Any]:
|
||||
admitted = [float(trial["outcome"]["admitted_fraction"]) for trial in trials]
|
||||
completed = [
|
||||
float(trial["outcome"]["admitted_fraction"])
|
||||
* float(trial["outcome"]["completed_over_admitted"])
|
||||
for trial in trials
|
||||
]
|
||||
return {
|
||||
"admitted_fraction_of_total": numeric(admitted),
|
||||
"completed_fraction_of_total": numeric(completed),
|
||||
}
|
||||
|
||||
|
||||
def slim_window_analysis(
|
||||
trials: list[dict[str, Any]], *, start_s: float, end_s: float, fraction: float
|
||||
) -> dict[str, Any]:
|
||||
analysis = P1.analyze_horizon(trials, end_s)
|
||||
return {
|
||||
"start_s": start_s,
|
||||
"end_s": end_s,
|
||||
"end_fraction": fraction,
|
||||
"coverage_at_end": coverage(trials),
|
||||
"action_pairs": len(analysis["actions"]),
|
||||
"repeat_pairs": len(analysis["repeats"]),
|
||||
"response_statistics": analysis["response_statistics"],
|
||||
"qualifying_response_features": analysis["qualifying_response_features"],
|
||||
"efficacy": analysis["efficacy"],
|
||||
"sanity": analysis["sanity"],
|
||||
}
|
||||
|
||||
|
||||
def _pearson(left: list[float], right: list[float]) -> float | None:
|
||||
if len(left) != len(right) or not left:
|
||||
raise ValueError("Pearson inputs must be non-empty and have equal length")
|
||||
left_mean = sum(left) / len(left)
|
||||
right_mean = sum(right) / len(right)
|
||||
numerator = sum(
|
||||
(x - left_mean) * (y - right_mean)
|
||||
for x, y in zip(left, right, strict=True)
|
||||
)
|
||||
left_ss = sum((x - left_mean) ** 2 for x in left)
|
||||
right_ss = sum((y - right_mean) ** 2 for y in right)
|
||||
if left_ss == 0.0 or right_ss == 0.0:
|
||||
return None
|
||||
return numerator / math.sqrt(left_ss * right_ss)
|
||||
|
||||
|
||||
def trajectory_summary(
|
||||
block_trials: list[tuple[tuple[float, float], list[dict[str, Any]]]]
|
||||
) -> dict[str, Any]:
|
||||
if not block_trials:
|
||||
raise ValueError("trajectory requires at least one block")
|
||||
identities = []
|
||||
states_by_block = []
|
||||
for interval, trials in block_trials:
|
||||
ordered = sorted(
|
||||
trials,
|
||||
key=lambda trial: (trial["cell"], trial["level"], trial["replicate"]),
|
||||
)
|
||||
current_identities = [
|
||||
(trial["cell"], trial["level"], trial["replicate"]) for trial in ordered
|
||||
]
|
||||
if identities and current_identities != identities:
|
||||
raise ValueError("trajectory blocks do not contain identical trials")
|
||||
identities = current_identities
|
||||
states_by_block.append((interval, [trial["state"] for trial in ordered]))
|
||||
|
||||
features = {}
|
||||
for feature in P1.V0.ALL_FEATURES:
|
||||
block_values = [
|
||||
[float(state[feature]) for state in states]
|
||||
for _interval, states in states_by_block
|
||||
]
|
||||
first = block_values[0]
|
||||
last = block_values[-1]
|
||||
delta = [right - left for left, right in zip(first, last, strict=True)]
|
||||
features[feature] = {
|
||||
"block_medians": [median(values) for values in block_values],
|
||||
"first_to_last_delta": numeric(delta),
|
||||
"first_to_last_abs_delta": numeric(abs(value) for value in delta),
|
||||
"first_to_last_pearson": _pearson(first, last),
|
||||
"changed_trials": sum(abs(value) > 1e-12 for value in delta),
|
||||
}
|
||||
return {
|
||||
"trial_count": len(identities),
|
||||
"blocks": [
|
||||
{"start_s": interval[0], "end_s": interval[1]}
|
||||
for interval, _states in states_by_block
|
||||
],
|
||||
"features": features,
|
||||
}
|
||||
|
||||
|
||||
def audit(*, run_root: Path, manifest_path: Path, output_path: Path) -> dict[str, Any]:
|
||||
metadata, metadata_streams = load_metadata(run_root)
|
||||
durations = [float(item["trace_duration_s"]) for item in metadata]
|
||||
elapsed = [float(item["elapsed_s"]) for item in metadata]
|
||||
duration = median(durations)
|
||||
deciles = common_decile_fractions(
|
||||
trace_duration_s=duration, minimum_elapsed_s=min(elapsed)
|
||||
)
|
||||
if not deciles:
|
||||
raise ValueError("no complete replay decile is shared by all trials")
|
||||
cumulative_intervals = tuple(
|
||||
(0.0, round(duration * fraction, 9)) for fraction in deciles
|
||||
)
|
||||
block_intervals = tuple(
|
||||
(
|
||||
round(duration * (fraction - DECILE_FRACTION), 9),
|
||||
round(duration * fraction, 9),
|
||||
)
|
||||
for fraction in deciles
|
||||
)
|
||||
all_intervals = tuple(dict.fromkeys([*cumulative_intervals, *block_intervals]))
|
||||
trials_by_interval, streams = load_interval_trials(run_root, all_intervals)
|
||||
manifest_validation = P1.validate_manifest(
|
||||
trials_by_interval[cumulative_intervals[0]], manifest_path
|
||||
)
|
||||
|
||||
cumulative = []
|
||||
blocks = []
|
||||
for fraction, cumulative_interval, block_interval in zip(
|
||||
deciles, cumulative_intervals, block_intervals, strict=True
|
||||
):
|
||||
cumulative.append(
|
||||
slim_window_analysis(
|
||||
trials_by_interval[cumulative_interval],
|
||||
start_s=cumulative_interval[0],
|
||||
end_s=cumulative_interval[1],
|
||||
fraction=fraction,
|
||||
)
|
||||
)
|
||||
blocks.append(
|
||||
slim_window_analysis(
|
||||
trials_by_interval[block_interval],
|
||||
start_s=block_interval[0],
|
||||
end_s=block_interval[1],
|
||||
fraction=fraction,
|
||||
)
|
||||
)
|
||||
|
||||
invariants = {
|
||||
"expected_trial_count": len(metadata) == 36,
|
||||
"trace_duration_consistent": max(durations) - min(durations) <= 1e-9,
|
||||
"all_intervals_uncensored": all(
|
||||
item["elapsed_s"] + 1e-9 >= cumulative_intervals[-1][1]
|
||||
for item in metadata
|
||||
),
|
||||
"stream_provenance_consistent": metadata_streams == streams,
|
||||
"manifest_trials_match": (
|
||||
manifest_validation["expected_trials"]
|
||||
== manifest_validation["matched_trials"]
|
||||
== len(metadata)
|
||||
),
|
||||
"all_window_sanity_pass": all(
|
||||
not item["sanity"]["red_flags"] for item in [*cumulative, *blocks]
|
||||
),
|
||||
}
|
||||
red_flags = [name for name, passed in invariants.items() if not passed]
|
||||
complete_full_trajectory = min(elapsed) + 1e-9 >= duration
|
||||
if red_flags:
|
||||
decision = "STOP_DATA_INVALID"
|
||||
elif not complete_full_trajectory:
|
||||
decision = "REQUIRES_UNCENSORED_PHASE_AWARE_PILOT"
|
||||
else:
|
||||
decision = "FULL_TRAJECTORY_AVAILABLE"
|
||||
|
||||
payload = {
|
||||
"schema": SCHEMA,
|
||||
"status": "COMPLETE",
|
||||
"decision": decision,
|
||||
"claim_boundary": (
|
||||
"Post-hoc corrective audit over every common replay decile. It can "
|
||||
"diagnose horizon sensitivity but cannot establish a held-out tuning claim."
|
||||
),
|
||||
"design": {
|
||||
"decile_fraction": DECILE_FRACTION,
|
||||
"available_deciles": list(deciles),
|
||||
"trace_duration_s": duration,
|
||||
"maximum_common_end_s": cumulative_intervals[-1][1],
|
||||
"maximum_common_fraction": deciles[-1],
|
||||
"select_best_horizon": False,
|
||||
"cumulative_and_nonoverlapping_blocks": True,
|
||||
},
|
||||
"cumulative": cumulative,
|
||||
"blocks": blocks,
|
||||
"trajectory": trajectory_summary(
|
||||
[(interval, trials_by_interval[interval]) for interval in block_intervals]
|
||||
),
|
||||
"provenance": {
|
||||
"analysis_script": str(Path(__file__).resolve()),
|
||||
"analysis_script_sha256": sha256_file(Path(__file__).resolve()),
|
||||
"p1_analysis_script": str(P1_PATH.resolve()),
|
||||
"p1_analysis_script_sha256": sha256_file(P1_PATH),
|
||||
"run_root": str(run_root.resolve()),
|
||||
"manifest": str(manifest_path.resolve()),
|
||||
"manifest_sha256": sha256_file(manifest_path),
|
||||
"manifest_validation": manifest_validation,
|
||||
"streams": streams,
|
||||
"trial_inputs": metadata,
|
||||
},
|
||||
"sanity": {
|
||||
"trials": len(metadata),
|
||||
"elapsed_s": numeric(elapsed),
|
||||
"trace_duration_s": numeric(durations),
|
||||
"early_stopped": sum(bool(item["early_stopped"]) for item in metadata),
|
||||
"request_count": numeric(item["request_count"] for item in metadata),
|
||||
"stream_bytes": numeric(item["bytes"] for item in streams),
|
||||
"invariants": invariants,
|
||||
"red_flags": red_flags,
|
||||
},
|
||||
}
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
output_path.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n")
|
||||
return payload
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--run-root", type=Path, required=True)
|
||||
parser.add_argument("--manifest", type=Path, required=True)
|
||||
parser.add_argument("--output", type=Path, required=True)
|
||||
args = parser.parse_args()
|
||||
payload = audit(
|
||||
run_root=args.run_root,
|
||||
manifest_path=args.manifest,
|
||||
output_path=args.output,
|
||||
)
|
||||
print(
|
||||
json.dumps(
|
||||
{
|
||||
"decision": payload["decision"],
|
||||
"design": payload["design"],
|
||||
"sanity": payload["sanity"],
|
||||
},
|
||||
indent=2,
|
||||
sort_keys=True,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user