Robocikowo>ROBOCIKOWO
Wnioskowanie

Decode

2020AktywnyOpublikowano: 29 września 2026Aktualizacja: 29 września 2026Opublikowany
Decode to autoregresyjna faza inferencji LLM: generowanie tokenów po jednym, gdzie każdy krok korzysta z KV cache i wyznacza opóźnienie międzytokenowe (ITL) oraz przepustowość generacji.
Kluczowa innowacja
Wyodrębnienie autoregresyjnej fazy inferencji LLM, w której tokeny generuje się pojedynczo — każdy krok czyta cały KV cache i wszystkie wagi modelu, by wyprodukować jeden token, co czyni fazę ograniczoną przepustowością pamięci (memory-bound), przeciwieństwo compute-bound prefill.
Kategoria
Wnioskowanie
Poziom abstrakcji
Wzorzec
Poziom operacji
InferencjaUdostępnianie
Zastosowania
Autoregresyjna generacja tekstu token po tokenieWyznaczanie opóźnienia międzytokenowego (ITL) i przepustowościContinuous batching wielu zapytań dla lepszego wykorzystania GPUSpeculative decoding przyspieszające fazę decodeRozdzielenie decode na osobne węzły (disaggregated serving)

Jak działa

W fazie decode model wykonuje jeden przebieg forward na jednym tokenie (ostatnio wygenerowanym). Dla warstw uwagi nowy token oblicza swój wektor zapytania (Q) i wykonuje uwagę względem kluczy i wartości wszystkich poprzednich tokenów pobranych z KV cache; jego własne K, V dopisuje się do cache. Reszta warstw (MLP, projekcje) przetwarza pojedynczy wektor. Model produkuje rozkład następnego tokenu, próbkuje go i powtarza krok, aż do tokenu końca lub limitu długości. Ponieważ operacje dotyczą jednego tokenu (małe mnożenia macierz-wektor), jednostki obliczeniowe są słabo wykorzystane, a czas kroku zdominowany przez odczyt wag i KV cache z pamięci (memory-bound). Batching wielu zapytań i większe KV cache zwiększają arytmetyczną intensywność i przepustowość.

Rozwiązany problem

Po zbudowaniu kontekstu w fazie prefill model musi generować kolejne tokeny sekwencyjnie, bo każdy token zależy od poprzednich. Faza decode realizuje to efektywnie: zamiast przeliczać uwagę dla całej sekwencji, korzysta z zapisanego KV cache i przetwarza tylko jeden nowy token na krok. Ponieważ na każdy token trzeba wczytać z pamięci wszystkie wagi modelu i cały KV cache, przy jednym zapytaniu faza jest ograniczona przepustowością pamięci, a nie mocą obliczeniową.

Kluczowe mechanizmy

Krok autoregresyjny na jednym tokenie (macierz-wektor)
Uwaga względem KV cache i dopisanie nowych K, V
Próbkowanie tokenu (greedy, top-k, top-p, temperatura)
Continuous batching wielu zapytań
Speculative decoding (wiele tokenów na jeden przebieg weryfikacji)

Mocne strony i ograniczenia

Mocne strony
✓Wykorzystuje KV cache, unikając przeliczania kontekstu
✓Generacja token po tokenie z pełną kontrolą próbkowania
✓Amortyzacja odczytu wag przez continuous batching
✓Podatna na przyspieszenie speculative decoding
✓Łatwo optymalizowalna kwantyzacja wag i KV cache
Ograniczenia
✗Faza memory-bound: prędkość ograniczona przepustowością pamięci
✗Niedowykorzystanie GPU przy małym batchu (macierz-wektor)
✗Sekwencyjna z natury (każdy token zależy od poprzedniego)
✗KV cache rośnie liniowo z długością i liczbą zapytań
✗Długi kontekst zwiększa ruch pamięci na token

Komponenty

Krok autoregresyjny (jeden token)Produkcja jednego kolejnego tokenu

Przebieg forward na pojedynczym tokenie, generujący rozkład następnego tokenu; operacje typu macierz-wektor o niskiej intensywności arytmetycznej.

Odczyt i aktualizacja KV cacheWykorzystanie kontekstu bez przeliczania

Uwaga nowego tokenu względem wszystkich zapisanych kluczy i wartości; dopisanie własnych K, V do cache w każdym kroku.

Próbkowanie tokenuSterowanie generacją i losowością

Wybór następnego tokenu z rozkładu (greedy, top-k, top-p, temperatura) i podanie go jako wejście kolejnego kroku.

