File size: 3,350 Bytes
026a0a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
"""Week-2 40% R18 tail-Fisher block-adaptive conversion entry points."""

from __future__ import annotations

import importlib.util
import json
import os
import sys
import sysconfig
from pathlib import Path

if __name__ == "code":
    _stdlib_path = Path(sysconfig.get_path("stdlib")) / "code.py"
    _spec = importlib.util.spec_from_file_location("_cs6013_stdlib_code", _stdlib_path)
    if _spec is None or _spec.loader is None:
        raise ImportError(f"could not load stdlib code module: {_stdlib_path}")
    _stdlib = importlib.util.module_from_spec(_spec)
    _spec.loader.exec_module(_stdlib)
    for _name in ("InteractiveInterpreter", "InteractiveConsole", "interact", "compile_command"):
        globals()[_name] = getattr(_stdlib, _name)

LOCAL_SRC = Path(__file__).resolve().parent / "src"
if LOCAL_SRC.is_dir() and str(LOCAL_SRC) not in sys.path:
    sys.path.insert(0, str(LOCAL_SRC))

from eaimath.adaptive_artifact import (  # noqa: E402
    pack_block_adaptive_state,
    restore_block_adaptive_artifact,
    save_block_adaptive_artifact,
)
from eaimath.model import load_model  # noqa: E402

SUBMISSION_HF_REPO = "safffrron/25M2111-Week02-Track1-40-Submission01"
ARTIFACT_FILENAME = "week02_40_tail_fisher_block64.pt"


def _allocation_path(source: str) -> Path:
    configured = os.environ.get("EAIMATH_BLOCK64_REPORT")
    if configured:
        path = Path(configured)
    else:
        local = Path(source)
        if local.is_dir() and (local / "block_adaptive_report.json").is_file():
            path = local / "block_adaptive_report.json"
        else:
            from huggingface_hub import hf_hub_download
            path = Path(hf_hub_download(SUBMISSION_HF_REPO, "block_adaptive_report.json"))
    if not path.is_file():
        raise FileNotFoundError(f"block-adaptive allocation report not found: {path}")
    allocation = json.loads(path.read_text())
    if int(allocation.get("row_block", -1)) != 64:
        raise ValueError("the submitted allocation must use row block 64")
    return path


def _artifact_path(checkpoint_path: str) -> Path:
    supplied = Path(checkpoint_path).expanduser().resolve()
    artifact = supplied / ARTIFACT_FILENAME if supplied.is_dir() else supplied
    if artifact.is_file():
        return artifact
    from huggingface_hub import hf_hub_download
    return Path(hf_hub_download(SUBMISSION_HF_REPO, ARTIFACT_FILENAME))


def convert_from_hf_checkpoint(
    model_name: str,
    output_path: str,
    sparsity: float | None = None,
) -> None:
    """Pack the reproduced short source with the frozen R18 allocation."""
    _ = sparsity
    source = os.environ.get("EAIMATH_BLOCK64_SOURCE", model_name)
    allocation = json.loads(_allocation_path(source).read_text())
    model = load_model(source, dtype="bfloat16", device_map=None, multimodal=True)
    payload, _ = pack_block_adaptive_state(model.state_dict(), allocation)
    save_block_adaptive_artifact(payload, output_path)


def convert_to_hf_checkpoint(model_name: str, checkpoint_path: str, output_path: str) -> None:
    """Restore the self-contained R18 artifact to ordinary BF16 HF format."""
    artifact = _artifact_path(checkpoint_path)
    report = restore_block_adaptive_artifact(model_name, artifact, output_path)
    Path(output_path, "submission_report.json").write_text(json.dumps(report, indent=2) + "\n")