safffrron's picture
Upload code.py with huggingface_hub
0484d82 verified
Raw
History Blame Contribute Delete
7.03 kB
"""Week-1 Track-2 20% calibrated mixed-bit compression entry points.
The artifact stores exact GPTQ codes and scales for the W3/W4 body, W8 full
attention, 30,000 selected tied embedding/output rows, and a small deterministic
token-string predictor for omitted rows. Zlib wraps that tensor payload
losslessly for checkpoint storage. Restoration produces an ordinary BF16
Hugging Face checkpoint.
"""
from __future__ import annotations
import json
import importlib.util
import os
import sys
import sysconfig
from pathlib import Path
# This file name is required by the course interface, but ``code`` is also a
# Python standard-library module used by ``pdb`` during PyTorch import. When a
# user runs a wrapper from this directory, Python can resolve this file for both
# names. Publish the stdlib API before importing torch so that the recursive
# ``pdb -> code`` import remains valid.
if __name__ == "code":
_stdlib_code_path = Path(sysconfig.get_path("stdlib")) / "code.py"
_stdlib_code_spec = importlib.util.spec_from_file_location(
"_cs6013_stdlib_code", _stdlib_code_path
)
if _stdlib_code_spec is None or _stdlib_code_spec.loader is None:
raise ImportError(f"could not load Python stdlib code module: {_stdlib_code_path}")
_stdlib_code = importlib.util.module_from_spec(_stdlib_code_spec)
_stdlib_code_spec.loader.exec_module(_stdlib_code)
for _stdlib_name in (
"InteractiveInterpreter",
"InteractiveConsole",
"interact",
"compile_command",
):
globals()[_stdlib_name] = getattr(_stdlib_code, _stdlib_name)
import torch
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.artifact import (
dequantize_gptq_model,
pack_model_state,
read_trace_corpus,
restore_artifact,
save_artifact,
)
from eaimath.buckets import BY_NAME
from eaimath.embedding_predictor import fit_token_predictor
from eaimath.model import load_tokenizer
from eaimath.pack import state_dict_bytes
from eaimath.vocab import build_keep_set, token_frequencies
SUBMISSION_HF_REPO = "safffrron/25M2111-Week01-Track2-20-Submission01"
EXPECTED_BITS = {"mlp": 3, "linear_attn": 4, "full_attn": 8, "embed": 8}
def _validated_inputs() -> tuple[Path, Path, dict]:
source = Path(
os.environ.get(
"EAIMATH_B20_GPTQ_SOURCE", "checkpoints/r13_short_gptq_m3l4a8e8"
)
)
corpus = Path(os.environ.get("EAIMATH_VOCAB_CORPUS", "data/traces.jsonl"))
if not source.is_dir() or not corpus.is_file():
raise FileNotFoundError(
"Set EAIMATH_B20_GPTQ_SOURCE to the reproduced m3l4a8e8 GPTQ "
"checkpoint and EAIMATH_VOCAB_CORPUS to the verified trace JSONL."
)
config_path = source / "experiment_config.json"
if not config_path.is_file():
raise FileNotFoundError(f"GPTQ experiment config is missing: {config_path}")
config = json.loads(config_path.read_text())
if config.get("bits") != EXPECTED_BITS:
raise ValueError(f"expected m3l4a8e8, found bits={config.get('bits')}")
if set(config.get("gptq_components", [])) != {"mlp", "linear_attn"}:
raise ValueError("GPTQ source must calibrate both MLP and linear attention")
if config.get("activation_order") != "gar":
raise ValueError("GPTQ source must use the selected GAR activation order")
return source, corpus, config
def convert_from_hf_checkpoint(
model_name: str,
output_path: str,
sparsity: float = 0.5,
) -> None:
"""Pack the reproduced calibrated source into the physical 20% artifact.
Run ``training/reproduce_source.sh`` and
``compression/reproduce_gptq.sh`` first. ``sparsity`` is accepted for the
supplied course interface but is not used by this dense quantization method.
"""
_ = sparsity
source, corpus, source_config = _validated_inputs()
problems, completions, corpus_stats = read_trace_corpus([corpus])
tokenizer = load_tokenizer(str(source))
counts = token_frequencies(problems + completions, tokenizer)
priority = token_frequencies(problems, tokenizer)
keep = build_keep_set(counts, tokenizer, 30_000, priority_counts=priority)
loaded, model, replaced, exact_weights, capture_error = dequantize_gptq_model(
source
)
if capture_error != 0.0:
raise RuntimeError(f"GPTQ code capture error: {capture_error}")
payload, _ = pack_model_state(
model.state_dict(),
keep["keep_ids"],
group_size=128,
exact_entries=exact_weights,
recipe_bits=EXPECTED_BITS,
recipe_name="m3l4a8e8",
)
payload["source"] = {
"base_model": model_name,
"gptq_source": str(source),
"experiment_config": source_config,
"vocab_corpus": str(corpus),
"vocab_strategy": "problem-first",
"corpus_stats": corpus_stats,
"keep_set": {key: value for key, value in keep.items() if key != "keep_ids"},
"gptq_linears": replaced,
}
payload["report"]["source_gptq_linears"] = replaced
payload["report"]["gptq_code_capture_error"] = capture_error
payload["report"]["training_token_coverage"] = keep.get("token_coverage")
row_names = [
name
for name, entry in payload["state_dict"].items()
if entry["kind"] in {"quant_rows", "raw_rows"}
]
if len(row_names) != 1:
raise RuntimeError(f"expected one canonical tied embedding, found {row_names}")
predictor, predictor_report = fit_token_predictor(
model.state_dict()[row_names[0]].detach().cpu(),
tokenizer,
sample_size=65_536,
device=os.environ.get("EAIMATH_PREDICTOR_DEVICE", "cpu"),
)
payload["embedding_predictor"] = predictor
payload["report"]["embedding_predictor"] = predictor_report
payload["report"]["tensor_bytes"] += state_dict_bytes(
{"embedding_predictor": predictor["basis"]}
)
keep_path = Path(output_path).with_suffix(Path(output_path).suffix + ".keep_ids.json")
keep_path.parent.mkdir(parents=True, exist_ok=True)
keep_path.write_text(json.dumps(keep["keep_ids"]))
final = save_artifact(payload, Path(output_path), lossless_codec="zlib", zlib_level=6)
ceiling = int(BY_NAME["B"].high_gb * 1e9)
if int(final["disk_bytes"]) >= ceiling:
raise RuntimeError(
f"artifact is outside the 20% ceiling: {final['disk_bytes']:,} >= {ceiling:,}"
)
del model, loaded
if torch.cuda.is_available():
torch.cuda.empty_cache()
def convert_to_hf_checkpoint(
model_name: str,
checkpoint_path: str,
output_path: str,
) -> None:
"""Restore the self-contained artifact to a full BF16 HF checkpoint."""
report = restore_artifact(
model_name,
checkpoint_path,
output_path,
embedding_fill="token",
)
Path(output_path, "submission_report.json").write_text(json.dumps(report, indent=2))