File size: 1,887 Bytes
916755e de46a3c 916755e de46a3c 916755e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #!/usr/bin/env python3
"""Compare frozen/trainable transfer-forward artifacts."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
import numpy as np
def compare(left: np.ndarray, right: np.ndarray) -> dict[str, object]:
delta = np.abs(left.astype(np.float64) - right.astype(np.float64))
passed = np.isclose(left, right, atol=1e-5, rtol=1e-5)
return {
"status": "PASS" if bool(np.all(passed)) else "FAIL",
"shape": list(left.shape),
"max_abs": float(delta.max()),
"outside_tolerance": int((~passed).sum()),
}
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("reference_frozen", type=Path)
parser.add_argument("candidate_frozen", type=Path)
parser.add_argument("reference_trainable", type=Path)
parser.add_argument("candidate_trainable", type=Path)
parser.add_argument("output", type=Path)
args = parser.parse_args()
reports = {}
for name, left_path, right_path in (
("frozen_backbone", args.reference_frozen, args.candidate_frozen),
("trainable_backbone", args.reference_trainable, args.candidate_trainable),
):
with np.load(left_path) as left, np.load(right_path) as right:
reports[name] = compare(left["logits"], right["logits"])
report = {
"schema_version": 1,
"stages": reports,
"overall_status": "PASS"
if all(item["status"] == "PASS" for item in reports.values())
else "FAIL",
}
args.output.mkdir(parents=True, exist_ok=True)
(args.output / "transfer.json").write_text(
json.dumps(report, indent=2, sort_keys=True) + "\n"
)
print(json.dumps({"overall_status": report["overall_status"]}, indent=2))
return 0 if report["overall_status"] == "PASS" else 1
if __name__ == "__main__":
raise SystemExit(main())
|