mad-bot's picture
Publish verified DinoVision case-study artifacts (part 2)
da5fb15 verified
Raw
History Blame Contribute Delete
3.1 kB
#!/usr/bin/env python3
"""Verify and summarize repeated deterministic decoder-training runs."""
from __future__ import annotations
import argparse
import hashlib
import json
from datetime import UTC, datetime
from pathlib import Path
MATCH_FIELDS = (
"dataset_manifest_sha256",
"requested_images",
"training_images",
"model_sha256",
"initialization",
"initialization_sha256",
"seed",
"image_size",
"encoder_layers",
"batch_size",
"steps",
"data_order",
"objective",
"optimizer",
"initial_learning_rate",
"final_learning_rate",
"decoder_parameters",
"final_l1",
)
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as source:
for chunk in iter(lambda: source.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--run", action="append", required=True, type=Path)
parser.add_argument("--output", required=True, type=Path)
args = parser.parse_args()
if len(args.run) < 2:
raise SystemExit("at least two --run directories are required")
records: list[tuple[Path, dict[str, object], str, str]] = []
for directory in args.run:
training_path = directory / "training.json"
decoder_path = directory / "decoder.bin"
training = json.loads(training_path.read_text(encoding="utf-8-sig"))
decoder_hash = sha256(decoder_path)
if decoder_hash != training["decoder_sha256"]:
raise SystemExit(f"{decoder_path} disagrees with training.json")
records.append((directory, training, sha256(training_path), decoder_hash))
baseline = records[0][1]
for directory, training, _, _ in records[1:]:
differences = [field for field in MATCH_FIELDS if training[field] != baseline[field]]
if differences:
raise SystemExit(f"{directory} differs in deterministic fields: {differences}")
decoder_hashes = {record[3] for record in records}
if len(decoder_hashes) != 1:
raise SystemExit(f"decoder hashes differ: {sorted(decoder_hashes)}")
output = {
"schema_version": 1,
"created_utc": datetime.now(UTC).isoformat(),
"purpose": "short deterministic replay; not a quality or throughput result",
"configuration": {field: baseline[field] for field in MATCH_FIELDS},
"runs": [
{
"name": directory.name,
"training_record_sha256": training_hash,
"decoder_sha256": decoder_hash,
}
for directory, _, training_hash, decoder_hash in records
],
"all_decoder_bytes_identical": True,
"decoder_sha256": records[0][3],
}
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
print(
f"verified {len(records)} deterministic runs: "
f"decoder SHA-256 {records[0][3]}"
)
if __name__ == "__main__":
main()