0.2.2 — speculative decode that pays, and ships
Speculative decode with the model's own draft head now gives a measured +24% decode on a quiet 48 GB Mac (10.3 → 12.8 tok/s at the 122 experts/layer auto plans with the head on; ×1.33 on a code prompt, ×1.19 on a list, ×1.18 with the server's default sampling), and pull fetches the head, so --mtp auto works out of the box. Everything below is measured on the released binaries, five interleaved pairs per number; MEASUREMENTS.md M9 has the method.
- The draft head ships with the weights.
mtp.safetensors(1.47 GB, sha256-pinned) is hosted on the weights mirror and pulled with everything else, as the manifest's one optional file: a source without it leaves the pull green with a notice,pull --verifyskips it when absent, and the startup check never asks to repair it. The weights are 105.3 GB in 25 files. - A rejected draft no longer re-runs the kept tokens. The verify pass records the recurrent state after every position (the GDN recurrence stepped one token at a time, bit-identical to the fused kernel), so a rejection rolls back for free. This is what turned the head from break-even into a gain: at 57 experts/layer one draft went ×1.12 → ×1.20; at 122, ×1.17 → ×1.24 (two drafts ×1.27).
- Default draft depth is 1 (was 4). Four drafts lose at every size measured, including ×0.88 where auto turns the head on; one draft is the best or tied-best everywhere and wastes the least on a rejection.
SLOTSTREAM_DRAFT_DEPTHstill overrides. - The numbers are honest now. The ×1.5–1.9 the 0.2.0 docs projected assumed a five-token verify pass costs one token's pass; new hidden
mtp-passcostmeasured 1.65 (a sixth of a pass per extra token), and the plateau A/B that was "pending" has run. Auto's threshold reads 28 GB, not ~26. - Gates.
mtp-checknow bounds the reused speculative state's logits by the plain re-chunking band (theprefix-checkmethod) instead of comparing liveness, proves the recording pass exact against the batched one, and checks a rollback state-by-state against the plain path.mtp-bench --samplemeasures the sampled case.
Below a 28 GB target nothing changes: auto keeps the head off there, where it would lose, and every install without the head runs exactly as before.
Built by CI from commit 4a8dcbe (build log: https://github.com/carloslfu/slotstream/actions/runs/33650634699).
sha256: 2f459ece57e3ccfe3bf34abf9ae268c29161295b2f2a3f6a5a58e50a8b6b6c47
Verify provenance: download slotstream-arm64.tar.gz, then: gh attestation verify slotstream-arm64.tar.gz --repo carloslfu/slotstream
Install or upgrade: curl -fsSL https://raw.githubusercontent.com/carloslfu/slotstream/main/install.sh | sh