## Dekodowanie spekulacyjne

*Model na produkcji*

*Ostatnia zmiana: 29 września 2026*

W dekodowaniu spekulacyjnym tani mechanizm zgaduje kilka następnych tokenów, a duży model sprawdza je w jednym przebiegu i przyjmuje te, które sam by wybrał. Wynik jest taki sam jak bez spekulacji (przy wyborze zachłannym ten sam tekst, przy losowaniu ten sam rozkład), a z jednego czytania wag powstaje kilka tokenów.

**Po ludzku:** Stażysta pisze szkic, a szef czyta i poprawia pierwsze błędne słowo, po czym stażysta pisze dalej. Czytanie idzie dużo szybciej niż pisanie, więc razem kończą wcześniej, a tekst jest taki, jaki napisałby sam szef.

*Interaktywny widżet na stronie: Przejdź trzy rundy i patrz, ile tokenów przyjmuje jedna weryfikacja i ile przebiegów dużego modelu oszczędzasz.*

### Jak działa weryfikacja

- Draft, czyli tani mechanizm zgadujący, proponuje γ tokenów (zwykle kilka). Duży model w jednym przebiegu liczy rozkład dla każdej z tych pozycji, tak jak w prefillu. Przyjmuje najdłuższy zgodny prefiks, w miejscu pierwszej niezgodności wstawia własny token, a przy pełnej zgodności dokłada jeszcze jeden. Każda runda daje więc co najmniej jeden token.
- Weryfikacja jest tania, bo decode jest ograniczony pamięcią: przebieg na pięciu pozycjach czyta te same wagi co przebieg na jednej i trwa prawie tyle samo (zobacz „Czemu GPU się nudzi”).
- Przy losowaniu propozycję x przyjmuje się z prawdopodobieństwem min(1, p(x)/q(x)), gdzie p to rozkład dużego modelu, a q małego. Po odrzuceniu losuje się z różnicy max(0, p − q) po normalizacji. Wynik ma dokładnie rozkład dużego modelu (Leviathan i in.; Chen i in., 2023), a przy wyborze zachłannym tekst jest identyczny, z dokładnością do drobnych różnic numerycznych.

### Od czego zależy zysk

- Przy współczynniku akceptacji α i γ propozycjach runda daje średnio (1 − α^(γ+1)) / (1 − α) tokenów. Dla α = 0,8 i γ = 4 to ok. 3,4 tokenu na przebieg dużego modelu. Zysk czasu jest mniejszy, bo draft też kosztuje, a odrzucone propozycje to zmarnowana praca.
- Akceptacja zależy od tekstu. Kod, JSON, powtórzenia i niska temperatura dają wysokie α, a twórczy tekst przy wysokiej temperaturze niskie. Leviathan i in. zmierzyli przyspieszenie 2–3× na T5-XXL. DeepSeek-V3 podaje 85–90% akceptacji drugiego tokena z modułu MTP i 1,8× więcej tokenów na sekundę.
- Zysk maleje wraz ze wzrostem batcha. Wagi i tak czyta się raz dla całego batcha, więc gdy krok staje się ograniczony mocą obliczeniową, dodatkowe pozycje kosztują realną moc: przy dużym batchu i krótkich kontekstach spekulacja może wyjść na minus. Z KV cache’em jest inaczej, bo każda rozmowa czyta własny. Przy długich kontekstach decode zostaje ograniczony pamięcią nawet przy dużym batchu, a draft, który czyta niewiele z cache’u, nadal podnosi przepustowość (MagicDec: do 2,5× dla Llama 3.1 8B przy batchu 32–256; EAGLE-3: 1,38× przy batchu 64 w SGLang). vLLM poleca spekulację głównie przy niskim i średnim obciążeniu, ale dla EAGLE i MTP podaje średni lub duży zysk także przy dużym.

### Warianty i wybór w praktyce

