emerging.systems / README.md
compunerd's picture
Report throughput in consistent units
b582a21
|
Raw
History Blame Contribute Delete
4.89 kB
---
title: Phox Wave-Rider Brain
emoji: 🌀
colorFrom: gray
colorTo: purple
sdk: gradio
pinned: false
short_description: Transformer forward pass as one equilibrium, int8 on CPU
---
# Phox — Wave-Rider Inference Engine
A transformer forward pass expressed as a **single equilibrium** rather than a
stack of layers, running int8-resident on a CPU. Every operation has a wave
form, and each one is measured against the reference rather than asserted.
**Model:** Llama-3.2-3B (Hermes-3-Llama-3.2-3B-abliterated) — 28 layers,
D=3072, 3.21B parameters. Weights quantised to int8 with per-output-column
scales: **2.82 GB, fully resident**, widened to f32 inside AVX2 registers so the
padding is never written to memory.
## Verified
| claim | measurement |
|---|---|
| Full forward in wave form | **5/5 identical token IDs** vs reference, 28 layers |
| The forward pass is ONE fixed point | Jacobi (unsequenced) and Gauss-Seidel reach identical logits — **error 0.000e+00** at the critical path |
| RMSNorm == saturable gain medium | direction cosine **1.000000000000** — an identity, not a fit |
| softmax == amplification + power pool | **1.3e-07** rel-err |
| RoPE == free-running oscillator phase | **2.6e-08** rel-err |
| Amplitude coupling reproduces `W·x` | **3.2e-08**; phase-only Kuramoto **9.75e-01** — the encoding is load-bearing |
| int8 per-column fidelity | y cosine **0.999949**; tokens unchanged through all 28 layers |
| Throughput | **1.43 tok/s** (0.70 s/token) — see the note below; this is NOT a speedup |
## Honest limitations
- **It performs matmuls.** The wave form is an *equivalence proof* about the
arithmetic, not a substitute for it: relaxation converges to `W·x`, which is a
value you have already computed. There is no speedup from the physics.
- **And there is no speedup at all, against a real baseline.** On this same
machine, CPU-only, same model family, in the same units:
| | tok/s | s/token |
|---|---|---|
| this engine (int8, 2.82 GB) | **1.43** | 0.70 |
| llama.cpp (Q4_K_M, 1.87 GiB) | **3.02** | 0.33 |
We are **2.1x slower than llama.cpp**. Earlier drafts framed this as "68 s -> 0.7 s"; that
68 s was an unoptimised numpy path re-reading 6.4 GB from disk per token, i.e.
our own worst case, and quoting it as a baseline was not honest. The work here
bought a *correct and resident* int8 CPU engine, not a fast one. The value is
in the equivalence proofs and the negative results, not the throughput.
- **Ternary does not work.** Measured engine-free against real weights on both
Llama-3.2-3B and Gemma-4-12B: y cosine **0.877** against int8's **0.99995**.
Per-column scaling rescues int2 relative to a global scale (0.52 vs 0.036) but
neither is usable. Quantisation fidelity turns out to be a property of the bit
width rather than the model — the two families agree to three decimals at
every width tested.
- **Scale is unproven.** Verified on 3B. The 12B needs int4 (5.45 GB) and does
not fit in this machine's free RAM.
- **This Space ships no weights.** The dashboard renders and the visualisation is
wired, but the engine cannot start without a local model. Build the cache with
`bqsm_int8.py --build` on a machine that has one.
- **The tokenizer is whitespace-split, not BPE**, so punctuation and rare words
are spelled character by character. `bqsm_tokenizer.py` implements real
byte-level BPE but is not yet wired in.
- **The SRP popcount readout was removed.** Once the bf16 kernel did the dense
vocabulary scan in ~60 ms, SRP was both slower (82–159 ms) and approximate —
512-bit Hamming distances tie heavily, and a true argmax with 884 tokens
strictly closer had 1,135 tied-or-closer, falling outside k=1024.
- Training, backprop, cross-request batching, and sampling above greedy argmax
are not addressed.
## Architecture notes
The forward pass is a DAG of **311 blocks with a critical path of 227** — so the
available parallelism is **1.37×**, and 171 of those depth levels are strictly
serial. Depth is irreducible: 757 data-dependent nonlinearities (RMSNorm, the
saturating gate, softmax) break matrix associativity at every stage. Remove them
and all 28 layers collapse into a single 128256×3072 matrix that computes
nothing interesting.
At one token the arithmetic intensity is **1.78 FLOP/byte** — memory-bound by
roughly 6×. Fusing 197 matrix-vector products down to 113 moves zero bytes.
Only fewer bytes per weight, or more work per byte (batching), change the time.
## Running locally
```bash
python3 bqsm_assist/bqsm_int8.py --build # quantise once, ~2.82 GB
python3 bqsm_assist/bqsm_int8.py --n 5 --verify # check against golden tokens
python3 phoenix_dashboard.py # dashboard on :8765
```
Code: [github.com/compunerd/basin-quotient-machine](https://github.com/compunerd/basin-quotient-machine)