Qwen3.8-27B na RTX 3090

Dziennik eksperymentów optymalizacyjnych: tok/s vs degradacja jakości. Aktualizowane na żywo z prawdziwych pomiarów.
GPU RTX 3090 24GB Model Qwen3.8-27B Q4_K_M (gguf) llama.cpp b9349 Kontekst 131072 KV q8_0

Baseline (bez spekulacji)

39.9 tok/s
mediana 3 przebiegów

Optimum — MTP n=2

54.5 tok/s
+37% vs baseline, do +64% w kodzie

Eksperymenty tok/s

KonfiguracjaMedianaŚredniavs baselineUwagi
Baseline (sampling, bez spec)39.91.00×punkt odniesienia
--spec-type draft-mtp -n 254.5+37%sweet spot; kod +64%
--spec-default (ngram) + mtp54–6071+36…51%wysoka wariancja, kod 105–135
MTP n=352.552.7+32%gorszy niż n=2 — za dużo weryfikacji

Wnioski z eksperymentów

1. MTP działa — i jest najlepszy

Natywny draft-mtp (heady next-token modelu) daje +37% tok/s przy zerowej degradacji jakości. Acceptance rate w kodzie: 0.55–0.92. Wyższe n nie pomaga — n=2 to optimum, n=3 dodaje koszt weryfikacji bez zysku z akceptacji (52.5 vs 54.5 tok/s).

2. ngram-mod (--spec-default) — darmowy boost do kodu, ale szumi

Dodaje drugi mechanizm spekulacji (ngram-match w historii). Na kodzie 105–135 tok/s (vs 65 mtp-only), ale na prozie wariancja jest duża (44–60). Jeśli serwer obsługuje głównie kod — warto; mieszane obciążenie — mały zysk.

3. KV q8_0 — darmowa oszczędność VRAM, zero degradacji

Perplexity na korpusie 297 KB (BDH paper, ctx 8192): f16 = 6.3356, q8_0 = 6.3300 (−0.09%, w granicach szumu), q4_0 = 6.3463 (+0.17%, także w granicach błędu ±0.086). Kwantyzacja KV cache jest praktycznie bezstratna — q8_0 używane produkcyjnie.

Jakość — perplexity (KV q8 vs q4 vs f16)

Konfiguracja KVPPLvs f16Wniosek
f16 (referencja)6.3356pełna precyzja
q8_0 6.3300−0.09%szum pomiarowy — zero degradacji
q4_06.3463+0.17%w granicach błędu ±0.086

Korpus: 297 KB (artykuł naukowy, en), ctx 8192, flash-attn on, t=16. Przedział błędu ±0.086 sprawia, że różnice między wszystkimi wariantami są nieistotne statystycznie. Wniosek: KV cache można bezpiecznie kwantyzować — q8_0 wybrane produkcyjnie jako kompromis.

Seed-match: MTP nie zmienia dystrybucji

Ten sam --seed 42 + ten sam prompt: 406 znaków wspólnych (cały private-think identyczny), rozjazd dopiero w samplowaniu treści — MTP inaczej zużywa RNG, ale z tej samej dystrybucji. Speculative decoding jest dystrybucyjnie transparentny: MTP zmienia tylko prędkość, nie jakość.

Konfiguracja produkcyjna

llama-server -m /data/models/qwen3.8/Qwen3.8-27B-Q4_K_M.gguf \
  --host 127.0.0.1 --port 8080 -ngl 99 -t 16 \
  -c 131072 --no-context-shift --flash-attn on \
  --cache-type-k q8_0 --cache-type-v q8_0 \
  --jinja --reasoning-format deepseek \
  --temp 0.7 --top-p 0.80 --top-k 20 --min-p 0.0 --presence-penalty 1.5 \
  --spec-type draft-mtp --spec-draft-n-max 2 -np 1

VRAM — budget

  • Model + ctx 128K + KV q8: ~22.0 GiB
  • MTP context (n=2): +761 MiB
  • Wolne: ~1.0–1.8 GiB (n=3 może OOM przy pełnym kontekście)

What is MTP?

Multi-Token Prediction: wbudowane "głowice" w modelu przewidują 2 kolejne tokeny. Spekulacyjna dekodacja weryfikuje drafty jednym przejściem — stąd zysk. Model ma wagi MTP wbudowane w GGUF (wariant unsloth) — --spec-type draft-mtp je używa bez pobierania osobnych plików.

Plany / next