- Osobny mały model z tej samej rodziny i z tym samym tokenizerem: prosty w użyciu, ale zajmuje pamięć i trzeba go serwować obok dużego.
- Draft dopięty do dużego modelu: dodatkowe głowice przewidujące kolejne pozycje (Medusa), lekka warstwa pracująca na stanach ukrytych dużego modelu (EAGLE, obecnie EAGLE-3) albo moduł MTP wytrenowany razem z modelem, jak w DeepSeek-V3. Zwykle trafia lepiej niż osobny mały model. Wynik jest dokładny tylko przy standardowej akceptacji i niezmienionym dużym modelu: Medusa-2, która dotrenowuje duży model razem z głowicami, i „typical acceptance” z Medusy wymieniają dokładność na szybkość.
- Bez żadnego modelu: dopasowanie n-gramów kopiuje ciąg dalszy z promptu (prompt lookup). Działa przy edycji kodu, RAG i streszczeniach, gdzie odpowiedź powtarza fragmenty wejścia.
- Metodę i γ wybierasz na podstawie α zmierzonego na własnym ruchu i sprawdzasz zysk przy docelowym obciążeniu, a nie na pojedynczym żądaniu. W API dostawców spekulacja zwykle działa niewidocznie. Wyjątkiem są funkcje w rodzaju Predicted Outputs w API OpenAI, gdzie sam podajesz przewidywany tekst, na przykład plik przed edycją (stan na wrzesień 2026: tylko modele GPT-4o i GPT-4.1, bez wywołań funkcji; odrzucone przewidywane tokeny są płatne jak wyjście).

### Sprawdź się

**Pytanie:** Jak działa speculative decoding, czemu nie zmienia wyniku i kiedy przestaje pomagać?

**Krótka odpowiedź:** Tani draft, czyli mały model, dodatkowe głowice albo n-gramy skopiowane z promptu, proponuje kilka tokenów. Duży model sprawdza je w jednym przebiegu, bo decode jest ograniczony pamięcią i kilka pozycji kosztuje prawie tyle co jedna. Przyjmuje zgodny prefiks, a w miejscu pierwszej niezgodności wstawia własny token. Akceptacja z prawdopodobieństwem min(1, p/q) i losowanie z max(0, p − q) po odrzuceniu gwarantują dokładnie rozkład dużego modelu. Zysk zależy od trafności: 2–3× przy przewidywalnym tekście i małym batchu, mniej przy większym, a zero albo strata, gdy krok jest już ograniczony mocą obliczeniową (duży batch, krótkie konteksty).

### Pytania pogłębiające

- **Kiedy spekulacja nie pomaga albo szkodzi?** Przy niskiej akceptacji, czyli przy twórczym tekście, wysokiej temperaturze albo drafcie trenowanym na innych danych. Także gdy krok jest już ograniczony mocą obliczeniową, czyli przy dużym batchu i krótkich kontekstach: weryfikacja odrzuconych tokenów zabiera wtedy moc innym rozmowom.
- **Czemu rozkład wyniku jest dokładnie taki jak u dużego modelu?** Token x przechodzi z prawdopodobieństwem min(1, p(x)/q(x)), a po odrzuceniu losuje się z max(0, p − q) po normalizacji. Suma obu dróg daje dla każdego tokena dokładnie p(x). W praktyce dochodzą tylko drobne różnice numeryczne z innego kształtu obliczeń.
- **Akceptacja wynosi 0,6 przy γ = 5. Zwiększasz γ?** Raczej zmniejszasz. Runda daje średnio (1 − 0,6⁶) / 0,4 ≈ 2,4 tokenu, a przy γ = 3 już ≈ 2,2, więc dwie dodatkowe propozycje prawie nic nie dodają, a kosztują draft i weryfikację. Większy zysk da lepszy draft, na przykład dotrenowany na własnym ruchu.
- **Czy draft musi mieć ten sam tokenizer co duży model?** W klasycznym wariancie tak, bo porównuje się tokeny i rozkłady na tym samym słowniku. Dlatego draft bierze się z tej samej rodziny modeli albo dopina się głowice do samego dużego modelu. Nowsze serwery łagodzą ten wymóg: vLLM łączy draft i duży model z różnymi słownikami przez mapowanie tokenów (use_heterogeneous_vocab, stan na wrzesień 2026 tylko z zachłannym draftem).

### Źródła

- [Leviathan i in.: Fast Inference from Transformers via Speculative Decoding (ICML 2023)](https://arxiv.org/abs/2211.17192)
- [Chen i in.: Accelerating LLM Decoding with Speculative Sampling (2023)](https://arxiv.org/abs/2302.01318)
- [Li i in.: EAGLE-3 (2025)](https://arxiv.org/abs/2503.01840)
- [Sadhukhan i in.: MagicDec, spekulacja przy dużym batchu i długim kontekście (2024)](https://arxiv.org/abs/2408.11049)
- [vLLM: Speculative Decoding](https://docs.vllm.ai/en/latest/features/speculative_decoding/)

Strona interaktywna: https://howaiworks.dev/pl/spec/
