v0.1.0-alpha.11 — release-hygiene cleanup (--int8-kv off, perf re-baseline)
Pre-release
Pre-release
What this release is
Release-hygiene cleanup. No throughput changes; no kernel work. Two honesty fixes that close known user-facing footguns:
--int8-kvflag is warned-and-ignored. The INT8 KV path has been half-implemented since alpha.2/3 — setting the flag either produced numerical garbage or hung on medium-length prompts. CLI now warns and runs with FP16 KV. Proper INT8 implementation tracked separately under Path I.- Performance numbers re-baselined honestly. The 'Decode: 9.1 tok/s' figure had carried through 6 releases without re-measurement; today's measurement is 10.0 tok/s on the same short-prompt baseline. README perf table also gains a serving-realistic second row.
--int8-kv triage
| Symptom | Root cause |
|---|---|
| Hangs on 57+ token prompts | flash_attention_prefill_batched unconditionally fell back to N sequential decode calls when kv_int8=true (attention.cu:285) |
| Numerical garbage output | flash_attention_decode_kernel got kv_scales=nullptr → defaulted scale=1.0 when dequantizing INT8 |
| Lost scales | fp16_to_int8 called with nullptr scale output and rows=1 (should be rows=n_kv_heads) |
alpha.11 stops the silent-broken behavior. Proper fix needs:
- Per-
(layer, pos, kv_head)scale storage inKVCachePool(~2.25 MB additional) - Wire scales through
fp16_to_int8+flash_attention_decode+flash_attention_prefill_batched - Path F save/load (#46–#51) must persist the scales region too, or invalidate caches when
kv_int8toggles - Quality eval (perplexity holdout) before flipping default
That's ~1–2 days careful work — tracked separately.
Honest performance baseline (Jetson Orin Nano Super 8 GB, 25 W MAXN SUPER, 918 MHz)
| Shape | Prefill | TTFT | Decode |
|---|---|---|---|
| 33-tok cold (canonical short prompt) | 38.8 tok/s | 859 ms | 10.0 ± 0.005 tok/s |
| 57-tok prefill + 200-tok sustained decode (longer-prompt realistic) | 40.8 tok/s | 1410 ms | 9.5 tok/s |
Two rows because they answer different questions. The 33-tok row is the apples-to-apples comparison vs alpha.2 → alpha.10 baselines. The 57-tok row captures dispatcher amortization on longer prompts (prefill rate goes up a bit) and attention growth with KV context length (decode rate dips slightly).
vs llama.cpp's pp18 = 17.97 ± 0.65 tok/s and tg64 = 6.33 ± 0.25 tok/s: we still lead +115 % prefill / +50 % decode on the canonical short prompt.
Cumulative since alpha.2
| alpha.2 | alpha.11 | Δ | |
|---|---|---|---|
| Prefill (33-tok cold) | 8.2 tok/s | 38.8 tok/s | +373 % |
| Decode | 7.5 tok/s | 10.0 tok/s | +33 % |
| Cold TTFT | 2200 ms | 859 ms | −61 % |
| Warm-turn TTFT (Path F) | n/a | 444 ms | new in alpha.9 |
| Cache safety (Path F5) | n/a | 1 GB LRU cap | new in alpha.10 |
Not in this release
- Path I — proper INT8 KV. Next planned phase. Will land after a quality eval pass.
- Path G G2-full (Q6_K uint16 weight loads). G2-lite (#60) measured −0.09 tok/s, closed as no-op. G2-full needs layout redesign for ~+1 tok/s decode; not committed.
- Streaming (#5). The actually-biggest user-perceived improvement still ahead — doesn't change tok/s but makes TTFT feel near-zero. Open in the alpha-track queue.
- Cosmetic post-hydrate
Prefill: N tokenslog over-reporting (counts hydrated tokens in N).