Instructions to use litert-community/d1-3B-LiteRT with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LiteRT
How to use litert-community/d1-3B-LiteRT with LiteRT:
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js
- Notebooks
- Google Colab
- Kaggle
Download conversion/d1_reference.py from litert-community/d1-3B-LiteRT: direct link, hf CLI and curl.
- Browser
- Download file 46.3 kB
-
https://huggingface.co/litert-community/d1-3B-LiteRT/resolve/main/conversion/d1_reference.py
- Command line
-
hf download hf://litert-community/d1-3B-LiteRT/conversion/d1_reference.py
-
curl -L -o d1_reference.py https://huggingface.co/litert-community/d1-3B-LiteRT/resolve/main/conversion/d1_reference.py
46.3 kB
| """The reference for the d1-3B LiteRT conversion: the provider's own code (LiquidAI/d1-3B at REV) on the CPU in float32. | |
| # no weights: the ids and read-out groups the reference will feed, checked against fixtures/rows.json | |
| $REF scripts/d1_reference.py --dry-run | |
| # the weights' safetensors header against the Hub's (evidence/) and the source's copy, and the 707 tensors against | |
| # a meta build of D1Model: results/reference_<tag>_header.json | |
| $REF scripts/d1_reference.py --check-header --source <snapshot> --tag real | |
| # the reference (a long CPU job: start it inside a measurement lock; at most 4 threads) | |
| $REF scripts/d1_reference.py \ | |
| --source <snapshot> --tag real | |
| # the per-question table: near ties, gold agreement by slice, the red arm, the length join, the other reference | |
| $REF scripts/d1_reference.py --summarize results/reference_real.json | |
| Model: `AutoModel.from_pretrained(<snapshot>, trust_remote_code=True, dtype=torch.float32)` = D1Model, on the CPU, with | |
| `output_loading_info` asserted clean; `engine = model.engine` (SystemOne with its defaults). Never bfloat16 or MPS: the | |
| provider's card for the sibling model says bfloat16 changes answers. | |
| Per record of fixtures/requests.json (the provider's parser; a question it rejects is left out of its request). The | |
| questions go to the engine as JSON and are parsed by the engine's own copy of prompt.py (transformers' module cache): | |
| its isinstance checks know only its own classes. | |
| row (every question) probs = engine.probabilities(state, [q]) one plain pass, positions 0..L-1: the oracle | |
| logz = engine._logz_ids([ids]) log-softmax at the answer slot; its pass is | |
| recorded as it runs: the raw logits (`_one_pass` output) and the language model's | |
| final-norm output at every position (a forward hook = what the row graphs return) | |
| tree (several questions) probs_tree = engine.probabilities(state, qs) the provider's path for such a request: one | |
| tree, trunk = state, branches = questions; its `_tree_logz` call is recorded as it | |
| runs (trunk, branches, log-probs) | |
| The recorders only read what the provider's code computes; nothing is recomputed in their place. | |
| Checks (all recorded; the run exits 1 if one fails): ids == rows.json ids (before the model loads); | |
| readout(logz) == probs bit for bit; logz == log_softmax(recorded logits) bit for bit; lm_head(hidden at the slot) | |
| within 1e-5 of the recorded logits; the tree's trunk and branches == rows.json's split; readout(tree logz) == probs_tree; | |
| tv4_000 again, bit for bit. Pictures (card_cats_001) wait for their image (`image_pending`). | |
| Outputs, never overwritten: results/reference_<tag>.json and results/reference_<tag>_hidden.npz (`<id>/<qid>` = the | |
| answer slot's hidden [2048]; `<id>/<qid>/full` = every position [L, 2048] for FULL_ROWS). `--only` / `--limit` runs | |
| get `_smoke` in the tag. | |
| """ | |
| from __future__ import annotations | |
| import argparse | |
| import hashlib | |
| import importlib | |
| import json | |
| import os | |
| import platform | |
| import resource | |
| import struct | |
| import sys | |
| import time | |
| from collections import Counter, defaultdict | |
| from pathlib import Path | |
| sys.path.insert(0, str(Path(__file__).resolve().parent)) | |
| from d1_common import (FIXTURES, HF_SMALL, K, REPO, REV, ROWS, encode, engine_settings, load_fixtures, # noqa: E402 | |
| load_tokenizer, provider, questions_of, render_row, sha256_file, split_texts) | |
| WEIGHTS_SHA256 = "50e03317847caf6df9a9aee27ed40f20554a86a21e60d1d47ba41a422b546c0c" | |
| WEIGHTS_BYTES = 6_247_065_504 | |
| NEAR_TIE = 0.02 | |
| RED_ARM_MIN = 0.02 | |
| MAX_THREADS = 4 # the Mac is shared with other lanes' measurements | |
| # every position of these rows goes into the hidden file: the card's text example, and the longest row of the | |
| # mid-length record (L1024 bucket) and of the longest record (L4096 bucket) | |
| FULL_ROWS = (("card_text_001", "refund"), ("own_mid_08k_001", "first_fault"), ("own_long_34k_001", "refunded_twice")) | |
| BUCKETS = (64, 128, 256, 512, 1024, 2048, 4096) # host/contract.json `buckets.candidates` | |
| HEADER = K / "evidence/hub_safetensors_header_da1fe36a.json" | |
| SOURCE_HEADER = K / "evidence/d1-3b_safetensors_header.json" # the header copy that came with the source files | |
| LOCK = Path(os.environ.get("D1_GPU_LOCK", str(K / "gpu.lock"))) | |
| D1B_DIRS = (K / "external/other_conversion/oracle", K / "external/other_conversion/ref") # another conversion | |
| # The control arms (fixtures/red_arms.json, `--make-red-arms`): red-arm requests of another conversion of d1-3B, | |
| # adopted on 2026-10-08 after all five of its arms were measured on this float32 path (logs/r6a_red_arms_real_json.log). | |
| # The fixture's own red_arm_000 (= its red_word_tv4_000, "correctly" -> "incorrectly") moves d1-3B by 0.0069 only: | |
| # it stays in requests.json as a record, not as a control. | |
| RED_ARMS = K / "fixtures/red_arms.json" | |
| D1B_RED_ARMS = K / "external/other_conversion/fixtures/red_arms.json" | |
| D1B_RED_ARMS_SHA256 = "54fb9ad6063464e1f30f4d7b45da5e782b82e73b1c8ba8854fb7c055c4353655" | |
| D1B_RECORDS = K / "external/other_conversion/fixtures/records.json" | |
| D1B_RECORDS_SHA256 = "2284bb22e8cdc02a4d1c4a787e34981d2cee4044b32c3b4452abcd61136ef4dd" | |
| ADOPTED_ARMS = ("red_not_qnli_00", "tv4_001_with_state_of_tv4_000", | |
| "semif_a3f18f3a63d45345942b_with_state_of_semif_0b43ea8e24e74d621f1b", | |
| "semif_0b43ea8e24e74d621f1b_with_state_of_semif_a3f18f3a63d45345942b") | |
| MEASURED_BEFORE_ADOPTION = "logs/r6a_red_arms_real_json.log" # read by --make-red-arms (max |dp| per request) | |
| def request_sha256(request: dict) -> str: | |
| """make_d1_fixtures.request_sha256 (the other conversion's formula): sha256 of the canonical JSON of the request.""" | |
| return hashlib.sha256(json.dumps(request, sort_keys=True, ensure_ascii=False, separators=(",", ":")).encode()).hexdigest() | |
| def plan(prompt, tok, settings, fixtures, rows_by_key): | |
| """Per record: the parsed questions, their row ids (asserted equal to rows.json) and the tree split.""" | |
| out = [] | |
| for r in fixtures["records"]: | |
| parsed = [(qid, q) for qid, q, err in questions_of(prompt, r) if q is not None] | |
| qdicts = r["request"]["questions"] | |
| rejected = [(qid, err) for qid, q, err in questions_of(prompt, r) if q is None] | |
| images = r["request"].get("images") or [] | |
| items = [] | |
| for qid, q in parsed: | |
| want = rows_by_key[(r["id"], qid)] | |
| if images: # the markup only; the processor expands <image> with the picture (round 5) | |
| items.append({"qid": qid, "q": q, "qd": qdicts[qid], "ids": None, "groups": want["readout_ids"], | |
| "image_pending": True}) | |
| continue | |
| text = render_row(prompt, tok, settings, r["request"]["state"], q) | |
| ids = encode(tok, text) | |
| assert ids == want["ids"], (r["id"], qid) | |
| groups = prompt.readout_ids(tok, q) | |
| assert groups == want["readout_ids"], (r["id"], qid) | |
| prefix, suffix = split_texts(prompt, tok, settings, r["request"]["state"], q) | |
| items.append({"qid": qid, "q": q, "qd": qdicts[qid], "ids": ids, "groups": groups, | |
| "trunk": encode(tok, prefix), "branch": encode(tok, suffix)}) | |
| out.append({"record": r, "items": items, "rejected": rejected, "images": images}) | |
| return out | |
| def make_red_arms() -> int: | |
| """fixtures/red_arms.json: the adopted arms of the other conversion in requests.json's record form, with their | |
| base record's id. Each base request here equals that file's (JSON value), and each arm differs from its base only | |
| where that arm says.""" | |
| out = RED_ARMS | |
| assert not out.exists(), f"refusing to overwrite {out}" | |
| assert sha256_file(D1B_RED_ARMS) == D1B_RED_ARMS_SHA256 and sha256_file(D1B_RECORDS) == D1B_RECORDS_SHA256 | |
| d1b_arms = json.loads(D1B_RED_ARMS.read_text()) | |
| d1b_records = {r["id"]: r for r in json.loads(D1B_RECORDS.read_text())["records"]} | |
| ours = {r["id"]: r for r in load_fixtures()["records"]} | |
| measured = {x.get("request") or x["arm"]: x for x in json.loads((K / MEASURED_BEFORE_ADOPTION).read_text())["arms"]} | |
| records = [] | |
| for arm in d1b_arms["arms"]: | |
| if arm["kind"] == "state_swap": | |
| reqs = [(name, req, name.split("_with_state_of_")[0], next(iter(req["questions"]))) for name, req in arm["requests"].items()] | |
| else: | |
| reqs = [(arm["id"], arm["request"], arm["base"], arm["question"])] | |
| for name, req, base_id, qid in reqs: | |
| if name not in ADOPTED_ARMS: | |
| continue | |
| base = ours[base_id]["request"] | |
| assert base == d1b_records[base_id]["request"], base_id | |
| assert list(req["questions"]) == [qid] and list(base["questions"]) == [qid], name | |
| if arm["kind"] == "state_swap": # the base's question over the other record's state | |
| other = arm["pair"][1] if base_id == arm["pair"][0] else arm["pair"][0] | |
| assert req["questions"] == base["questions"] and req["state"] == ours[other]["request"]["state"], name | |
| else: # one field of the base's question | |
| field = arm["change"]["field"].split(".") | |
| assert field[:2] == ["questions", qid] and req["state"] == base["state"], name | |
| assert {k: v for k, v in req["questions"][qid].items() if k != field[2]} == \ | |
| {k: v for k, v in base["questions"][qid].items() if k != field[2]}, name | |
| assert base["questions"][qid][field[2]] == arm["change"]["from"] and req["questions"][qid][field[2]] == arm["change"]["to"] | |
| records.append({ | |
| "id": name, "source": "red_arm", "base_id": base_id, "question": qid, "request": req, "gold": {qid: None}, | |
| "note": arm.get("note") or arm.get("source") or "", | |
| "provenance": {"file": "another conversion's control file (red_arms.json)", "sha256": D1B_RED_ARMS_SHA256, | |
| "arm": arm["id"], "kind": arm["kind"], "request_name": name, | |
| "change": arm.get("change"), "base_gold": arm.get("base_gold"), | |
| "base_from": {"file": "another conversion's fixture file (records.json)", | |
| "sha256": D1B_RECORDS_SHA256, "record": base_id}, | |
| "request_sha256": request_sha256(req), "base_request_sha256": request_sha256(base), | |
| "measured_before_adoption": {"max_abs_dp": measured[name]["max_abs_dp"], | |
| "argmax_base": measured[name]["argmax_base"], | |
| "argmax_arm": measured[name]["argmax_arm"]}}}) | |
| assert [r["id"] for r in records] == list(ADOPTED_ARMS), [r["id"] for r in records] | |
| doc = {"version": 1, "created_by": "scripts/d1_reference.py --make-red-arms (round 6a)", | |
| "what": "the control arms the reference and the gates run beside the fixture: another fixture's red-arm requests that " | |
| "move d1-3B's float32 answer by far more than 0.02 against their base record (`base_id`, in requests.json)", | |
| "rule": d1b_arms["rule"], | |
| "decision": "2026-10-08, after the five arms of that file were measured on the provider's float32 " | |
| "CPU path: these four requests. red_not_paws_00 and tv4_000_with_state_of_tv4_001 sit near the " | |
| "line; red_word_tv4_000 (= requests.json red_arm_000, 'correctly' -> 'incorrectly') moves d1-3B " | |
| "by 0.0069 only = invalid as a red arm on this model, kept in requests.json as a record", | |
| "measured_before_adoption": {"evidence": f"W/{MEASURED_BEFORE_ADOPTION}", | |
| "max_abs_dp": {k: v["max_abs_dp"] for k, v in measured.items()}}, | |
| "request_sha256": "sha256 of json.dumps(request, sort_keys=True, ensure_ascii=False, separators=(',', ':')) in UTF-8", | |
| "record_format": "requests.json's {id, source, request, gold, note, provenance} plus base_id and question " | |
| "(the question compared against the base record's same question); gold is null (an arm " | |
| "has no intended answer: the gate reads |dp| against the base)", | |
| "records": records} | |
| out.write_text(json.dumps(doc, ensure_ascii=False, indent=1) + "\n") | |
| print(json.dumps({"out": str(out.relative_to(K)), "records": [r["id"] for r in records], "sha256": sha256_file(out)})) | |
| return 0 | |
| def plan_arms(prompt, tok, settings): | |
| """The control arms' rows (one question each, the plain-row path).""" | |
| if not RED_ARMS.exists(): | |
| return [], None | |
| doc = json.loads(RED_ARMS.read_text()) | |
| items = [] | |
| for r in doc["records"]: | |
| qid = r["question"] | |
| q = prompt.as_question(r["request"]["questions"][qid]) | |
| ids = encode(tok, render_row(prompt, tok, settings, r["request"]["state"], q)) | |
| items.append({"record": r, "qid": qid, "qd": r["request"]["questions"][qid], "ids": ids, | |
| "groups": prompt.readout_ids(tok, q)}) | |
| return items, sha256_file(RED_ARMS) | |
| def dry_run(planned, out_path: Path | None): | |
| lines, n = [], 0 | |
| for p in planned: | |
| r = p["record"] | |
| for it in p["items"]: | |
| n += 1 | |
| ids = it["ids"] | |
| lines.append({"id": r["id"], "qid": it["qid"], "type": it["q"].type, | |
| "calls": ("tree+row" if len(p["items"]) > 1 else "row"), | |
| "row_len": None if ids is None else len(ids), | |
| "ids_head": None if ids is None else ids[:6], "ids_tail": None if ids is None else ids[-4:], | |
| "readout_ids": it["groups"], "image_pending": it.get("image_pending", False)}) | |
| for qid, err in p["rejected"]: | |
| lines.append({"id": r["id"], "qid": qid, "rejected": err}) | |
| for x in lines[:6] + [x for x in lines if x.get("rejected") or x.get("image_pending")]: | |
| print(json.dumps(x, ensure_ascii=False)) | |
| summary = {"records": len(planned), "questions": n, | |
| "tree_requests": sum(1 for p in planned if len(p["items"]) > 1), | |
| "rejected": [f"{p['record']['id']}/{q}" for p in planned for q, _ in p["rejected"]], | |
| "image_pending": [f"{p['record']['id']}/{it['qid']}" for p in planned for it in p["items"] if it.get("image_pending")], | |
| "ids_equal_rows_json": True} | |
| print(json.dumps(summary)) | |
| if out_path is not None: | |
| out_path.write_text(json.dumps({"summary": summary, "rows": lines}, ensure_ascii=False) + "\n") | |
| return 0 | |
| def snapshot_dir(source: str | None) -> Path: | |
| if source: | |
| p = Path(source).expanduser() | |
| return p if p.is_absolute() else (K / p if (K / p).exists() else Path.cwd() / p) | |
| from huggingface_hub import snapshot_download | |
| return Path(snapshot_download(REPO, revision=REV, local_files_only=True)) | |
| def read_header(path: Path) -> tuple[int, dict]: | |
| with open(path, "rb") as f: | |
| n = struct.unpack("<Q", f.read(8))[0] | |
| assert 0 < n < 50_000_000, n | |
| return n, json.loads(f.read(n)) | |
| def window_now() -> str | None: | |
| """The Mac measurement window (quiet_wait.py's rule): the lock names `timing` and its pid is alive.""" | |
| try: | |
| content = LOCK.read_text(encoding="utf-8", errors="replace").strip() | |
| age = time.time() - LOCK.stat().st_mtime | |
| except OSError: | |
| return None | |
| if not content or "timing" not in content.lower(): | |
| return None | |
| words = content.split() | |
| if "pid" in words and words.index("pid") + 1 < len(words) and words[words.index("pid") + 1].isdigit(): | |
| try: | |
| os.kill(int(words[words.index("pid") + 1]), 0) | |
| except ProcessLookupError: | |
| return None | |
| except PermissionError: | |
| pass | |
| elif age > 3 * 3600: | |
| return None | |
| return content | |
| def check_header(a) -> int: | |
| """Criterion 2: the weights' header == the Hub's (fetched in round 1 by HTTP range) == the source's copy, the data | |
| regions tile the file, and a meta build of D1Model from the snapshot's code has the header's 707 tensors.""" | |
| import torch | |
| import transformers | |
| from transformers import AutoConfig | |
| from transformers.dynamic_module_utils import get_class_from_dynamic_module | |
| snap = snapshot_dir(a.source) | |
| w = snap / "model.safetensors" | |
| out = K / f"results/reference_{a.tag}_header.json" | |
| assert not out.exists(), f"refusing to overwrite {out}" | |
| n, local = read_header(w) | |
| ev = json.loads(HEADER.read_text()) | |
| source_copy = json.loads(SOURCE_HEADER.read_text()) | |
| tensors = {k: v for k, v in local.items() if k != "__metadata__"} | |
| ends = sorted((v["data_offsets"][0], v["data_offsets"][1]) for v in tensors.values()) | |
| tiled = all(b[0] == a_[1] for a_, b in zip(ends, ends[1:])) and ends[0][0] == 0 | |
| doc = {"weights": str(w), "resolved": str(w.resolve()), "is_symlink": w.is_symlink(), "bytes": w.stat().st_size, | |
| "header_bytes": n, "evidence": str(HEADER.relative_to(K)), "evidence_header_bytes": ev["header_bytes"], | |
| "equal_to_evidence": local == ev["header"] and n == ev["header_bytes"], | |
| "metadata": local.get("__metadata__"), | |
| "source_copy": str(SOURCE_HEADER), "source_copy_header_equal": tensors == {k: v for k, v in source_copy.items() if k != "__metadata__"}, | |
| "tensors": len(tensors), "dtypes": dict(Counter(v["dtype"] for v in tensors.values())), | |
| "data_regions_tile": tiled, "data_end_plus_header_eq_file": 8 + n + ends[-1][1] == w.stat().st_size} | |
| os.environ.setdefault("HF_MODULES_CACHE", str(K / "cache/hf_modules")) | |
| cls = get_class_from_dynamic_module("modeling_d1.D1Model", str(snap)) | |
| config = AutoConfig.from_pretrained(str(snap)) | |
| with torch.device("meta"): | |
| model = cls(config) | |
| model.tie_weights() | |
| sd = model.state_dict() | |
| names = {k: list(v.shape) for k, v in sd.items()} | |
| # transformers 5.x stores Siglip2VisionModel without its `vision_model.` level and renames on load (round 1) | |
| renamed = {k.replace("model.vision_tower.vision_model.", "model.vision_tower.", 1): v for k, v in tensors.items()} | |
| doc["meta_build"] = { | |
| "class": f"{cls.__module__}.{cls.__qualname__}", "transformers": transformers.__version__, "torch": torch.__version__, | |
| "header_keys_renamed": sum(k != r for k, r in zip(tensors, renamed)), | |
| "header_tensors": len(renamed), "model_tensors": len(names), | |
| "matched": sum(1 for k in renamed if k in names and names[k] == renamed[k]["shape"]), | |
| "missing_in_model": sorted(k for k in renamed if k not in names), | |
| "not_in_header": sorted(k for k in names if k not in renamed), | |
| "shape_differences": sorted(k for k in renamed if k in names and names[k] != renamed[k]["shape"]), | |
| "lm_head_tied": bool(model.lm_head.weight is model.model.language_model.embed_tokens.weight)} | |
| m = doc["meta_build"] | |
| doc["all_ok"] = bool(doc["equal_to_evidence"] and doc["source_copy_header_equal"] and tiled and doc["data_end_plus_header_eq_file"] | |
| and m["matched"] == len(renamed) == 707 and not m["missing_in_model"] | |
| and m["not_in_header"] == ["lm_head.weight"] and m["lm_head_tied"]) | |
| out.write_text(json.dumps(doc, indent=1) + "\n") | |
| print(json.dumps({k: v for k, v in doc.items() if k != "meta_build"} | {"matched": m["matched"], "not_in_header": m["not_in_header"]})) | |
| return 0 if doc["all_ok"] else 1 | |
| def run(planned, arms, a): | |
| import numpy as np | |
| import torch | |
| import transformers | |
| from transformers import AutoModel | |
| assert 1 <= a.threads <= MAX_THREADS, a.threads | |
| torch.set_num_threads(a.threads) | |
| try: | |
| torch.set_num_interop_threads(1) | |
| except RuntimeError: | |
| pass | |
| torch.manual_seed(0) | |
| subset = bool(a.limit or a.only) | |
| tag = a.tag + ("_smoke" if subset else "") | |
| out_dir = Path(a.out_dir) if a.out_dir else K / "results" | |
| out_json, out_npz = out_dir / f"reference_{tag}.json", out_dir / f"reference_{tag}_hidden.npz" | |
| for p in (out_json, out_npz): | |
| assert not p.exists(), f"refusing to overwrite {p}" | |
| t_start = time.time() | |
| windows: list = [] | |
| def note_window(where: str, always: bool = False) -> None: | |
| """The start, the end and every change of the measurement window (checked after each record).""" | |
| w = window_now() | |
| if always or not windows or w != windows[-1]["lock"]: | |
| windows.append({"at": time.strftime("%H:%M:%S"), "where": where, "lock": w}) | |
| note_window("start", always=True) | |
| snap = snapshot_dir(a.source) | |
| w = snap / "model.safetensors" | |
| assert w.stat().st_size == WEIGHTS_BYTES, w.stat().st_size | |
| t = time.time() | |
| assert sha256_file(w) == WEIGHTS_SHA256, "model.safetensors sha256 differs from the Hub's LFS record" | |
| sha_s = round(time.time() - t, 1) | |
| n_hdr, local_header = read_header(w) | |
| assert local_header == json.loads(HEADER.read_text())["header"], "header differs from the Hub's" | |
| for name in ("config.json", "tokenizer.json", "prompt.py", "runner.py", "hybrid.py", "lfm2_vl.py", "modeling_d1.py", "api.py"): | |
| assert (snap / name).read_bytes() == (HF_SMALL / name).read_bytes(), name | |
| t = time.time() | |
| model, info = AutoModel.from_pretrained(str(snap), trust_remote_code=True, dtype=torch.float32, output_loading_info=True) | |
| load_s = round(time.time() - t, 1) | |
| assert not any(info.get(k) for k in ("missing_keys", "unexpected_keys", "mismatched_keys", "error_msgs")), info | |
| model.eval() | |
| dtypes = Counter(str(p.dtype) for p in model.parameters()) | |
| devices = Counter(p.device.type for p in model.parameters()) | |
| assert set(dtypes) == {"torch.float32"} and set(devices) == {"cpu"}, (dtypes, devices) | |
| engine = model.engine | |
| assert engine.device.type == "cpu" and engine.calibration is None | |
| lm = model.model.language_model | |
| # the engine's own prompt module (transformers' copy of prompt.py): its Question classes are the ones its | |
| # isinstance checks know, so questions go in as JSON and are parsed there | |
| eprompt = importlib.import_module(type(engine).__module__.rsplit(".", 1)[0] + ".prompt") | |
| # recorders: they keep what the provider's calls compute, nothing else | |
| cap: dict = {} | |
| plain_pass = engine._one_pass | |
| def recording_pass(*args, **kw): | |
| out = plain_pass(*args, **kw) | |
| cap["logits"] = out.logits | |
| return out | |
| engine._one_pass = recording_pass | |
| lm.register_forward_hook(lambda _m, _i, out: cap.__setitem__("hidden", out.last_hidden_state)) | |
| tree_logz_fn, trees = engine._tree_logz, [] | |
| def recording_tree(trunk, rows, **vision): | |
| z = tree_logz_fn(trunk, rows, **vision) | |
| trees.append((list(trunk), [list(r) for r in rows], z)) | |
| return z | |
| engine._tree_logz = recording_tree | |
| def row_pass(state, qd, ids, groups, key, full_hidden=False): | |
| """One question's plain row: probabilities() and _logz_ids() with the pass recorded, and the checks.""" | |
| q = eprompt.as_question(qd) | |
| if eprompt.readout_ids(engine.tokenizer, q) != groups: | |
| fails["readout_ids_vs_rows_json"].append(key) | |
| t = time.time() | |
| probs = engine.probabilities(state, [qd])[0] | |
| sec_api = time.time() - t | |
| cap.clear() | |
| t = time.time() | |
| logz = engine._logz_ids([ids])[0] | |
| sec_logz = time.time() - t | |
| logits = cap["logits"][0, -1].float() | |
| hidden = cap["hidden"][0] | |
| if hidden.shape != (len(ids), 2048) or not bool(torch.isfinite(hidden).all()): | |
| fails["hidden_shape_or_finite"].append(key) | |
| if not torch.equal(logz, logits - torch.logsumexp(logits, dim=-1)): | |
| fails["logz_vs_recorded_logits"].append(key) | |
| if eprompt.readout(engine.tokenizer, q, logz) != probs: | |
| fails["readout_logz_vs_probabilities"].append(key) | |
| d_head = float((model.lm_head(hidden[-1]).float() - logits).abs().max()) | |
| worst["head_vs_logits"] = max(worst["head_vs_logits"], d_head) | |
| if d_head > 1e-5: | |
| fails["head_vs_logits_1e-5"].append(key) | |
| npz[key] = hidden[-1].numpy().astype(np.float32).copy() | |
| if full_hidden: | |
| npz[key + "/full"] = hidden.numpy().astype(np.float32).copy() | |
| order = sorted(range(len(probs)), key=lambda i: -probs[i]) | |
| keys = (list(q.criteria) if q.type == "choice" else ["true", "false"] if q.type == "noul" | |
| else [str(i) for i in range(len(q.criteria))]) | |
| return q, { | |
| "type": q.type, "keys": keys, "row_len": len(ids), "answer_slot": len(ids) - 1, "ids": ids, | |
| "readout_ids": groups, | |
| "logit": [[float(logits[i]) for i in g] for g in groups], | |
| "logz": [[float(logz[i]) for i in g] for g in groups], | |
| "lse": float(torch.logsumexp(logits, dim=-1)), | |
| "score": [max(float(logz[i]) for i in g) for g in groups], | |
| "probs": probs, "argmax": order[0], "argmax_key": keys[order[0]], | |
| "top2_gap": probs[order[0]] - probs[order[1]], "head_vs_logits_max_abs": d_head, | |
| "seconds": {"probabilities": round(sec_api, 4), "logz_ids": round(sec_logz, 4)}} | |
| if a.only: | |
| wanted = set(a.only.split(",")) | |
| records = [p for p in planned if p["record"]["id"] in wanted] | |
| assert {p["record"]["id"] for p in records} == wanted, wanted - {p["record"]["id"] for p in records} | |
| else: | |
| records = planned[: a.limit] if a.limit else planned | |
| fails: dict = defaultdict(list) | |
| worst = defaultdict(float) | |
| q_out, r_out, npz = [], [], {} | |
| full = set(FULL_ROWS) | |
| t_loop = time.time() | |
| with torch.inference_mode(): | |
| for n, p in enumerate(records): | |
| r = p["record"] | |
| items = [it for it in p["items"] if not it.get("image_pending")] | |
| rec = {"id": r["id"], "source": r["source"], "request_sha256": request_sha256(r["request"]), | |
| "path": None if not items else "tree" if len(items) > 1 else "row", | |
| "questions": [it["qid"] for it in items], | |
| "image_pending": [it["qid"] for it in p["items"] if it.get("image_pending")], | |
| "rejected": [q for q, _ in p["rejected"]]} | |
| prov = r.get("provenance", {}).get("request_sha256") | |
| if prov is not None and prov != rec["request_sha256"]: | |
| fails["request_sha256_vs_provenance"].append(r["id"]) | |
| r_out.append(rec) | |
| if not items: | |
| continue | |
| state = r["request"]["state"] | |
| probs_tree = logz_tree = None | |
| if len(items) > 1: | |
| trees.clear() | |
| t = time.time() | |
| probs_tree = engine.probabilities(state, [it["qd"] for it in items]) | |
| rec["seconds_tree"] = round(time.time() - t, 4) | |
| if len(trees) != 1 or trees[0][0] != items[0]["trunk"] or trees[0][1] != [it["branch"] for it in items]: | |
| fails["tree_split_vs_rows_json"].append(r["id"]) | |
| logz_tree = trees[0][2] | |
| for k, it in enumerate(items): | |
| key = f"{r['id']}/{it['qid']}" | |
| q, row = row_pass(state, it["qd"], it["ids"], it["groups"], key, (r["id"], it["qid"]) in full) | |
| if probs_tree is not None and eprompt.readout(engine.tokenizer, q, logz_tree[k]) != probs_tree[k]: | |
| fails["readout_tree_logz_vs_probabilities"].append(key) | |
| gold = r["gold"].get(it["qid"]) | |
| q_out.append({ | |
| "id": r["id"], "source": r["source"], "qid": it["qid"], "path": rec["path"], **row, | |
| "probs_tree": None if probs_tree is None else probs_tree[k], | |
| "logz_tree": None if logz_tree is None else [[float(logz_tree[k][i]) for i in g] for g in it["groups"]], | |
| "near_tie": row["top2_gap"] <= NEAR_TIE, | |
| "gold_key": gold, "gold_match": None if gold is None else gold == row["argmax_key"], | |
| }) | |
| note_window(r["id"]) | |
| if n % 25 == 0 or r["source"] in ("own", "red_arm", "card"): | |
| print(json.dumps({"n": n, "id": r["id"], "path": rec["path"], "rows": [x["row_len"] for x in q_out[-len(items):]], | |
| "s": round(sum(x["seconds"]["probabilities"] + x["seconds"]["logz_ids"] for x in q_out[-len(items):]) | |
| + rec.get("seconds_tree", 0), 2), | |
| "elapsed": round(time.time() - t_loop)}), flush=True) | |
| base = next((p for p in records if p["record"]["id"] == "tv4_000"), None) | |
| rerun = None | |
| if base is not None: | |
| again = engine.probabilities(base["record"]["request"]["state"], [base["items"][0]["qd"]])[0] | |
| first = next(x["probs"] for x in q_out if x["id"] == "tv4_000") | |
| rerun = {"record": "tv4_000", "bit_equal": again == first} | |
| if not rerun["bit_equal"]: | |
| fails["rerun_tv4_000"].append("tv4_000") | |
| # the control arms (fixtures/red_arms.json): the plain row of each, against its base record's row | |
| arm_items, arms_sha = arms | |
| by_key = {(x["id"], x["qid"]): x for x in q_out} | |
| arm_out = [] | |
| for it in arm_items: | |
| r = it["record"] | |
| base = by_key.get((r["base_id"], it["qid"])) | |
| if base is None: # a subset run without the arm's base record | |
| continue | |
| key = f"{r['id']}/{it['qid']}" | |
| state = r["request"]["state"] | |
| if r["provenance"]["request_sha256"] != request_sha256(r["request"]): | |
| fails["request_sha256_vs_provenance"].append(r["id"]) | |
| if encode(engine.tokenizer, engine.render(state, eprompt.as_question(it["qd"]))) != it["ids"]: | |
| fails["arm_ids_vs_engine_render"].append(key) | |
| _, row = row_pass(state, it["qd"], it["ids"], it["groups"], key) | |
| pb, pa = dict(zip(base["keys"], base["probs"])), dict(zip(row["keys"], row["probs"])) | |
| if set(pb) != set(pa): | |
| fails["arm_keys_vs_base"].append(key) | |
| continue | |
| dp = max(abs(pa[k] - pb[k]) for k in pa) | |
| arm_out.append({"id": r["id"], "source": r["source"], "qid": it["qid"], "path": "row", | |
| "arm": r["provenance"]["arm"], "kind": r["provenance"]["kind"], "base_id": r["base_id"], | |
| "request_sha256": request_sha256(r["request"]), **row, | |
| "probs_base": base["probs"], "keys_base": base["keys"], "argmax_base": base["argmax_key"], | |
| "max_abs_dp": dp, "argmax_changed": row["argmax_key"] != base["argmax_key"], | |
| "red": dp > RED_ARM_MIN}) | |
| note_window(r["id"]) | |
| print(json.dumps({"arm": r["id"], "base": r["base_id"], "max_abs_dp": round(dp, 6), | |
| "argmax": [base["argmax_key"], row["argmax_key"]]}), flush=True) | |
| note_window("end", always=True) | |
| loop_s = round(time.time() - t_loop, 1) | |
| ru = resource.getrusage(resource.RUSAGE_SELF) | |
| np.savez(out_npz, **npz) | |
| checks = {name: {"ok": not fails.get(name), "failed": fails.get(name, [])} for name in ( | |
| "request_sha256_vs_provenance", "tree_split_vs_rows_json", "readout_ids_vs_rows_json", "hidden_shape_or_finite", | |
| "logz_vs_recorded_logits", "readout_logz_vs_probabilities", "head_vs_logits_1e-5", | |
| "readout_tree_logz_vs_probabilities", "rerun_tv4_000", "arm_ids_vs_engine_render", "arm_keys_vs_base")} | |
| wall = round(time.time() - t_start, 1) | |
| doc = {"repo": REPO, "revision": REV, "weights_sha256": WEIGHTS_SHA256, "snapshot": str(snap), | |
| "path": "AutoModel.from_pretrained(trust_remote_code=True, dtype=float32) on the CPU; model.engine defaults", | |
| "env": {"python": platform.python_version(), "torch": torch.__version__, "transformers": transformers.__version__, | |
| "threads": torch.get_num_threads(), "interop_threads": torch.get_num_interop_threads(), | |
| "thread_env": {k: os.environ.get(k) for k in ("OMP_NUM_THREADS", "VECLIB_MAXIMUM_THREADS")}, | |
| "machine": platform.machine(), "param_dtypes": dict(dtypes), "param_devices": dict(devices), | |
| "sha256_seconds": sha_s, "load_seconds": load_s, "loop_seconds": loop_s, "wall_seconds": wall, | |
| "cpu_seconds": round(ru.ru_utime + ru.ru_stime, 1), | |
| "mean_cores": round((ru.ru_utime + ru.ru_stime) / wall, 2), "max_rss_bytes": ru.ru_maxrss, | |
| "started": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t_start)), | |
| "ended": time.strftime("%Y-%m-%d %H:%M:%S"), "measurement_window": windows}, | |
| "fixtures_sha256": sha256_file(FIXTURES), "rows_sha256": sha256_file(ROWS), "header_bytes": n_hdr, | |
| "full_rows": [f"{i}/{q}" for i, q in FULL_ROWS], "worst": dict(worst), | |
| "checks": checks, "all_ok": all(c["ok"] for c in checks.values()), | |
| "counts": {"records": len(r_out), "questions": len(q_out), | |
| "image_pending": [f"{x['id']}/{q}" for x in r_out for q in x["image_pending"]], | |
| "rejected": [f"{x['id']}/{q}" for x in r_out for q in x["rejected"]], | |
| "tree_requests": sum(1 for x in r_out if x["path"] == "tree"), | |
| "tree_questions": sum(len(x["questions"]) for x in r_out if x["path"] == "tree")}, | |
| "rerun": rerun, "requests": r_out, "questions": q_out, | |
| "red_arms": None if not arm_items else { | |
| "file": "fixtures/red_arms.json", "sha256": arms_sha, "threshold": RED_ARM_MIN, | |
| "rule": "red = some option's probability moves by more than the threshold against the base record's row", | |
| "arms": len(arm_out), "all_red": bool(arm_out) and all(x["red"] for x in arm_out), "records": arm_out}} | |
| out_json.write_text(json.dumps(doc, ensure_ascii=False) + "\n") | |
| print(json.dumps({"questions": len(q_out), "records": len(r_out), "out": str(out_json), "all_ok": doc["all_ok"], | |
| "failed": {k: v["failed"][:5] for k, v in checks.items() if not v["ok"]}, "rerun": rerun, | |
| "wall_s": wall, "mean_cores": doc["env"]["mean_cores"], | |
| "red_arms": None if not arm_out else [round(x["max_abs_dp"], 6) for x in arm_out]})) | |
| return 0 if doc["all_ok"] else 1 | |
| def bucket_of(n: int) -> int | None: | |
| return next((b for b in BUCKETS if n <= b), None) | |
| def rate(rows: list) -> dict: | |
| gold = [x for x in rows if x["gold_match"] is not None] | |
| return {"questions": len(rows), "near_tie": sum(x["near_tie"] for x in rows), "gold_n": len(gold), | |
| "gold_match": sum(x["gold_match"] for x in gold), | |
| "gold_rate": round(sum(x["gold_match"] for x in gold) / len(gold), 4) if gold else None} | |
| def d1b_compare(mine: dict) -> dict: | |
| """The other conversion's float32 reference (oracle/records_oracle.json: the same provider code, its own venv and | |
| threads) against ours. Its records carry no request_sha256: their ids are mapped through its fixture file (named and hashed in its | |
| header) to request_sha256, and so to our records. Per common question: row ids, the row probabilities and the | |
| read-out log-probabilities; for tree requests also the API path (theirs `api.probs`, ours `probs_tree`).""" | |
| path = D1B_DIRS[0] / "records_oracle.json" | |
| doc = {"looked_in": [str(d) for d in D1B_DIRS], "checked_at": time.strftime("%Y-%m-%d %H:%M:%S")} | |
| if not path.exists(): | |
| return doc | {"status": "not arrived"} | |
| other = json.loads(path.read_text()) | |
| fx = Path(other["fixtures"]["path"]) | |
| fx_ok = fx.exists() and sha256_file(fx) == other["fixtures"]["sha256"] | |
| sha_of = {r["id"]: request_sha256(r["request"]) for r in json.loads(fx.read_text())["records"]} if fx_ok else {} | |
| # the same id when both fixtures have it with the same request; else the request alone (their `long_34k` is our | |
| # `own_long_34k_001`). Kev's fixture holds five pairs of records with one request (tv4x_composition_holdout_00 and | |
| # _02, ...): matching by the request alone would hide one of each pair. | |
| ours_sha = {r["id"]: r["request_sha256"] for r in mine["requests"]} | |
| ours_by_sha = {r["request_sha256"]: r["id"] for r in mine["requests"]} | |
| mine_q = {(x["id"], x["qid"]): x for x in mine["questions"]} | |
| rows, unmatched = [], [] | |
| for rec in other["records"]: | |
| sha_r = sha_of.get(rec["id"]) | |
| oid = rec["id"] if sha_r is not None and ours_sha.get(rec["id"]) == sha_r else ours_by_sha.get(sha_r) | |
| if oid is None: | |
| unmatched.append(rec["id"]) | |
| continue | |
| api = rec.get("api") or {} | |
| for k, q in enumerate(rec["questions"]): | |
| x = mine_q.get((oid, q["name"])) | |
| if x is None: | |
| unmatched.append(f"{rec['id']}/{q['name']}") | |
| continue | |
| zl = {str(i): z for g, zg in zip(x["readout_ids"], x["logz"]) for i, z in zip(g, zg)} | |
| dz = max(abs(zl[i] - z) for i, z in q["group_logz"].items()) if set(zl) == set(q["group_logz"]) else None | |
| dp_api = None | |
| if api.get("path") == "tree" and x["probs_tree"] is not None and len(api.get("probs") or []) > k: | |
| dp_api = max(abs(a_ - b) for a_, b in zip(x["probs_tree"], api["probs"][k])) | |
| rows.append({"d1b_id": rec["id"], "id": oid, "qid": q["name"], "ids_equal": q["row_ids"] == x["ids"], | |
| "max_abs_dp_row": max(abs(a_ - b) for a_, b in zip(x["probs"], q["probs"])), | |
| "max_abs_dlogz_row": dz, "probs_bit_equal": x["probs"] == q["probs"], | |
| "argmax_equal": x["argmax"] == max(range(len(q["probs"])), key=q["probs"].__getitem__), | |
| "max_abs_dp_tree": dp_api}) | |
| dz_all = [r["max_abs_dlogz_row"] for r in rows if r["max_abs_dlogz_row"] is not None] | |
| tree = [r["max_abs_dp_tree"] for r in rows if r["max_abs_dp_tree"] is not None] | |
| sha = sha256_file(path) | |
| summ_path = path.parents[1] / "results/oracle_summary.json" # their summary of this file (tied by its sha256) | |
| summ = json.loads(summ_path.read_text()) if summ_path.exists() else {} | |
| summ = summ if summ.get("oracle_sha256") == sha else {} | |
| return doc | { | |
| "status": "compared" if rows else "arrived, no common question", | |
| "file": str(path), "sha256": sha, "mtime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(path.stat().st_mtime)), | |
| "their_fixtures": other["fixtures"], "their_fixtures_hash_ok": fx_ok, "their_versions": other.get("versions"), | |
| "their_summary": str(summ_path) if summ else None, "their_threads": summ.get("threads"), | |
| "their_near_ties": summ.get("near_ties"), "their_tree_vs_row_max_abs_dp": summ.get("tree_vs_row_max_abs_dp"), | |
| "their_records": len(other["records"]), | |
| "common_questions": len(rows), "common_pairs_unique": len({(r["id"], r["qid"]) for r in rows}), | |
| "matched_by_request_only": sorted({f"{r['d1b_id']} -> {r['id']}" for r in rows if r["d1b_id"] != r["id"]}), | |
| "ours_only": [f"{x['id']}/{x['qid']}" for x in mine["questions"] | |
| if (x["id"], x["qid"]) not in {(r["id"], r["qid"]) for r in rows}], | |
| "unmatched": unmatched, | |
| "ids_equal": sum(r["ids_equal"] for r in rows), "argmax_equal": sum(r["argmax_equal"] for r in rows), | |
| "probs_bit_equal": sum(r["probs_bit_equal"] for r in rows), | |
| "max_abs_dp_row": max((r["max_abs_dp_row"] for r in rows), default=None), | |
| "mean_abs_dp_row": sum(r["max_abs_dp_row"] for r in rows) / len(rows) if rows else None, | |
| "max_abs_dlogz_row": max(dz_all, default=None), "logz_compared": len(dz_all), | |
| "tree_questions": len(tree), "max_abs_dp_tree": max(tree, default=None), | |
| "rows": rows} | |
| def summarize(path: Path) -> int: | |
| ref = json.loads(path.read_text()) | |
| out = K / "results/reference_summary.json" | |
| assert not out.exists(), f"refusing to overwrite {out}" | |
| qs = ref["questions"] | |
| per_q = [{"id": x["id"], "qid": x["qid"], "source": x["source"], "type": x["type"], "path": x["path"], | |
| "row_len": x["row_len"], "bucket": bucket_of(x["row_len"]), "top2_gap": x["top2_gap"], | |
| "near_tie": x["near_tie"], "argmax_key": x["argmax_key"], "gold_key": x["gold_key"], | |
| "gold_match": x["gold_match"]} for x in qs] | |
| gaps = sorted(x["top2_gap"] for x in per_q) | |
| def pct(q): | |
| return gaps[min(len(gaps) - 1, int(round(q * (len(gaps) - 1))))] | |
| by = lambda field: {k: rate([x for x in per_q if x[field] == k]) for k in sorted({x[field] for x in per_q}, key=str)} # noqa: E731 | |
| base = next(x for x in qs if x["id"] == "tv4_000") | |
| arm = next(x for x in qs if x["id"] == "red_arm_000") | |
| dp = max(abs(a_ - b) for a_, b in zip(base["probs"], arm["probs"])) | |
| doc = {"reference": str(path.relative_to(K) if path.is_relative_to(K) else path), "reference_sha256": sha256_file(path), | |
| "records": ref["counts"]["records"], "questions": len(per_q), | |
| "image_pending": ref["counts"]["image_pending"], "rejected": ref["counts"]["rejected"], | |
| "near_tie": {"threshold": NEAR_TIE, "count": sum(x["near_tie"] for x in per_q), | |
| "ids": [f"{x['id']}/{x['qid']}" for x in per_q if x["near_tie"]]}, | |
| "top2_gap": {"min": gaps[0], "p05": pct(0.05), "p10": pct(0.10), "p50": pct(0.5)}, | |
| "gold_overall": rate(per_q), "by_type": by("type"), "by_source": by("source"), "by_bucket": by("bucket"), | |
| "by_path": by("path"), | |
| "red_arm_000": {"base": "tv4_000/answer", "arm": "red_arm_000/answer", "keys": base["keys"], | |
| "probs_base": base["probs"], "probs_arm": arm["probs"], "max_abs_dp": dp, | |
| "argmax_base": base["argmax_key"], "argmax_arm": arm["argmax_key"], "threshold": RED_ARM_MIN, | |
| "moves": dp > RED_ARM_MIN, | |
| "status": ("invalid as a red arm on d1-3B, recorded only: the one-word change ('correctly' -> " | |
| "'incorrectly') moves the float32 answer by this much; a property of the model, not " | |
| "a defect of the path (decision, 2026-10-08)") if dp <= RED_ARM_MIN else "red"}, | |
| "red_arms": None if not ref.get("red_arms") else { | |
| "file": ref["red_arms"]["file"], "sha256": ref["red_arms"]["sha256"], "threshold": RED_ARM_MIN, | |
| "all_red": ref["red_arms"]["all_red"], | |
| "arms": [{"id": x["id"], "arm": x["arm"], "kind": x["kind"], "base": f"{x['base_id']}/{x['qid']}", | |
| "max_abs_dp": x["max_abs_dp"], "argmax_base": x["argmax_base"], "argmax_arm": x["argmax_key"], | |
| "argmax_changed": x["argmax_changed"], "red": x["red"], "row_len": x["row_len"]} | |
| for x in ref["red_arms"]["records"]]}, | |
| "other_conversion": d1b_compare(ref), "per_question": per_q} | |
| out.write_text(json.dumps(doc, ensure_ascii=False, indent=1) + "\n") | |
| print(json.dumps({k: doc[k] for k in ("records", "questions", "gold_overall", "top2_gap")} | | |
| {"near_tie": doc["near_tie"]["count"], "red_arm_000_dp": dp, "other_conversion": doc["other_conversion"]["status"], | |
| "red_arms": None if not doc["red_arms"] else [(x["id"], round(x["max_abs_dp"], 6)) for x in doc["red_arms"]["arms"]]})) | |
| return 0 | |
| def main() -> int: | |
| ap = argparse.ArgumentParser() | |
| ap.add_argument("--dry-run", action="store_true", help="no weights: print the ids and read-out groups, then stop") | |
| ap.add_argument("--dry-run-out", default=None, help="also write the dry-run list to this JSON path") | |
| ap.add_argument("--check-header", action="store_true", help="the weights' header against the Hub's and a meta build") | |
| ap.add_argument("--make-red-arms", action="store_true", help="write fixtures/red_arms.json (the adopted arms)") | |
| ap.add_argument("--summarize", default=None, help="a results/reference_<tag>.json: write results/reference_summary.json") | |
| ap.add_argument("--source", "--model-dir", dest="source", default=None, | |
| help="the snapshot dir with model.safetensors (default: the HF cache at REV)") | |
| ap.add_argument("--tag", default="fp32") | |
| ap.add_argument("--limit", type=int, default=0, help="first N records only (outputs get _smoke)") | |
| ap.add_argument("--only", default="", help="these record ids only, comma-separated (outputs get _smoke)") | |
| ap.add_argument("--out-dir", default=None, help="where the outputs go (default: results/)") | |
| ap.add_argument("--threads", type=int, default=MAX_THREADS, help=f"torch intra-op threads, at most {MAX_THREADS}") | |
| a = ap.parse_args() | |
| if a.summarize: | |
| return summarize(Path(a.summarize).resolve()) | |
| if a.make_red_arms: | |
| return make_red_arms() | |
| # before torch and transformers are imported: their thread pools and the copy of the provider's code | |
| for var in ("OMP_NUM_THREADS", "VECLIB_MAXIMUM_THREADS"): | |
| os.environ[var] = str(a.threads) | |
| os.environ.setdefault("HF_MODULES_CACHE", str(K / "cache/hf_modules")) | |
| os.environ.setdefault("HF_HUB_OFFLINE", "1") | |
| if a.check_header: | |
| return check_header(a) | |
| prompt = provider("prompt") | |
| tok = load_tokenizer() | |
| settings = engine_settings(tok, prompt) | |
| rows_by_key = {(x["id"], x["qid"]): x for x in json.loads(ROWS.read_text())["rows"]} | |
| planned = plan(prompt, tok, settings, load_fixtures(), rows_by_key) | |
| if a.dry_run: | |
| return dry_run(planned, Path(a.dry_run_out) if a.dry_run_out else None) | |
| return run(planned, plan_arms(prompt, tok, settings), a) | |
| if __name__ == "__main__": | |
| sys.exit(main()) | |