loss-manifest companion: article + 155-entry rated registry + sidecar + loss library + gates/battery + campaign beds + raw run ledgers
4ef8b0b verified | """fac_bed.py — FAC (factorized absolute code) experiment bed. #TAG:fac #TAG:loss_campaign #TAG:autoregressive #TAG:sign_code | |
| THE QUESTION: can a cosh-Bregman pull onto a FROZEN +/-1 code table replace the | |
| trained CE readout on the certified byte-LM operating point — and does swapping | |
| only-the-loss revive the certified addr_head collapse (the P4 cell)? | |
| Built ON TOP of tools/ar_differentiation_bed.py (as-run certified reference — | |
| imported, never modified, never copied). The certified operating point: | |
| wikitext-2-raw bytes, block 256, batch 32, d=192, 4 layers, 2000 steps, pure | |
| Adam lr 3e-4 wd=0. Incumbent control: addr_msl64 (3-seed certified mean bpb | |
| 2.4685; timeline 2026-07-09 W6). | |
| THE FAC CONSTRUCTION | |
| feats = the certified addr_msl64 pre-readout read: P=64 parallel D=4 slots | |
| through the shared K=64 aleph codebook, concat M_hat -> 256 dims. | |
| (The spec sketch guessed P=16/64-dim; the BED CODE is authoritative: | |
| ByteLM 'addr_msl<P>' parses P from the name -> addr_msl64 is 64 | |
| slots x D=4 = 256 dims. Recorded as smoke S0.) | |
| R = FIXED frame (64 x 256), orthonormal ROWS, torch.linalg.qr on a | |
| crc32-seeded gaussian; registered buffer, NEVER trained. Gauge-fixed | |
| by construction — a learnable frame reproduces either the tied-M_hat | |
| starvation or the L-PS1 moving-target failure. | |
| s = F.normalize(feats, dim=-1) @ R.T (B, T, 64); |s_k| <= 1 | |
| v = s / t_loss (t_loss 0.3; sweep .1/.3/1) | |
| C = FROZEN code table in {-1,+1}^{256 x 64}. Two constructions: | |
| fac_ecc — sign of an iid crc32-seeded gaussian (injective w.h.p.); | |
| fac_lsh — sign of the same gaussian box-filtered (width 3) along | |
| the byte-value axis, so numerically adjacent bytes share more bits | |
| (a semantic-adjacency proxy for the byte alphabet; bytes carry no | |
| pretrained embedding here, so a fixed random frame IS the SimHash). | |
| LOSS L = mean( cosh( clamp(v - C[y]*mu, -4, 4) ) - 1 ), mu = 1.0 (S4). | |
| This is the residual-form cosh-Bregman D_Phi(v - C[y]*mu, 0) with | |
| Phi = sum cosh: D_Phi(r,0) = cosh(r) - cosh(0) - sinh(0)*r | |
| = cosh(r) - 1 exactly (smoke S2; the target-anchored D_Phi(v, v*) | |
| is a DIFFERENT function — coincides only at v* = 0 — S2 reports the | |
| gap so the naming is honest). | |
| EVAL score(y') = s @ C[y'].T; bpb-of-record = log_softmax over the 256 | |
| scores (raw scores as logits — softmax temperature NOT calibrated; | |
| caveat recorded in every ledger line). Decoded-token accuracy and | |
| code-collision rate (Hamming <= 2 over distinct byte pairs) ride | |
| along. Decode argmax is a READOUT only — no selection event in any | |
| gradient path (aleph rider). | |
| ARMS (--arm) | |
| ce certified addr_msl64 incumbent — bed's own model + CE. | |
| ce_fixedcode SAME init (same seed, same RNG draw order), readout replaced | |
| by the frozen C: logits = s @ C.T, trained with CE. Zero | |
| trainable readout params — THE param-matched control. | |
| fac_lsh/fac_ecc the FAC loss with each code table. | |
| fac_none FAC loss, s from a plain Linear(d,64) on the trunk hidden | |
| state; the aleph head is present but UNREAD (gradient-dead). | |
| Isolates the geometry. | |
| p4_addr_head_ce the certified COLLAPSE configuration, verbatim: ByteLM | |
| 'addr_head' (raw hidden -> single-slot address, K=32, | |
| tau=0.1, coefficients->logits) + CE. Expected: bpb ~5.66, | |
| usage_ppl ~1.88/64. | |
| p4_addr_head_fac the SAME model (identical params; the coeff->logit head is | |
| computed but gradient-dead) with the FAC loss on the signed | |
| coefficient vector, embedded isometrically by a 64x32 | |
| orthonormal-column frame. ONLY THE LOSS DIFFERS. | |
| Prediction: usage_ppl >= 8/64 while win|cos| stays > 0.99. | |
| LEDGER JSON lines, one file per run: tools/fac_runs/{arm}_s{seed}_t{steps}.jsonl | |
| bpb (partitioned), decoded_acc, train-curve summary, collision_rate, | |
| sign_fidelity (exp015 gauge, L-078), anchor_drift mean + binding_fraction + | |
| usage_ppl + win|cos| (via the bed's own vitals -> geolip_vitals), gate stats | |
| (none of these arms carry gates — recorded as null), wall, peak_mem, params | |
| (+ delta vs ce — the S9 honesty line), seeds from crc32(arm:seed). | |
| RIDERS pure Adam wd=0 ONLY; fp32, TF32 off; cuda memory fraction 0.73; | |
| crc32 seeds never hash(); GPU-only verdict runs; data_root OUTSIDE the repo; | |
| Colab-cell-safe (paste-ahead imports, parse_known_args, no __file__ logic). | |
| Terminal: python tools/fac_bed.py # smoke battery (default) | |
| python tools/fac_bed.py --smoke # same | |
| python tools/fac_bed.py --bench # ~20-step throughput probe | |
| python tools/fac_bed.py --arm fac_lsh --seed 0 # verdict run | |
| Colab: paste geolip_vitals.py, ar_differentiation_bed.py, then this file | |
| (smokes auto-run); train_arm("fac_lsh", seed=0) in the next cell. | |
| """ | |
| from __future__ import annotations | |
| import json | |
| import math | |
| import os | |
| import sys | |
| import time | |
| import types | |
| import zlib | |
| import torch | |
| import torch.nn as nn | |
| import torch.nn.functional as F | |
| # ---------------------------------------------------------------- environment | |
| def _repo_root(): | |
| d = os.path.abspath(os.getcwd()) | |
| while True: | |
| if os.path.exists(os.path.join(d, "MANIFEST.md")): | |
| return d | |
| p = os.path.dirname(d) | |
| if p == d: | |
| return os.getcwd() | |
| d = p | |
| ROOT = _repo_root() | |
| _TOOLS = os.path.join(ROOT, "tools") | |
| if os.path.isdir(_TOOLS) and _TOOLS not in sys.path: | |
| sys.path.insert(0, _TOOLS) | |
| if "ByteLM" in globals() and "AlephAddress" in globals(): # Colab paste-ahead | |
| bed = types.SimpleNamespace( | |
| ByteLM=globals()["ByteLM"], AlephAddress=globals()["AlephAddress"], | |
| _wikitext_bytes=globals()["_wikitext_bytes"], | |
| _batch=globals()["_batch"], VOCAB=globals()["VOCAB"]) | |
| else: | |
| import ar_differentiation_bed as bed # certified, read-only | |
| torch.backends.cuda.matmul.allow_tf32 = False # pin_precision law | |
| torch.backends.cudnn.allow_tf32 = False | |
| DEV = "cuda" if torch.cuda.is_available() else "cpu" | |
| if DEV == "cuda": | |
| torch.cuda.set_per_process_memory_fraction(0.73) # WDDM standing cap | |
| DATA_ROOT = os.environ.get("GEOLIP_DATA", "./data") | |
| RUNS_DIR = (os.path.join(_TOOLS, "fac_runs") if os.path.isdir(_TOOLS) | |
| else os.path.abspath("./fac_runs")) | |
| CODE_BITS = 64 # width of the absolute code (matches the K=64 aleph book) | |
| T_LOSS = 0.3 # loss temperature (knob; sweep {0.1, 0.3, 1.0}) | |
| MU = 1.0 # target margin in v-units (S4 decision: KEPT at 1.0) | |
| CLAMP = 4.0 # residual clamp — cosh(4) ~ 27.3, fp32-safe by construction | |
| def seed_for(name: str) -> int: | |
| """crc32, never hash() — PYTHONHASHSEED nondeterminism is a recorded law.""" | |
| return zlib.crc32(name.encode("utf-8")) & 0x7FFFFFFF | |
| # ------------------------------------------------------------- frozen buffers | |
| def orthonormal_frame(out_dim: int, in_dim: int, seed: int) -> torch.Tensor: | |
| """(out_dim, in_dim) fixed frame, QR on a crc32-seeded gaussian, fp64 then | |
| fp32, canonical sign fix. NEVER trained (registered as a buffer). | |
| in_dim >= out_dim: orthonormal ROWS (R R^T = I) -> |s_k| <= 1 for unit feats | |
| in_dim < out_dim: orthonormal COLS (R^T R = I) -> isometric embed, | |
| ||s|| = ||feats_hat||, |s_k| <= ||row_k|| <= 1.""" | |
| g = torch.Generator().manual_seed(seed) | |
| n, m = max(out_dim, in_dim), min(out_dim, in_dim) | |
| G = torch.randn(n, m, generator=g, dtype=torch.float64) | |
| Q, Rq = torch.linalg.qr(G) | |
| sgn = torch.where(torch.diagonal(Rq) >= 0, 1.0, -1.0) | |
| Q = Q * sgn.unsqueeze(0) | |
| R = Q.T if in_dim >= out_dim else Q | |
| return R.float().contiguous() | |
| def build_code(kind: str) -> torch.Tensor: | |
| """FROZEN code table C in {-1,+1}^(256 x 64), crc32-seeded, buffer-only. | |
| ecc — sign of iid gaussian rows: injective w.h.p., no byte structure. | |
| lsh — sign of the gaussian box-filtered (width 3, replicate-padded) along | |
| the byte-value axis: adjacent byte values share ~73% of bits | |
| (corr 2/3 -> sign agreement 1 - arccos(2/3)/pi) — the | |
| semantic-adjacency proxy for the byte alphabet.""" | |
| g = torch.Generator().manual_seed(seed_for(f"fac:C:{kind}")) | |
| G = torch.randn(bed.VOCAB, CODE_BITS, generator=g, dtype=torch.float64) | |
| if kind == "lsh": | |
| Gp = torch.cat([G[:1], G, G[-1:]], dim=0) # replicate pad | |
| G = (Gp[:-2] + Gp[1:-1] + Gp[2:]) / 3.0 # width-3 box filter | |
| elif kind != "ecc": | |
| raise ValueError(f"unknown code table '{kind}' (ecc|lsh)") | |
| return torch.where(G >= 0, 1.0, -1.0).float().contiguous() | |
| def code_collision_rate(C: torch.Tensor, thresh: int = 2) -> float: | |
| """Fraction of distinct byte pairs whose codes are within Hamming <= thresh.""" | |
| ham = (C.shape[1] - C @ C.t()) / 2 | |
| iu = torch.triu_indices(C.shape[0], C.shape[0], offset=1) | |
| return float((ham[iu[0], iu[1]] <= thresh).float().mean()) | |
| def sign_fidelity(book: torch.Tensor, n: int = 3000, seed: int = 0) -> float: | |
| """Spearman(sign-code Hamming, true angle) over random pairs on S^(D-1), | |
| using the book as the LSH frame — the exp015 content gauge (L-078), | |
| reimplemented verbatim-in-spirit (importing exp015 drags its module state).""" | |
| A = F.normalize(book.detach().float().cpu(), dim=-1) | |
| g = torch.Generator().manual_seed(seed) | |
| D = A.shape[1] | |
| x = F.normalize(torch.randn(n, D, generator=g), dim=-1) | |
| y = F.normalize(torch.randn(n, D, generator=g), dim=-1) | |
| ang = torch.arccos((x * y).sum(-1).clamp(-1, 1)) | |
| ham = (torch.sign(x @ A.T) != torch.sign(y @ A.T)).float().mean(-1) | |
| ra = ang.argsort().argsort().float() | |
| rb = ham.argsort().argsort().float() | |
| ra = (ra - ra.mean()) / ra.std() | |
| rb = (rb - rb.mean()) / rb.std() | |
| return round(float((ra * rb).mean()), 4) | |
| def margin_audit(R: torch.Tensor, t_loss: float, mu: float) -> dict: | |
| """The S4 reachability chain, as data: per-axis max |s_k| = ||row_k|| <= 1; | |
| v = s/t_loss so per-axis reachable |v_k| = ||row_k||/t_loss; mu must sit | |
| strictly inside. (The JOINT target ||C[y]*mu|| = mu*8 exceeds the reachable | |
| ||v|| <= 1/t_loss ball — by design the loss is a per-axis margin pull, not | |
| an attainable minimum; recorded, not a failure.)""" | |
| rn = R.norm(dim=-1) | |
| lo, hi = float(rn.min()), float(rn.max()) | |
| return {"row_norm_min": round(lo, 4), "row_norm_max": round(hi, 4), | |
| "v_reach_min": round(lo / t_loss, 4), | |
| "v_reach_max": round(hi / t_loss, 4), "t_loss": t_loss, "mu": mu, | |
| "per_axis_reachable": bool(mu < lo / t_loss)} | |
| # --------------------------------------------------------------------- model | |
| class FacModel(nn.Module): | |
| """Wraps the CERTIFIED bed ByteLM — subclass-free reuse, zero copied math. | |
| mode: | |
| 'addr' — lm = ByteLM('addr_msl64'); lm.head := Identity, so the certified | |
| forward RETURNS the pre-readout feats itself (64 slots x D4 = | |
| 256). Same seed => bit-identical init to the ce arm everywhere | |
| except the (removed) readout. | |
| 'none' — lm = ByteLM('addr_msl64') kept whole (aleph present, UNREAD, | |
| gradient-dead); trunk walked via lm's own submodules; feats = | |
| plain Linear(d, 64) on the hidden state (orthogonal init, | |
| bias-free — the bed's head_proj idiom). | |
| 'p4' — lm = ByteLM('addr_head') UNMODIFIED (the certified collapse | |
| configuration: K=32, tau=0.1, coefficients->logits). The signed | |
| coefficient vector is captured by a forward PRE-HOOK on lm.head, | |
| so the two P4 cells have IDENTICAL parameters and identical | |
| forward compute — only the loss differs (the coeff->logit head | |
| is trainable-but-gradient-dead under FAC). | |
| The FAC read: s = normalize(feats) @ R.T (fixed frame), scores = s @ C.T.""" | |
| def __init__(self, mode: str, code: str = "ecc", d: int = 192, | |
| layers: int = 4, block: int = 256, t_loss: float = T_LOSS, | |
| mu: float = MU): | |
| super().__init__() | |
| self.mode, self.code_kind = mode, code | |
| self.t_loss, self.mu = t_loss, mu | |
| if mode == "addr": | |
| self.lm = bed.ByteLM("addr_msl64", d=d, layers=layers, block=block) | |
| in_dim = self.lm.n_slots * 4 # 256, read off the arm | |
| self.lm.head = nn.Identity() # readout removed | |
| elif mode == "none": | |
| self.lm = bed.ByteLM("addr_msl64", d=d, layers=layers, block=block) | |
| assert not self.lm.trigram and not self.lm.use_relay | |
| self.proj_none = nn.Linear(d, CODE_BITS, bias=False) | |
| nn.init.orthogonal_(self.proj_none.weight) | |
| in_dim = CODE_BITS | |
| elif mode == "p4": | |
| self.lm = bed.ByteLM("addr_head", d=d, layers=layers, block=block) | |
| in_dim = self.lm.head_addr.K # 32 | |
| self._w = None | |
| self.lm.head.register_forward_pre_hook(self._grab) | |
| else: | |
| raise ValueError(f"unknown mode '{mode}'") | |
| self.in_dim = in_dim | |
| self.register_buffer("R", orthonormal_frame( | |
| CODE_BITS, in_dim, seed_for(f"fac:R:{in_dim}"))) | |
| self.register_buffer("C", build_code(code)) | |
| def _grab(self, module, inputs): # p4 pre-hook | |
| self._w = inputs[0] | |
| def _trunk(self, idx): | |
| """The bed's trunk, walked via the wrapped submodules (mode 'none' only | |
| — the certified forward would read the aleph, which this arm forbids).""" | |
| lm = self.lm | |
| x = lm.emb(idx) + lm.pos[:, : idx.shape[1]] | |
| for b in lm.blocks: | |
| x = b(x) | |
| h = lm.nf(x) | |
| lm._last_h = h.detach() # vitals hookup | |
| return h | |
| def feats(self, idx): | |
| if self.mode == "addr": | |
| return self.lm(idx) # head=Identity -> feats | |
| if self.mode == "none": | |
| return self.proj_none(self._trunk(idx)) | |
| _ = self.lm(idx) # head computed, unused | |
| return self._w | |
| def address(self, idx): | |
| return F.normalize(self.feats(idx), dim=-1) @ self.R.t() | |
| def forward(self, idx): | |
| return self.address(idx) | |
| def vitals(self) -> dict: | |
| return self.lm.vitals() # the bed's own readouts | |
| # ---------------------------------------------------------------- loss + eval | |
| def fac_loss(s, y, C, t_loss: float = T_LOSS, mu: float = MU): | |
| """The FAC objective: residual-form cosh-Bregman pull onto the frozen code. | |
| L = mean(cosh(clamp(s/t_loss - C[y]*mu, -4, 4)) - 1) — S2/S3/S5/S6.""" | |
| v = s / t_loss | |
| r = (v - C[y] * mu).clamp(-CLAMP, CLAMP) | |
| return (torch.cosh(r) - 1.0).mean() | |
| def eval_scores(kind: str, model, x): | |
| """Per-token scores on the shared 256-way scale. ce -> the model's own | |
| logits; fixed-code kinds -> s @ C.T (raw scores as logits; softmax | |
| temperature NOT calibrated — the recorded caveat).""" | |
| if kind == "ce": | |
| return model(x) | |
| s = model.address(x) | |
| return s @ model.C.t() | |
| def compute_loss(kind: str, model, x, y): | |
| """THE single loss site of this bed (mirrors the bed's one F.cross_entropy).""" | |
| if kind in ("ce", "ce_fixedcode"): | |
| logits = eval_scores(kind, model, x) | |
| return F.cross_entropy(logits.reshape(-1, bed.VOCAB), y.reshape(-1)) | |
| s = model.address(x) | |
| return fac_loss(s, y, model.C, model.t_loss, model.mu) | |
| def evaluate(kind: str, model, va, batch, block, device, g, n_batches=20): | |
| model.eval() | |
| nll = acc = 0.0 | |
| for _ in range(n_batches): | |
| xv, yv = bed._batch(va, batch, block, device, g) | |
| sc = eval_scores(kind, model, xv) | |
| nll += float(F.cross_entropy(sc.reshape(-1, bed.VOCAB), yv.reshape(-1))) | |
| acc += float((sc.argmax(-1) == yv).float().mean()) | |
| model.train() | |
| return nll / n_batches / math.log(2), acc / n_batches | |
| # ---------------------------------------------------------------------- arms | |
| ARMS = { | |
| "ce": dict(kind="ce", mode=None, | |
| note="certified addr_msl64 incumbent (3-seed 2.4685)"), | |
| "ce_fixedcode": dict(kind="ce_fixedcode", mode="addr", | |
| note="frozen-C readout, CE — THE param-matched control"), | |
| "fac_lsh": dict(kind="fac", mode="addr", code="lsh"), | |
| "fac_ecc": dict(kind="fac", mode="addr", code="ecc"), | |
| "fac_none": dict(kind="fac", mode="none", | |
| note="aleph UNREAD (gradient-dead) — geometry isolation"), | |
| "p4_addr_head_ce": dict(kind="ce", mode="p4ce", | |
| note="certified collapse config + CE (expect ~5.66 bpb, ppl ~1.88/64)"), | |
| "p4_addr_head_fac": dict(kind="fac", mode="p4", | |
| note="same params, FAC loss (predict ppl >= 8/64, win|cos| > .99)"), | |
| } | |
| def build_model(arm: str, code: str = "ecc", d: int = 192, layers: int = 4, | |
| block: int = 256, t_loss: float = T_LOSS, mu: float = MU): | |
| spec = ARMS[arm] | |
| if arm == "ce": | |
| return bed.ByteLM("addr_msl64", d=d, layers=layers, block=block) | |
| if arm == "p4_addr_head_ce": | |
| return bed.ByteLM("addr_head", d=d, layers=layers, block=block) | |
| return FacModel(spec["mode"], code=spec.get("code", code), d=d, | |
| layers=layers, block=block, t_loss=t_loss, mu=mu) | |
| def _trainable(model) -> int: | |
| return sum(p.numel() for p in model.parameters() if p.requires_grad) | |
| def model_vitals(model) -> dict: | |
| lm = model.lm if isinstance(model, FacModel) else model | |
| return {"vitals": model.vitals(), | |
| "sign_fidelity": sign_fidelity(lm.head_addr.codebook), | |
| "gates": None} # no gates in any FAC arm | |
| # ---------------------------------------------------------------------- train | |
| def train_arm(arm: str, seed: int = 0, steps: int = 2000, batch: int = 32, | |
| block: int = 256, d: int = 192, layers: int = 4, | |
| device: str = "cuda", data_root: str | None = None, | |
| t_loss: float = T_LOSS, mu: float = MU, code: str | None = None, | |
| eval_every: int = 500, save: bool = True, lr: float = 3e-4): | |
| """Verdict run — GPU only, pure Adam wd=0, ledger JSONL under tools/fac_runs.""" | |
| if device == "cuda" and not torch.cuda.is_available(): | |
| raise RuntimeError("Verdict runs are GPU-only (never CPU-train for accuracy).") | |
| spec = ARMS[arm] | |
| code = code or spec.get("code", "ecc") | |
| data_root = data_root or DATA_ROOT | |
| base = seed_for(f"{arm}:{seed}") # crc32(arm + seed index) | |
| torch.manual_seed(base) | |
| g = torch.Generator().manual_seed(base) | |
| tr, va = bed._wikitext_bytes(data_root) | |
| print(f"data ready: train {tr.numel():,} bytes, val {va.numel():,} bytes", | |
| flush=True) | |
| model = build_model(arm, code=code, d=d, layers=layers, block=block, | |
| t_loss=t_loss, mu=mu).to(device) | |
| with torch.random.fork_rng(): # S9 honesty line, same init seed | |
| torch.manual_seed(base) | |
| ce_ref = bed.ByteLM("addr_msl64", d=d, layers=layers, block=block) | |
| ce_trainable = _trainable(ce_ref) | |
| del ce_ref | |
| n_train = _trainable(model) | |
| audit = (margin_audit(model.R, t_loss, mu) | |
| if isinstance(model, FacModel) else None) | |
| if audit is not None and not audit["per_axis_reachable"]: | |
| print(f"WARNING: mu={mu} not per-axis reachable at t_loss={t_loss} " | |
| f"({audit}) — the margin never engages; consider mu<=" | |
| f"{0.8 * audit['v_reach_min']:.2f}", flush=True) | |
| os.makedirs(RUNS_DIR, exist_ok=True) | |
| led = os.path.join(RUNS_DIR, f"{arm}_s{seed}_t{steps}.jsonl") | |
| def emit(obj, first=False): | |
| with open(led, "w" if first else "a", encoding="utf-8") as f: | |
| f.write(json.dumps(obj) + "\n") | |
| emit({"event": "config", "arm": arm, "seed": seed, "base_seed": base, | |
| "steps": steps, "batch": batch, "block": block, "d": d, | |
| "layers": layers, "lr": lr, "t_loss": t_loss, "mu": mu, | |
| "code": (code if isinstance(model, FacModel) else None), | |
| "margin_audit": audit, "params_trainable": n_train, | |
| "params_trainable_ce_ref": ce_trainable, | |
| "param_delta_vs_ce": ce_trainable - n_train, | |
| "readout_note": { | |
| "ce": "trained Linear(256,256) readout", | |
| "ce_fixedcode": "frozen C readout — ZERO trainable readout params", | |
| "fac_lsh": "frozen C readout — ZERO trainable readout params", | |
| "fac_ecc": "frozen C readout — ZERO trainable readout params", | |
| "fac_none": "frozen C readout; aleph head params present but UNREAD", | |
| "p4_addr_head_ce": "trained Linear(32,256) coeff->logit head", | |
| "p4_addr_head_fac": "identical params to the ce cell; coeff->logit " | |
| "head computed but gradient-dead under FAC", | |
| }[arm], "partition_note": "bpb uses raw s@C.T scores as logits " | |
| "(log_softmax); softmax temperature NOT calibrated — caveat", | |
| "torch": torch.__version__, "device": device, | |
| "note": spec.get("note", "")}, first=True) | |
| if device == "cuda": | |
| torch.cuda.reset_peak_memory_stats() | |
| opt = torch.optim.Adam(model.parameters(), lr=lr, weight_decay=0.0) | |
| kind, curve, t0, bpb, acc = spec["kind"], [], time.time(), None, None | |
| for step in range(1, steps + 1): | |
| x, y = bed._batch(tr, batch, block, device, g) | |
| loss = compute_loss(kind, model, x, y) | |
| opt.zero_grad(set_to_none=True) | |
| loss.backward() | |
| opt.step() | |
| if step == 1 or step % 100 == 0: | |
| curve.append([step, round(float(loss), 5)]) | |
| if step % eval_every == 0 or step == steps: | |
| bpb, acc = evaluate(kind, model, va, batch, block, device, g) | |
| vit = model_vitals(model) | |
| emit({"event": "eval", "step": step, "bpb": round(bpb, 4), | |
| "decoded_acc": round(acc, 4), **vit}) | |
| print(f"[{arm} s{seed}] step {step} bpb={bpb:.4f} acc={acc:.4f} " | |
| f"vitals={vit['vitals']}", flush=True) | |
| losses = [c[1] for c in curve] | |
| final = {"event": "final", "arm": arm, "seed": seed, "steps": steps, | |
| "t_loss": t_loss, "mu": mu, | |
| "code": (code if isinstance(model, FacModel) else None), | |
| "bpb": round(bpb, 4), "decoded_acc": round(acc, 4), | |
| "collision_rate": (code_collision_rate(model.C.cpu()) | |
| if isinstance(model, FacModel) else None), | |
| "train_curve": {"first": losses[0], "final": losses[-1], | |
| "min": min(losses), "every100": curve}, | |
| **model_vitals(model), | |
| "wall_s": round(time.time() - t0, 1), | |
| "peak_mem_gb": (round(torch.cuda.max_memory_allocated() / 2**30, 3) | |
| if device == "cuda" else 0.0), | |
| "params_trainable": n_train, | |
| "param_delta_vs_ce": ce_trainable - n_train, | |
| "mu_note": "mu in v-units; per-axis reachability audited at config; " | |
| "joint target ||C[y]*mu||=8 exceeds ||v||<=1/t_loss — " | |
| "per-axis margin pull by design"} | |
| emit(final) | |
| print(json.dumps(final), flush=True) | |
| if save: | |
| ck = os.path.join(data_root, "fac_ckpts") | |
| os.makedirs(ck, exist_ok=True) | |
| path = os.path.join(ck, f"{arm}_s{seed}_t{steps}.pt") | |
| torch.save({"arm": arm, "seed": seed, "steps": steps, "bpb": bpb, | |
| "state_dict": {k: v.cpu() for k, v in | |
| model.state_dict().items()}}, path) | |
| print(f"saved specimen: {path}", flush=True) | |
| return final | |
| # ---------------------------------------------------------------------- bench | |
| def bench(arm: str = "fac_lsh", steps: int = 20, warmup: int = 5, | |
| batch: int = 32, block: int = 256, device: str = "cuda", | |
| data_root: str | None = None): | |
| """~20-step throughput probe at the full operating point -> min/2000 steps. | |
| Falls back to synthetic random bytes if the parquet cache is unreachable | |
| (identical compute — the batch path indexes a flat uint8 tensor either way).""" | |
| if device == "cuda" and not torch.cuda.is_available(): | |
| raise RuntimeError("bench is a GPU probe") | |
| try: | |
| tr, _ = bed._wikitext_bytes(data_root or DATA_ROOT) | |
| src = "wikitext-2-raw" | |
| except Exception as e: | |
| g0 = torch.Generator().manual_seed(seed_for("fac:bench:data")) | |
| tr = torch.randint(0, 256, (2_000_000,), generator=g0, | |
| dtype=torch.uint8) | |
| src = f"synthetic ({type(e).__name__})" | |
| torch.manual_seed(seed_for(f"{arm}:bench")) | |
| g = torch.Generator().manual_seed(seed_for(f"{arm}:bench")) | |
| model = build_model(arm).to(device) | |
| kind = ARMS[arm]["kind"] | |
| opt = torch.optim.Adam(model.parameters(), lr=3e-4, weight_decay=0.0) | |
| if device == "cuda": | |
| torch.cuda.reset_peak_memory_stats() | |
| for _ in range(warmup): | |
| x, y = bed._batch(tr, batch, block, device, g) | |
| loss = compute_loss(kind, model, x, y) | |
| opt.zero_grad(set_to_none=True); loss.backward(); opt.step() | |
| if device == "cuda": | |
| torch.cuda.synchronize() | |
| t0 = time.time() | |
| for _ in range(steps): | |
| x, y = bed._batch(tr, batch, block, device, g) | |
| loss = compute_loss(kind, model, x, y) | |
| opt.zero_grad(set_to_none=True); loss.backward(); opt.step() | |
| if device == "cuda": | |
| torch.cuda.synchronize() | |
| sec = (time.time() - t0) / steps | |
| peak = (torch.cuda.max_memory_allocated() / 2**30) if device == "cuda" else 0.0 | |
| print(f"BENCH [{arm}] data={src} {sec*1000:.1f} ms/step -> " | |
| f"{sec*2000/60:.1f} min / 2000 steps (+~{20*sec:.0f}s eval overhead); " | |
| f"peak {peak:.2f} GB", flush=True) | |
| return {"arm": arm, "ms_per_step": sec * 1000, | |
| "min_per_2000": sec * 2000 / 60, "peak_gb": peak, "data": src} | |
| # ------------------------------------------------------------- smoke battery | |
| RESULTS = [] | |
| def record(tid, name, ok, detail=""): | |
| RESULTS.append((tid, name, "PASS" if ok else "FAIL", detail)) | |
| return ok | |
| def run_smokes() -> bool: | |
| """FORMULA smokes only — shapes, gradients, identities, fp32 safety, | |
| causality, param honesty. NO training, ever (MANIFEST rider); the S3 | |
| minimizer probe optimizes one free 64-vector, not a model.""" | |
| del RESULTS[:] | |
| t0 = time.time() | |
| sd, sl, sb = 96, 2, 64 # small config | |
| # S0 — feats-dim truth: the certified addr_msl64 read is 64 slots x D4. | |
| torch.manual_seed(seed_for("fac:s0")) | |
| m_addr = FacModel("addr", "lsh", d=sd, layers=sl, block=sb).to(DEV) | |
| record("S0", "feats match the certified addr_msl64 read", | |
| m_addr.in_dim == 256 and m_addr.lm.n_slots == 64, | |
| "64 slots x D=4 = 256-dim feats (bed code authoritative; spec's " | |
| "'P=16' guess corrected) -> R is 64x256 orthonormal-rows") | |
| # S1 — gradient flow: FAC backward reaches the aleph codebook AND the slot | |
| # projection (the tied-M_hat failure would show a near-zero codebook grad). | |
| g1 = torch.Generator().manual_seed(seed_for("fac:s1")) | |
| seq = torch.randint(0, 256, (2, sb + 1), generator=g1) | |
| x, y = seq[:, :-1].to(DEV), seq[:, 1:].to(DEV) | |
| loss = fac_loss(m_addr.address(x), y, m_addr.C) | |
| loss.backward() | |
| g_cb = float(m_addr.lm.head_addr.codebook.grad.norm()) | |
| g_pj = float(m_addr.lm.head_proj.weight.grad.norm()) | |
| g_em = float(m_addr.lm.emb.weight.grad.norm()) | |
| record("S1", "FAC gradient flow (codebook + slot proj + trunk)", | |
| g_cb > 0 and g_pj > 0 and g_em > 0 | |
| and all(map(math.isfinite, (g_cb, g_pj, g_em))), | |
| "|g| codebook %.2e, head_proj %.2e, emb %.2e — all nonzero/finite" | |
| % (g_cb, g_pj, g_em)) | |
| # S2 — Bregman identity. Phi = sum cosh. The implemented loss is the | |
| # RESIDUAL-form divergence D_Phi(r, 0) = cosh(r) - cosh(0) - sinh(0)*r | |
| # = cosh(r) - 1 ("up to the constant" = cosh(0)). The target-anchored | |
| # D_Phi(v, v*) is a different function (equal only at v* = 0) — its gap is | |
| # reported so the 'cosh-Bregman' name stays honest. | |
| g2 = torch.Generator().manual_seed(seed_for("fac:s2")) | |
| r = torch.empty(4096, dtype=torch.float64).uniform_(-3.9, 3.9, generator=g2) | |
| d_res = float((torch.cosh(r) - math.cosh(0.0) - math.sinh(0.0) * r | |
| - (torch.cosh(r) - 1.0)).abs().max()) | |
| vs = torch.where(torch.rand(4096, generator=g2) > 0.5, 1.0, -1.0).double() | |
| v = r + vs | |
| d_anchor = float((torch.cosh(v) - torch.cosh(vs) - torch.sinh(vs) * (v - vs) | |
| - (torch.cosh(v - vs) - 1.0)).abs().max()) | |
| record("S2", "Bregman identity (residual form, up to cosh(0))", | |
| d_res <= 1e-6, | |
| "residual-form dev %.1e; target-anchored D_Phi(v,c*mu) differs by " | |
| "up to %.2f — loss is D_Phi(v - C[y]mu, 0), coincides at v*=0" | |
| % (d_res, d_anchor)) | |
| # S3 — minimizer identity: 200 Adam steps on a free 64-vector -> the code. | |
| C_ecc = build_code("ecc") | |
| g3 = torch.Generator().manual_seed(seed_for("fac:s3")) | |
| y0 = int(torch.randint(0, 256, (1,), generator=g3)) | |
| target = C_ecc[y0] * MU | |
| vfree = nn.Parameter(torch.zeros(CODE_BITS)) | |
| # pure Adam wd=0; beta2=0.9 so the second-moment memory (1000-step at the | |
| # default 0.999) cannot suppress late updates inside a 200-step anneal — | |
| # measured: default betas freeze the error at ~3e-3. | |
| opt3 = torch.optim.Adam([vfree], lr=1.0, betas=(0.9, 0.9), weight_decay=0.0) | |
| for _ in range(200): | |
| l3 = (torch.cosh((vfree - target).clamp(-CLAMP, CLAMP)) - 1.0).mean() | |
| opt3.zero_grad(set_to_none=True) | |
| l3.backward() | |
| opt3.step() | |
| for pg in opt3.param_groups: | |
| pg["lr"] *= 0.93 # anneal; Adam alone orbits at lr | |
| err3 = float((vfree.detach() - target).abs().max()) | |
| record("S3", "minimizer identity (free v -> C[y]*mu)", | |
| err3 < 1e-4, "||v - C[y]mu||_inf = %.1e after 200 Adam steps" % err3) | |
| # S4 — margin reachability chain. |s_k| <= ||R row_k|| <= 1 (R construction); | |
| # v = s/t_loss -> per-axis reachable |v_k| = ||row_k||/0.3 (=3.33 for the | |
| # orthonormal-row frames); mu = 1.0 sits strictly inside for ALL frames, | |
| # and a perfectly-aligned s pulls strictly toward the target on every axis. | |
| # DECISION: mu stays 1.0 (in v-units; the s-unit boundary worry dissolves | |
| # because the margin lives in v-space). | |
| frames = {n: orthonormal_frame(CODE_BITS, i, seed_for(f"fac:R:{i}")) | |
| for n, i in (("addr", 256), ("none", 64), ("p4", 32))} | |
| audits = {n: margin_audit(Rf, T_LOSS, MU) for n, Rf in frames.items()} | |
| ortho_dev = max( | |
| float((frames["addr"] @ frames["addr"].t() | |
| - torch.eye(CODE_BITS)).abs().max()), | |
| float((frames["none"] @ frames["none"].t() | |
| - torch.eye(CODE_BITS)).abs().max()), | |
| float((frames["p4"].t() @ frames["p4"] | |
| - torch.eye(32)).abs().max())) | |
| s_align = C_ecc[y0] / math.sqrt(CODE_BITS) # unit, code-aligned | |
| pull = -torch.sinh((s_align / T_LOSS - C_ecc[y0] * MU).clamp(-CLAMP, CLAMP) | |
| ) * C_ecc[y0] | |
| ok4 = (all(a["per_axis_reachable"] for a in audits.values()) | |
| and all(a["row_norm_max"] <= 1.0 + 1e-5 for a in audits.values()) | |
| and ortho_dev < 1e-5 and bool((pull > 0).all())) | |
| record("S4", "margin reachability (mu=1.0 KEPT, v-units)", ok4, | |
| "v-reach addr/none/p4 = %.2f/%.2f/%.2f > mu=1; ortho dev %.0e; " | |
| "aligned-s pull > 0 on 64/64 axes" | |
| % (audits["addr"]["v_reach_min"], audits["none"]["v_reach_min"], | |
| audits["p4"]["v_reach_min"], ortho_dev)) | |
| # S5 — antipodal invariance: L(v, c) == L(-v, -c) bit-exact. | |
| g5 = torch.Generator().manual_seed(seed_for("fac:s5")) | |
| s5 = (torch.randn(4, 32, CODE_BITS, generator=g5) * 0.4).to(DEV) | |
| y5 = torch.randint(0, 256, (4, 32), generator=g5).to(DEV) | |
| C5 = C_ecc.to(DEV) | |
| la, lb = fac_loss(s5, y5, C5), fac_loss(-s5, y5, -C5) | |
| record("S5", "antipodal invariance L(v,c)==L(-v,-c)", | |
| bool(torch.equal(la, lb)), | |
| "bit-exact on %s: %.6f == %.6f" % (DEV, float(la), float(lb))) | |
| # S6 — fp32 overflow: finite loss AND gradient over the full reachable |v| | |
| # range (t_loss down to 0.1 -> |v| <= 10, swept to 12) with the clamp; the | |
| # zero-feats normalize edge is finite too. | |
| v6 = torch.linspace(-12.0, 12.0, 100001).requires_grad_(True) | |
| l6 = (torch.cosh((v6 - 1.0).clamp(-CLAMP, CLAMP)) - 1.0).sum() | |
| l6.backward() | |
| z = F.normalize(torch.zeros(3, CODE_BITS), dim=-1) @ frames["none"].t() | |
| ok6 = (bool(torch.isfinite(l6)) and bool(torch.isfinite(v6.grad).all()) | |
| and bool(torch.isfinite(z).all())) | |
| record("S6", "fp32 safety across the reachable v-range", | |
| ok6, "cosh capped at cosh(4)=%.1f; grad finite on [-12,12]; " | |
| "zero-feats normalize edge finite" % math.cosh(CLAMP)) | |
| # S7 — decode consistency: planted s = C[y]*t_loss*mu -> argmax score == y, | |
| # 1000 draws under fac_ecc (assert); lsh failure rate reported, not gated. | |
| g7 = torch.Generator().manual_seed(seed_for("fac:s7")) | |
| y7 = torch.randint(0, 256, (1000,), generator=g7) | |
| acc_ecc = float(((C_ecc[y7] * T_LOSS * MU) @ C_ecc.t() | |
| ).argmax(-1).eq(y7).float().mean()) | |
| C_lsh = build_code("lsh") | |
| acc_lsh = float(((C_lsh[y7] * T_LOSS * MU) @ C_lsh.t() | |
| ).argmax(-1).eq(y7).float().mean()) | |
| adj = float((C_lsh[:-1] == C_lsh[1:]).float().mean()) | |
| record("S7", "decode consistency (planted code -> argmax)", | |
| acc_ecc == 1.0, | |
| "ecc 1000/1000; lsh fail rate %.4f (report-only); collisions@H<=2 " | |
| "ecc %.1e lsh %.1e; lsh adjacent-byte bit-share %.3f" | |
| % (1.0 - acc_lsh, code_collision_rate(C_ecc), | |
| code_collision_rate(C_lsh), adj)) | |
| # S8 — causality: the bed's future-leak check, replicated on every FAC | |
| # read path (addr / none / p4): a future byte must not move past scores. | |
| leaks = {} | |
| for mode in ("addr", "none", "p4"): | |
| torch.manual_seed(seed_for(f"fac:s8:{mode}")) | |
| m8 = FacModel(mode, "ecc", d=sd, layers=sl, block=sb).to(DEV).eval() | |
| g8 = torch.Generator().manual_seed(seed_for("fac:s8:x")) | |
| x8 = torch.randint(0, 256, (2, sb), generator=g8).to(DEV) | |
| with torch.no_grad(): | |
| a = (m8.address(x8) @ m8.C.t())[0, 10] | |
| x8b = x8.clone() | |
| x8b[0, 40] = (x8b[0, 40] + 7) % 256 | |
| b = (m8.address(x8b) @ m8.C.t())[0, 10] | |
| leaks[mode] = float((a - b).abs().max()) | |
| record("S8", "causality (no future leak, all FAC read paths)", | |
| all(v <= 1e-4 for v in leaks.values()), | |
| "max |dscore@t=10| after t=40 edit: " + | |
| ", ".join(f"{k} {v:.1e}" for k, v in leaks.items())) | |
| # S9 — toggle/param-match honesty at the full operating point (d=192, L=4): | |
| # ce_fixedcode == ce minus EXACTLY the readout table; zero trainable | |
| # readout params; the two P4 cells are parameter-IDENTICAL. | |
| with torch.random.fork_rng(): | |
| torch.manual_seed(seed_for("fac:s9")) | |
| ce_ref = bed.ByteLM("addr_msl64") | |
| torch.manual_seed(seed_for("fac:s9")) | |
| fc = FacModel("addr", "ecc") | |
| torch.manual_seed(seed_for("fac:s9")) | |
| p4c = bed.ByteLM("addr_head") | |
| torch.manual_seed(seed_for("fac:s9")) | |
| p4f = FacModel("p4", "ecc") | |
| head_n = ce_ref.head.weight.numel() + ce_ref.head.bias.numel() | |
| tr_ce, tr_fc = _trainable(ce_ref), _trainable(fc) | |
| fc_readout = 0 if isinstance(fc.lm.head, nn.Identity) else -1 | |
| record("S9", "param match (readout delta exact; P4 cells identical)", | |
| tr_ce - tr_fc == head_n == 65792 and fc_readout == 0 | |
| and _trainable(p4c) == _trainable(p4f), | |
| "ce %s vs ce_fixedcode %s (delta %s == readout %s; fixed-code " | |
| "readout trainable=0); p4 pair %s == %s" | |
| % (f"{tr_ce:,}", f"{tr_fc:,}", f"{tr_ce - tr_fc:,}", | |
| f"{head_n:,}", f"{_trainable(p4c):,}", f"{_trainable(p4f):,}")) | |
| # ------------------------------------------------------------------ table | |
| wall = time.time() - t0 | |
| peak = (torch.cuda.max_memory_allocated() / 2**30) if DEV == "cuda" else 0.0 | |
| print("\nFAC FORMULA-SMOKE BATTERY (%s, %.1fs, peak %.2f GB)" | |
| % (DEV, wall, peak)) | |
| print("-" * 100) | |
| npass = nfail = 0 | |
| for tid, name, st, detail in RESULTS: | |
| npass += st == "PASS" | |
| nfail += st == "FAIL" | |
| print("%-5s %-4s %-46s %s" % (tid, st, name[:46], detail)) | |
| print("-" * 100) | |
| print("PASS %d FAIL %d SKIP %d" % (npass, nfail, | |
| len(RESULTS) - npass - nfail)) | |
| return nfail == 0 | |
| def print_launch_matrix(steps: int = 2000): | |
| print("\nARM MATRIX (verdict runs — NOT launched by this bed; P4 cells first):") | |
| py = ".venv/Scripts/python.exe" | |
| for arm in ("p4_addr_head_ce", "p4_addr_head_fac"): | |
| print(f" {py} tools/fac_bed.py --arm {arm} --seed 0") | |
| for arm in ("ce", "ce_fixedcode", "fac_lsh", "fac_ecc", "fac_none"): | |
| for seed in (0, 1, 2): | |
| print(f" {py} tools/fac_bed.py --arm {arm} --seed {seed}") | |
| print(" # knobs: --steps N | --t_loss {0.1,0.3,1.0} | --mu M | --code {ecc,lsh}") | |
| def _in_notebook() -> bool: | |
| try: | |
| get_ipython() # type: ignore[name-defined] # noqa: F821 | |
| return True | |
| except NameError: | |
| return False | |
| if __name__ == "__main__": | |
| if _in_notebook(): | |
| _ok = run_smokes() | |
| print_launch_matrix() | |
| print("Notebook mode: train_arm('fac_lsh', seed=0) in the next cell (GPU).") | |
| else: | |
| import argparse | |
| ap = argparse.ArgumentParser() | |
| ap.add_argument("--arm", type=str, default=None, choices=sorted(ARMS)) | |
| ap.add_argument("--seed", type=int, default=0) | |
| ap.add_argument("--steps", type=int, default=2000) | |
| ap.add_argument("--smoke", action="store_true") | |
| ap.add_argument("--bench", action="store_true") | |
| ap.add_argument("--t_loss", type=float, default=T_LOSS) | |
| ap.add_argument("--mu", type=float, default=MU) | |
| ap.add_argument("--code", type=str, default=None, choices=("ecc", "lsh")) | |
| ap.add_argument("--data_root", type=str, default=None) | |
| ap.add_argument("--device", type=str, default="cuda") | |
| a, _ = ap.parse_known_args() | |
| if a.bench: | |
| bench(steps=20, device=a.device, data_root=a.data_root) | |
| elif a.arm and not a.smoke: | |
| train_arm(a.arm, seed=a.seed, steps=a.steps, device=a.device, | |
| data_root=a.data_root, t_loss=a.t_loss, mu=a.mu, | |
| code=a.code) | |
| else: | |
| ok = run_smokes() | |
| print_launch_matrix(a.steps) | |
| sys.exit(0 if ok else 1) | |