Download code/ktrit_resident.py from CodeMasterCody3D/taardis-27b-ubit: direct link, hf CLI and curl.
- Browser
- Download file 7.96 kB
-
https://huggingface.co/CodeMasterCody3D/taardis-27b-ubit/resolve/main/code/ktrit_resident.py
- Command line
-
hf download hf://CodeMasterCody3D/taardis-27b-ubit/code/ktrit_resident.py
-
curl -L -o ktrit_resident.py https://huggingface.co/CodeMasterCody3D/taardis-27b-ubit/resolve/main/code/ktrit_resident.py
7.96 kB
| #!/usr/bin/env python3 | |
| """Resident-QUANTIZED any-k base-3 (ubit) — the cheat code generalized past k5. | |
| Cody, 2026-09-17: "remember the k5 cheat code. we don't need to unpack." grouped_place's --out | |
| path DEQUANTED every placed linear to a dense bf16 checkpoint (54 GB, and the 248320-row head's | |
| unpack OOMs). That threw the packing away. Here the placed PackedKTritLinear buffers (packed | |
| bytes + group scales) are saved AS-IS and reloaded resident, decoding per-forward one linear at a | |
| time — never a global unpack, ~10 GB on disk and in VRAM. Mirrors k5_resident.load_k5_resident. | |
| """ | |
| import os, json, torch, torch.nn as nn | |
| import rotation as ROT | |
| from base3_pack import PackedKTritLinear | |
| from ternary_gptq import _RotatedInput | |
| def save_packed(model, out_dir, rot_map, grp_map, log=print): | |
| """Save the PLACED model without dequant: each PackedKTritLinear's bytes+scale + a manifest of | |
| (k,g,rot,in,out,bias) per linear, plus the dense small tensors (embed/norms/conv/biases).""" | |
| from safetensors.torch import save_file | |
| os.makedirs(out_dir, exist_ok=True) | |
| packed_stems = set() | |
| tensors, manifest = {}, {} | |
| wrapped = {id(m.lin) for _, m in model.named_modules() if isinstance(m, _RotatedInput)} | |
| for name, mod in model.named_modules(): | |
| if isinstance(mod, _RotatedInput): | |
| inner, blk = mod.lin, int(getattr(mod, "blk", 0)) | |
| elif isinstance(mod, PackedKTritLinear) and id(mod) not in wrapped: | |
| inner, blk = mod, 0 # bare (unrotated) linear | |
| else: | |
| continue # skip the .lin child of a wrapper (dup) | |
| if isinstance(inner, PackedKTritLinear): | |
| tensors[f"{name}.bytes"] = inner.bytes.cpu().contiguous() | |
| tensors[f"{name}.scale"] = inner.scale.cpu().contiguous() | |
| if inner.bias is not None: | |
| tensors[f"{name}.bias"] = inner.bias.detach().to(torch.bfloat16).cpu().contiguous() | |
| manifest[name] = {"k": int(inner.k), "g": int(inner.group_size), "blk": blk, | |
| "in": int(inner.in_features), "out": int(inner.out_features), | |
| "bias": inner.bias is not None} | |
| packed_stems.add(name) | |
| # dense remainder: every state_dict tensor not owned by a packed linear | |
| for k, v in model.state_dict().items(): | |
| if any(k == f"{s}.bytes" or k == f"{s}.scale" or k == f"{s}.bias" or | |
| k.startswith(f"{s}.") for s in packed_stems): | |
| continue | |
| tensors[f"__dense__{k}"] = (v.to(torch.bfloat16) if v.is_floating_point() else v).cpu().contiguous() | |
| save_file(tensors, os.path.join(out_dir, "packed.safetensors")) | |
| json.dump(manifest, open(os.path.join(out_dir, "ubit_manifest.json"), "w")) | |
| log(f"[save-packed] {len(manifest)} packed linears + {sum(1 for k in tensors if k.startswith('__dense__'))} " | |
| f"dense tensors -> {out_dir}/packed.safetensors (NO dequant)") | |
| return len(manifest) | |
| def load_ktrit_resident(ck, device, dtype=torch.bfloat16, log=print): | |
| """Rebuild the placed model resident: each manifest linear as a PackedKTritLinear (rotation- | |
| wrapped if blk>1), decode-per-forward. No global unpack.""" | |
| from transformers import AutoConfig, AutoModelForCausalLM | |
| import transformers | |
| from safetensors.torch import load_file | |
| manifest = json.load(open(os.path.join(ck, "ubit_manifest.json"))) | |
| blob = load_file(os.path.join(ck, "packed.safetensors")) | |
| config = AutoConfig.from_pretrained(ck) | |
| dk = "dtype" if int(transformers.__version__.split(".")[0]) >= 5 else "torch_dtype" | |
| is_vl = getattr(config, "vision_config", None) is not None # retrofitted vision+MTP -> VL class | |
| with torch.device("meta"): | |
| if is_vl: | |
| from transformers import AutoModelForImageTextToText | |
| model = AutoModelForImageTextToText.from_config(config, **{dk: dtype}) | |
| else: | |
| model = AutoModelForCausalLM.from_config(config, **{dk: dtype}) | |
| model.eval() | |
| # 1) swap in the packed linears | |
| def _set(root, dotted, module): | |
| *ps, leaf = dotted.split("."); p = root | |
| for x in ps: p = getattr(p, x) | |
| setattr(p, leaf, module) | |
| skipped = [] | |
| for name, m in manifest.items(): | |
| bias = blob.get(f"{name}.bias") | |
| pk = PackedKTritLinear(blob[f"{name}.bytes"], blob[f"{name}.scale"], m["in"], m["k"], | |
| bias.float() if bias is not None else None, m["out"], m["g"]).to(device) | |
| try: | |
| _set(model, name, _RotatedInput(pk, m["blk"]) if m["blk"] and m["blk"] > 1 else pk) | |
| except AttributeError: | |
| skipped.append(name) # no module in this arch (e.g. MTP head absent in this transformers) | |
| if skipped: | |
| log(f"[load-packed] {len(skipped)} packed keys have no module in this arch (kept in file, not attached): e.g. {skipped[:3]}") | |
| # 2) load the dense remainder (embed/norms/conv/dt_bias/…) onto meta | |
| dense = {k[len("__dense__"):]: v for k, v in blob.items() if k.startswith("__dense__")} | |
| model.load_state_dict(dense, strict=False, assign=True) | |
| # 3) materialize meta rotary/pos buffers (recomputed from config, never in the checkpoint) by | |
| # re-instantiating their owning module -- LM via text_config, vision via its dim. Any leftover | |
| # meta tensor makes model.to(device) throw "Cannot copy out of meta tensor". | |
| rope = getattr(config, "text_config", None) or config | |
| vcfg = getattr(config, "vision_config", None) | |
| def _set(root, dotted, module): | |
| *ps, leaf = dotted.split("."); p = root | |
| for x in ps: p = getattr(p, x) | |
| setattr(p, leaf, module) | |
| for mn, mod in list(model.named_modules()): | |
| metab = [bn for bn, b in mod._buffers.items() if b is not None and b.is_meta] | |
| if not metab: | |
| continue | |
| cfg_for = vcfg if "visual" in mn else rope | |
| ib = mod._buffers.get("inv_freq") | |
| trials = [lambda: type(mod)(config=cfg_for, device=device), lambda: type(mod)(config=cfg_for), lambda: type(mod)(cfg_for)] | |
| if ib is not None: | |
| dim = 2 * ib.shape[0] | |
| trials += [lambda: type(mod)(dim), lambda: type(mod)(dim=dim), lambda: type(mod)(dim, device=device)] | |
| made = None | |
| for t in trials: | |
| try: made = t(); break | |
| except Exception: continue | |
| if made is not None: | |
| _set(model, mn, made.to(device)) | |
| else: | |
| for bn in metab: | |
| mod._buffers[bn] = torch.zeros(mod._buffers[bn].shape, dtype=torch.float32, device=device) | |
| log(f"[load-packed] WARN zeroed meta {metab} in {mn} (rope may be off)") | |
| model = model.to(device) | |
| log(f"[load-packed] {len(manifest)} resident PackedKTritLinear + {len(dense)} dense tensors") | |
| return model | |
| if __name__ == "__main__": # toy round-trip smoke: packed save/load must be bit-exact | |
| import tempfile | |
| from base3_pack import quantize_ktrit, pack_ktrit | |
| torch.manual_seed(0) | |
| for k, g, blk in [(1, 64, 0), (2, 64, 64), (3, 128, 128)]: | |
| lin = nn.Linear(256, 512) | |
| codes, scale = quantize_ktrit(lin.weight.data, k, g) | |
| b, _, _ = pack_ktrit(codes, k) | |
| pk = PackedKTritLinear(b, scale, 256, k, lin.bias.data.float(), 512, g) | |
| wrapped = _RotatedInput(pk, blk) if blk > 1 else pk | |
| x = torch.randn(4, 256) | |
| y0 = wrapped(x) | |
| # emulate save_packed's per-module capture + load reconstruction | |
| st = {"bytes": pk.bytes.clone(), "scale": pk.scale.clone(), "bias": pk.bias.clone()} | |
| pk2 = PackedKTritLinear(st["bytes"], st["scale"], 256, k, st["bias"], 512, g) | |
| w2 = _RotatedInput(pk2, blk) if blk > 1 else pk2 | |
| y1 = w2(x) | |
| assert torch.equal(y0, y1), f"packed round-trip MISMATCH k{k} blk{blk}" | |
| print(f"k{k} g{g} blk{blk}: packed save/load forward EXACT") | |
| print("========== ktrit_resident round-trip OK ==========") | |