opencoti-llamafile / docs /evaluations /adaptive_compute.md
ManniX-ITA's picture
Upload folder using huggingface_hub
5ef4cc5 verified
|
Raw
History Blame Contribute Delete
9.01 kB
# Adaptive compute β€” depth-skip & dynamic-precision feasibility
> Status: **TRAINING-FREE VARIANTS CLOSED** (2026-06-30). Three cheap PyTorch forward-hook probes
> (S1/S1b/S2) on Gemma-4 A4B establish that *static, predictor-free* compute-skipping and
> dynamic weight-precision have **no headroom** on this model as deployed. One variant is not yet
> ruled out β€” a **trained** Mixture-of-Depths router (Β§6) β€” and is being prototyped. This note is the
> record so the line is not re-litigated from scratch.
This is the *compute-axis* companion to [decode-levers.md](decode-levers.md) (which makes the compute
opencoti *does* run faster) and [poly_kv.md] / [context.md](context.md) (the *KV/memory* axis). Where
those find wins, this documents a **negative result**: you cannot cheaply *remove* compute on A4B.
The motivating idea (user, 2026-06-30): *"I have q8 weights; if I can tell in advance that q4 would
not change an activation meaningfully, I skip the high-precision compute and only activate the neurons
that change something."* Plus the depth-skip cousin: skip whole layers / MLP sub-blocks that contribute
little. The user explicitly distrusted the usual predictor premise (*"'10% of neurons carry 90% of the
mass' β€” I don't think it's ever true"*) β€” and the data backs that distrust.
---
## 1. Prior art (field scan)
| Method | Mechanism | Training? | Batch-friendly? | Note |
|---|---|---|---|---|
| DejaVu | contextual sparsity + low-rank predictor | no (predictor) | **no** | union of active neurons grows with batch |
| PowerInfer | hot/cold neuron split | needs ReLU model | **no** | same batch erosion |
| Mixture-of-Depths (MoD) | router picks top-k *tokens* per layer | **yes** | **yes** (capacity-based) | Router-Tuning = cheap post-hoc variant β†’ Β§6 |
| LayerSkip / SkipDecode | early-exit / per-token depth | **yes** (trained) | SkipDecode yes | needs finetune |
| Any-Precision LLM | MSB-first bitplane nested quant | no (training-free) | yes | exact truncation; no GGUF path |
| DeltaLLM / temporal-delta | reuse previous-step state | no | no | KV-side; no reported wall-clock decode win |
| ProSparse / TurboSparse / CATS | ReLUfication | finetune (CATS near-free) | yes | changes activation fn |
Takeaway going in: the **training-free + batch-friendly** quadrant (what opencoti wants for
[multi-session serving](#)) was empty in the literature. S1–S2 tested whether A4B's own structure
opens it anyway. It does not.
---
## 2. Method
PyTorch forward-hooks on the real **Gemma-4 26B-A4B-it** (bf16, `/srv/ml/models/base/…` on bs2 GPU0;
30 decoder layers, d_model 2816; 3 realistic coding prompts, greedy decode). Architecture-level
property β†’ bf16 weights are representative. Probes are in `.opencoti/dynq/{s1_probe,s1b_precision,
s2_skip}.py`; raw JSON `{s1,s1b,s2}_out.json`. Correctness gate = mean **KL(bf16 β€– condition)** on
gen-position logits (greedy token-match is FP-unstable and inadmissible β€” see bug-270/356).
Notation: `r_layer = β€–h_outβˆ’h_inβ€–/β€–h_inβ€–` (whole-block residual contribution); `r_attn`, `r_mlp` =
sub-block-output / layer-input norm proxies; `cosΞ”h` = cosine of consecutive decode tokens' residual
input; `Ξ”h-sparsity` = fraction of dims for 90% of β€–Ξ”hβ€–Β².
---
## 3. S1 β€” is there a lazy band?
| band | r_attn (p50) | r_mlp (p50) | reading |
|---|---|---|---|
| L0 | 1.76 | 11.9 | embedding bootstrap |
| L3–8 | 0.4–1.3 | 0.19–0.76 | both active |
| **L9–19** | 0.30–0.57 | **0.011–0.051** | MLP near-dead, attention alive |
| L23–28 | 0.53–0.96 | 0.82 β†’ **7.14** | late MLP does the heavy lifting |
- `r_layer` p50 never drops below ~0.26 β†’ **no skippable whole-block dead band.**
- The only lazy region is the **MLP (MoE) sub-block of mid layers ~9–19** (1–5% of residual). Compute is
*back-loaded*: late MLPs explode. This *looked* like a batch-friendly static-skip target β€” Β§5 kills it.
- **Temporal-delta (#4-A) β€” half-refuted.** `cosΞ”h` is high (0.75–0.85) at L10–19, but `Ξ”h-sparsity` is
sparse (2–5% dims) only in *early* layers (L1–9, where cos is low 0.13–0.65) and densifies to 20–40%
exactly where it's stable. The two conditions temporal-delta needs (stability *and* sparse delta)
**anti-correlate**; no general "compute only WΒ·Ξ”h" win. Batch-fragile besides.
---
## 4. S1b β€” can the lazy band run at lower weight precision? (the precision-guard, #4-B)
Mean KL(bf16 β€– cond), MLP weights blockwise-quantized (q4_0/q6_0-style, block 32, symmetric absmax):
| condition | layers | mean KL |
|---|---|---|
| q6_all | 30 | **0.0042** |
| q4_early (0–8) | 9 | 0.0040 |
| q4_late (23–29) | 7 | 0.0135 |
| **q4_mid (9–19)** | 11 | **0.0188** |
| q4_all | 30 | 0.0359 |
Per-layer q4 MLP rel-err *rises* 0.07 (early) β†’ 0.15–0.24 (mid/late).
**Refuted.** q4 on the *lazy* mid-band costs **more** than on the *heavy* late-band β€” the small MLPs are
precision-*sensitive*. Small contribution ⇏ precision-robust; you cannot use "this contributes little"
as a guard for "q4 is safe here." **Premise-breaker:** production opencoti already ships **Q4_K_M** β€” the
idea assumed q8 weights as the expensive baseline to skip down from; there is no q8 compute to elide.
(q6 is ~9Γ— cheaper than q4 in KL, but that points the wrong way β€” more memory, and prod is already q4.)
---
## 5. S2 β€” can the lazy band be skipped? (MoD-static, #3)
Mean KL(bf16 β€– cond), MLP output zeroed via hook (no weight mutation):
- **Single-layer skip:** most mid layers **0.13–0.23** (β‰ˆ10Γ— worse than q4-ing *all* 11 at 0.019). Cheap
singles are scattered (L01 0.028, L04 0.04, L13 0.054). Critical layers: L02 **2.0**, L29 **2.1**,
L26/L28 ~1.4 β€” skipping these alone wrecks the model.
- **Cumulative bands EXPLODE:** mid_9_19 **12.4**, late_23_29 **19.0**, early_0_8 **12.7**, and even the
**10 individually-cheapest layers β†’ 7.27**. Errors **compound super-linearly.**
**Refuted.** The 1–5% mid-MLP contributions are tiny per-step but essential in aggregate; they cannot be
skipped, individually barely and in any band catastrophically. The S1 "batch-friendly mid-MLP static
skip" hope is dead.
---
## 6. Verdict + the one open angle
**The unifying law:** on A4B, a sublayer's small per-step contribution predicts **neither** skippability
(S2) **nor** precision-robustness (S1b). The training-free / predictor-free adaptive-compute family β€”
DejaVu-style sparsity, depth-skip, dynamic weight-precision, temporal-delta β€” has **no headroom** here.
This closes the *compute axis* for "more concurrent agentic sessions per card"; the real headroom stays
on the **KV/memory axis** (turbo/TCQ KV-quant, DCA, PolyKV/SharedKVPool prefix-sharing) + MTP for decode
throughput β€” all shipped or in-flight.
**Caveats (scope of the closure):** greedy-KL on 3 short coding prompts (not RULER/niah) β€” but cumulative
KL 7–19 is far past any rescue threshold; A4B is MoE (the compounding logic is general); the probes test
**static / training-free** skip+precision only.
## 7. Trained MoD router (the open angle) β€” router-only FAILS
`.opencoti/dynq/mod_router.py`: per-layer linear gate on band L9–22, **base frozen**, trained by
self-distillation KL(teacher_full β€– student) with **hard top-k (CAP 0.5) selection in the loop** (kept
tokens scaled by the router sigmoid for gradient, dropped β†’ 0). 48 teacher continuations, 250 steps,
LR 1e-2. Eval = mean KL at hard CAP 0.5.
| config | KL | keep |
|---|---|---|
| pre-train (untrained gate) | 7.00 | 0.50 |
| random 50%-skip control | 4.38 | 0.50 |
| **trained router** | **3.72** | 0.50 |
| (S2 static all-skip mid-band) | 12.4 | β€” |
**Router-only MoD does not work on A4B.** A trained router beats random selection by only ~15% (3.72 vs
4.38) and the absolute KL stays catastrophic (~3.7 β€” ~200Γ— the q4_mid precision baseline of 0.019; any
usable bar is <~0.1). Training KL barely moved (7.3β†’~3.7, noisy/stuck). **There is no 50%-skippable token
subset the frozen network tolerates** β€” *which* tokens you skip barely matters, exactly as S1b/S2 predict
(distributed, compounding contribution).
**Why, and what's left:** classic MoD (Raposo et al.) trains the router *jointly with the whole network
from the start*, so the model learns to route around skips. A post-hoc router on a frozen pretrained base
has no such adaptation, and lands far outside the model's operating distribution. Making MoD work here
would require **full-model (or heavy-LoRA) joint finetuning** β€” the expensive retrain the whole idea was
meant to avoid, and the S1b/S2 compounding evidence makes the payoff doubtful. **Verdict: the entire
training-cheap adaptive-compute line is closed on A4B.** A full MoD finetune remains theoretically open
but is a different, costly project, not pursued.
Other later angles (parked): Any-Precision MSB-first bitplane weights (training-free but no GGUF path);
CATS-style near-training-free activation sparsity (changes the activation function).