SPB Git

spb/localvm-research Public License

Running LLMs larger than memory on a consumer Mac — falsification-driven research: margin-gated deferred refinement, out-of-core verification on Apple Silicon. TR-01 published.

Python 63.2% JavaScript 23.5% CSS 11.8% Shell 0.9% Makefile 0.5%

expA/expB: normalize per-position energies (f16 overflow), trace at block-16 with derived coarse granularity

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed 5 h ago (Aug 12, 2026) parent 2a8464b

Showing 2 changed files with +15 and −4

modified experiments/micro/expA_weight_concentration/benchmark.py +10 −4
@@ -59,10 +59,12 @@ class DownProjRecorder(nn.Module):
59 59 h = x[0, a:b].astype(mx.float32)
60 60 e = mx.square(h)
61 61 be = e.reshape(h.shape[0], -1, self.block).sum(axis=-1)
62 + # normalize per position: raw energies overflow float16 storage,
63 + # and only relative importance matters for expA/expB
64 + be = be / (be.sum(axis=-1, keepdims=True) + 1e-12)
62 65 mx.eval(be)
63 66 self.block_energy = np.array(be)
64 ne = np.array(e) # (T, D_int) — reduced immediately by caller
65 self.neuron_energy = ne
67 + self.neuron_energy = np.array(e) # (T, D_int) — reduced by caller
66 68 return self.inner(x)
67 69
68 70
@@ -91,7 +93,8 @@ def main() -> None:
91 93 ap.add_argument("--model", default="mlx-community/Qwen3-1.7B-bf16")
92 94 ap.add_argument("--gen-tokens", type=int, default=128)
93 95 ap.add_argument("--per-domain", type=int, default=8)
94 ap.add_argument("--block", type=int, default=64)
96 + ap.add_argument("--block", type=int, default=16,
97 + help="trace granularity; analysis also derives 4x-coarser blocks")
95 98 args = ap.parse_args()
96 99
97 100 domains = json.loads((REPO_ROOT / "benchmarks/datasets/eval_prompts.json").read_text())["domains"]
@@ -140,9 +143,11 @@ def main() -> None:
140 143 P, L, B = all_blocks.shape
141 144 print(f"trace shape {all_blocks.shape}", flush=True)
142 145
143 # expA aggregates at block granularity
146 + # expA aggregates at trace granularity and 4x-coarser derived granularity
147 + coarse = all_blocks.reshape(P, L, B // 4, 4).astype(np.float32).sum(axis=-1)
144 148 per_layer = [concentration_stats(all_blocks[:, li, :].astype(np.float32)) for li in range(L)]
145 149 overall = concentration_stats(all_blocks.reshape(P * L, B).astype(np.float32))
150 + overall_coarse = concentration_stats(coarse.reshape(P * L, B // 4))
146 151 per_domain = {}
147 152 pos_domain = np.concatenate([[ix["domain"]] * ix["n_pos"] for ix in index])
148 153 for dom in domains:
@@ -170,6 +175,7 @@ def main() -> None:
170 175 "manifest": collect_manifest(),
171 176 "config": vars(args),
172 177 "n_positions": int(P), "n_layers": int(L), "n_blocks": int(B),
178 + "coarse_block_granularity": {"block_size": args.block * 4, "overall": overall_coarse},
173 179 "block_granularity": {"overall": overall,
174 180 "per_layer": {str(i): s for i, s in enumerate(per_layer)},
175 181 "per_domain": per_domain},
modified experiments/micro/expB_token_stability/benchmark.py +5 −0
@@ -62,11 +62,16 @@ def main() -> None:
62 62 ap = argparse.ArgumentParser()
63 63 ap.add_argument("--trace", default=None)
64 64 ap.add_argument("--target", type=float, default=0.95)
65 + ap.add_argument("--agg-factor", type=int, default=4,
66 + help="aggregate trace blocks by this factor (16-neuron trace -> 64-neuron sets)")
65 67 args = ap.parse_args()
66 68 trace_path = args.trace or sorted(
67 69 glob.glob(str(REPO_ROOT / "results/expA_weight_concentration/*/block_energy_trace.npz")))[-1]
68 70 z = np.load(trace_path, allow_pickle=False)
69 71 blocks = z["blocks"].astype(np.float32) # (P, L, B)
72 + if args.agg_factor > 1:
73 + P0, L0, B0 = blocks.shape
74 + blocks = blocks.reshape(P0, L0, B0 // args.agg_factor, args.agg_factor).sum(axis=-1)
70 75 domains = z["domains"]
71 76 traj_id = z["traj_id"]
72 77 P, L, B = blocks.shape
73 78