Implementacja

Pułapki implementacyjne
Niedowykorzystanie GPU przy małym batchuWysoka

Przy jednym lub kilku zapytaniach operacje macierz-wektor słabo obciążają jednostki obliczeniowe, marnując potencjał FLOPs GPU.

Rozwiązanie:Stosuj continuous batching, aby łączyć wiele zapytań i podnieść intensywność arytmetyczną oraz przepustowość.
Rozrost KV cache przy długim kontekścieŚrednia

KV cache rośnie liniowo z długością sekwencji i liczbą zapytań, co przy długich kontekstach staje się wąskim gardłem pamięci.

Rozwiązanie:Użyj PagedAttention, kwantyzacji KV cache lub uwagi grupowej (GQA/MQA), by ograniczyć zajętość pamięci.

Ewolucja

Oryginalny paper · 2023 · SOSP 2023 · Woosuk Kwon
Efficient Memory Management for Large Language Model Serving with PagedAttention
Woosuk Kwon, Zhuohan Li, Siyuan Zhuang, Ying Sheng, Ion Stoica
2020
Rozróżnienie faz prefill i decode w serwowaniu autoregresyjnym
Punkt przełomowy

Upowszechnienie generatywnych transformerów uwidacznia memory-bound charakter fazy decode i rolę KV cache.

2023
Continuous batching i speculative decoding

Continuous batching (Orca, vLLM) i speculative decoding zwiększają przepustowość oraz redukują opóźnienia fazy decode.

Hiperparametry (konfigurowalne osie)

Rozmiar batchaWysoka

Liczba równoczesnych zapytań; większa amortyzuje odczyt wag i podnosi przepustowość.

1Najniższa intensywność arytmetyczna, memory-bound.
32-256Serwowanie wysokoprzepustowe (continuous batching).
Parametry próbkowaniaŚrednia

Strategia i parametry wyboru tokenu: temperatura, top-k, top-p.

temperature=0Deterministyczne (greedy).
top-p=0.9Próbkowanie nucleus.

Złożoność obliczeniowa

Charakterystyki obliczeniowe
→Faza memory-bound (niska intensywność arytmetyczna)
→Jeden token na krok, operacje macierz-wektor
→Odczyt wszystkich wag i KV cache na każdy token
→Wyznacza ITL (inter-token latency) i tokeny/s
→Przepustowość rośnie z batchingiem

Złożoność czasowa: O(N d) na token (uwaga po KV cache) + O(d^2) projekcje. Złożoność przestrzenna: O((N + t) x L x d) na rosnacy KV cache.

Uwagi do benchmarku

Przy pojedynczym zapytaniu teoretyczna górna granica prędkości decode to (przepustowość pamięci) / (rozmiar wag + KV cache na token); np. model 13B w FP16 (~26 GB) na karcie o przepustowości ~1 TB/s daje rzędu kilkudziesięciu tokenów/s. Continuous batching może zwiększyć łączną przepustowość systemu wielokrotnie, amortyzując odczyt wag na wiele równoczesnych zapytań.

Wąskie gardło obliczeniowe

Przepustowość pamięci (memory-bound)

Każdy krok decode musi wczytać z pamięci wszystkie wagi modelu i cały KV cache przy niewielu operacjach, więc przepustowość pamięci wyznacza prędkość.

Zależy od
Rozmiar wag i KV cacheRozmiar batcha

Paradygmat wykonania

Tryb główny
Gęsty

Wszystkie warstwy i ścieżki obliczeń są aktywne dla każdego generowanego tokenu.

Wzorzec aktywacji
Wszystkie ścieżki aktywne
Mechanizm routingu

Decode wykonuje gęsty przebieg forward na jednym tokenie bez warunkowego routingu (chyba że model jest MoE).

Równoległość

Poziom równoległości
Sekwencyjny

Tokeny generowane są sekwencyjnie (każdy zależy od poprzedniego); równoległość uzyskuje się między zapytaniami przez batching, nie w obrębie jednej sekwencji.

Zakres
InferencjaPomiędzy urządzeniami

Wymagania sprzętowe

Podstawowe

GPU o wysokiej przepustowości pamięci (HBM) są preferowane, bo faza decode jest memory-bound; przepustowość pamięci, nie FLOPs, wyznacza szybkość generacji.

Możliwe

Decode działa na CPU (np. llama.cpp), ale niska przepustowość pamięci RAM ogranicza liczbę tokenów na sekundę.