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())