Code / experiments/micro/expH_capture_cost_frontier/hypothesis.md

experiments/micro/expH_capture_cost_frontier/hypothesis.md 122 lines
---
project: modelmap
document: expH_capture_cost_frontier — hypothesis (run #1, registered before run)
author: Simon-Pierre Boucher
contact: contact@spboucher.ai
website: https://modelmap.io
created: 2026-08-12
modified: 2026-08-12
status: reviewed
---

# Hypothesis — expH run #1 (storage formats + hook overhead)

> Capture cost frontier — what can you map on which Mac (macOS-specific).
> Run #1 scope: (A) activation-store formats on APFS, (B) capture/hook
> overhead in MLX vs PyTorch-MPS on a synthetic transformer. Registered
> 2026-08-12 **before** the first benchmark execution.

```text
Hypothesis              : (A) For the SAE-shuffle access pattern (random row
                          batches), raw np.memmap sustains ≥ 2× the read
                          throughput of chunked zarr on APFS (warm cache),
                          because dense fp16 activations gain little from
                          compression while chunk decode adds latency.
                          (B) Activation capture (retain per-layer outputs)
                          costs < 2× plain inference on both MLX and
                          PyTorch-MPS at the 12-layer/d1024 scale, and the
                          device→CPU copy + disk write — not the hook/retain
                          mechanism — dominates capture cost.

Falsification criterion : (A) dies if zarr (any codec) matches or beats mmap
                          on random-batch reads (ratio < 1.25×).
                          (B) dies if retain-only capture overhead exceeds
                          2× plain inference on either backend; the "capture
                          is cheap on consumer Macs" premise dies at > 3×
                          including copy+write.

Method                  : Storage: 100k rows × 4096 dims fp16 (~0.8 GB) per
                          format (raw mmap, safetensors-mmap, zarr zstd, zarr
                          uncompressed); sequential write; sequential scan;
                          random-batch reads (4096 rows/batch, SAE-shuffle
                          pattern); 3 repeats/cell. Compute: synthetic
                          pre-norm transformer (12 layers, d_model 1024,
                          4 heads, seq 512, batch 8, fp16) implemented
                          identically in torch-MPS and MLX; modes = plain /
                          retain-on-device / retain+CPU-copy+mmap-write;
                          20 timed forwards (10 for write mode), 3 repeats,
                          explicit device synchronization.

Baseline / null         : plain forward (no capture) per backend; sequential
                          scan as the reference for random-read degradation.

Result                  : (pending)

Interpretation          : (pending — with explicit confidence level)

Next experiment         : (pending)
```

**Known limitations, declared in advance.** Warm-cache regime (the 0.8 GB
store fits in the unified buffer cache): read numbers upper-bound the cold
case; a purge/F_NOCACHE cold pass is a registered follow-up (run #2), and the
sister project's cold-cache NVMe ceiling (localvm expH: ~13.1 GB/s at
≥256 KiB, QD≥4) bounds what run #2 can find. Synthetic model ≠ real
checkpoint: run #3 will repeat mode timings on a real 0.5B model via mlx-lm.

---

# Hypothesis — expH run #2 (cold-cache storage, second hardware)

Registered 2026-08-12 **before** the run. Host: MacLustr node M3U96a
(Mac Studio, 32 cores, 96 GB), where `sudo purge` empties the unified buffer
cache between repetitions — also our first cross-hardware replication point.

```text
Hypothesis              : The warm-cache format ordering survives cold:
                          raw mmap sustains ≥ 1.5× zarr-uncompressed on
                          random-batch reads with a purged cache; absolute
                          throughputs drop for all formats; zarr-zstd's
                          relative gap narrows (decode overlaps disk IO)
                          but does not close.
Falsification criterion : Dies if any zarr variant matches or beats mmap
                          cold (ratio < 1.25×) — that would rehabilitate
                          chunked stores and overturn run #1's design call.
Method                  : Same grid as run #1 Part A, store enlarged to
                          200k×4096 fp16 (~1.6 GB), `sudo purge` before
                          every timed read repetition, 3 repeats/cell,
                          writes measured warm (unchanged claim).
Baseline / null         : run #1 warm numbers on M5 Max; sequential scan
                          as the random-read reference.
Result                  : (pending)
Interpretation          : (pending)
Next experiment         : (pending)
```

---

# Hypothesis — expH run #3 (real quantized checkpoint via mlx-lm)

Registered 2026-08-12 **before** the run. Local M5 Max, model =
mlx-community Qwen3-0.6B (4-bit), capture by wrapping decoder layers.

```text
Hypothesis              : On a real 0.6B 4-bit model under MLX, per-layer
                          residual retention costs ≤ 1.15× plain prefill
                          (lazy-graph retention, as in run #1's synthetic
                          result), and retention + NumPy conversion + mmap
                          write stays ≤ 1.5×.
Falsification criterion : Dies at retain > 1.5× or retain+write > 2× —
                          would mean synthetic overheads do not transfer to
                          real checkpoints and all run #1 Part B numbers
                          must be re-derived on real models.
Method                  : Prefill of a fixed 1024-token prompt, batch 1,
                          10 timed forwards after 3 warmups, 3 repeats;
                          modes = plain / retain-all-layers / retain+write;
                          mx.eval barriers around each forward.
Baseline / null         : plain prefill throughput (tok/s).
Result                  : (pending)
Interpretation          : (pending)
Next experiment         : (pending)
```