Skip to content

v0.1.0-alpha.11 — release-hygiene cleanup (--int8-kv off, perf re-baseline)

Pre-release
Pre-release

Choose a tag to compare

@ai-hpc ai-hpc released this 16 May 04:56
· 137 commits to main since this release
fa905f5

What this release is

Release-hygiene cleanup. No throughput changes; no kernel work. Two honesty fixes that close known user-facing footguns:

  1. --int8-kv flag 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.
  2. 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 in KVCachePool (~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_int8 toggles
  • 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 tokens log over-reporting (counts hydrated tokens in N).