Strona główna / Rozdział 7 · Model na produkcji
Ostatnia zmiana · 5 min czytania
Dekodowanie spekulacyjne
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 ludzkuStaż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.
Przejdź trzy rundy i patrz, ile tokenów przyjmuje jedna weryfikacja i ile przebiegów dużego modelu oszczędzasz
Propozycje i trafienia dobrane ręcznie. Przebieg małego modelu liczony jako 1/10 przebiegu dużego, a przebieg weryfikujący kilka tokenów tyle samo co zwykły.
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ę
Jak działa speculative decoding, czemu nie zmienia wyniku i kiedy przestaje pomagać?
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).
In English
A cheap drafter, such as a small model, extra heads or n-grams copied from the prompt, proposes several tokens. The large model checks them in one pass, because decode is memory-bound and several positions cost about as much as one. It keeps the matching prefix and inserts its own token at the first mismatch. Accepting with probability min(1, p/q) and resampling from max(0, p − q) after a rejection guarantees exactly the large model’s distribution. The gain depends on the acceptance rate: 2–3× on predictable text at small batch sizes, less as the batch grows, and nothing or a loss once the step is compute-bound (large batch, short contexts).
Pytania pogłębiające (4)
- 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).