Holo3 · where prefill time actually goes

measured per-operation breakdown of CPU prefill vs context depth

The measured answer — ms per token, by operation, as context grows

0 4 8 12 16 20 0k 8k 16k 24k 32k 40k attention core overtakes FFN/MoE → L≈13.6k context depth L (tokens already in KV when the next 512-token chunk is prefilled) prefill time per token (ms) attention core (QKᵀ·softmax·V) norms / embed / LM head Q/K/V/O projections Gated-DeltaNet recurrence FFN / MoE experts

Flat bands (FFN/MoE, projections, Gated-DeltaNet recurrence, norms) are per-token constant — they cost the same whether the new chunk sits at depth 0 or 40k. Only the attention core rises, because each new token's flash-attention sweeps the growing KV of the 10 full-attention layers — while the 30 Gated-DeltaNet layers carry an O(1) state and stay flat regardless of depth. The dashed line marks where the rising attention band overtakes FFN/MoE.

dominant cost at shallow depth (~4k)
FFN / MoE experts
attention-core crossover
L ≈ 13.6k tokens
dominant cost at deep context (40k)
attention core (QKᵀ·softmax·V)

The crossover, made literal — each band as its own line

0 1 2 3 4 5 6 7 8 9 10 11 12 13 0k 8k 16k 24k 32k 40k ms / token

Same data, un-stacked. The attention-core line climbs from 0.11 ms/tok at depth 0 to 12.66 ms/tok at 40k and crosses the flat FFN/MoE line (4.26 ms/tok) at L ≈ 13.6k tokens. Below the crossover the model is FFN/MoE-bound; above it, attention-bound — the regime almost every multi-step OSWorld task lives in once a few screenshots accumulate.

Per-depth table (subsampled)

depth Ltotal ms/tokFFN / MoE expertsGated-DeltaNet recurrenceQ/K/V/O projectionsnorms / embed / LM headattention core (QKᵀ·softmax·V)
0.0k8.194.093.170.620.210.11
2.5k9.094.133.230.630.200.89
5.1k9.814.133.190.630.201.65
7.6k10.744.203.260.640.202.43
10.2k11.474.183.240.630.203.21
12.8k12.314.213.260.630.204.00
15.3k13.144.263.220.640.204.82
17.9k14.254.373.310.660.215.71
20.4k14.744.293.240.640.216.36
23.0k15.724.273.350.650.217.24
25.6k16.534.263.360.650.218.04
28.1k17.224.253.250.650.218.85
30.7k17.894.243.240.650.219.55
33.2k18.834.253.310.650.2110.41
35.8k19.634.253.260.650.2111.26
38.4k20.454.273.280.650.2112.04
40.4k21.174.263.380.650.2112.66

How this was measured (and what each number is)

model Holo3-35B-A3B.i1-Q4_K_M.gguf · n_ctx 41984 · ubatch 512 · 80 depths to 40k · cycles 3

Measured on wuklab-NUC16 (Core Ultra 7 356H, CPU-only) via llama.cpp cb_eval per-node timing · raw per-node JSON + categoriser in the run folder · 🤖 Generated with Claude Code