Podczas fazy prefill (przetwarzania promptu) model oblicza tensory K i V dla wszystkich tokenów wejściowych i zapisuje je w buforze cache per warstwa i per głowa uwagi. W fazie decode dla każdego nowego tokenu obliczane są jedynie jego własne projekcje Q, K, V; nowe K i V są dopisywane do cache, a uwaga jest liczona jako Q_new · K_cacheᵀ na całym zacache'owanym kontekście. Rozmiar cache rośnie liniowo z długością kontekstu i wynosi 2 · L · H · d_head · b · n bajtów (2 dla K+V, L warstw, H głów, d_head wymiar, b batch, n długość) — typowo precyzja FP16/BF16. Cache jest alokowany w pamięci HBM akceleratora i odczytywany w każdym kroku dekodowania, co czyni przepustowość pamięci dominującym wąskim gardłem w fazie generacji.
Bez KV cache, autoregresywne dekodowanie w Transformerze wymaga rekomputacji projekcji Key i Value dla wszystkich poprzednich tokenów przy każdym kroku generacji, co prowadzi do kwadratowej złożoności względem długości sekwencji i czyni generację długich tekstów obliczeniowo nieopłacalną.
Tensor o kształcie [batch, num_heads, seq_len, head_dim] przechowujący projekcje Key dla wszystkich poprzednich tokenów, per warstwa Transformera.
Tensor o tym samym kształcie co bufor K, przechowujący projekcje Value. Razem z K stanowi pełny stan kontekstu warstwy uwagi.
Mechanizm dopisywania nowo wygenerowanych K i V dla bieżącego tokenu na koniec bufora — typowo realizowany przez preallokowany tensor i write pointer.
Rozmiar cache rośnie liniowo z długością kontekstu i może łatwo przekroczyć dostępną pamięć HBM, zwłaszcza przy dużym batch size. Przykład: Llama-2-70B przy 32k kontekstu i batch=8 wymaga ~160 GB samego cache.
Tradycyjna alokacja cache jako ciągłych bloków o rozmiarze max_context prowadzi do ogromnego marnotrawstwa pamięci (60-80%) w continuous batching, gdy sekwencje mają różne długości.
Każda modyfikacja prefiksu kontekstu (system prompt, retrieved documents) unieważnia cache wszystkich tokenów od punktu zmiany — eliminuje korzyści prompt caching.
W fazie decode model jest memory-bound, nie compute-bound — większość czasu spędza na odczycie cache z HBM. Akceleratory o wysokim FLOPS, lecz niskim memory bandwidth (np. niektóre GPU consumer) są w decode niedoutylizowane.
Oryginalna architektura Transformer w 'Attention Is All You Need' wprowadza self-attention. Implementacje dekodera autoregresywnego (GPT) szybko zaczynają używać cache'owania K/V jako oczywistej optymalizacji — bez formalnej publikacji.
Noam Shazeer w 'Fast Transformer Decoding' identyfikuje rozmiar KV cache jako główne wąskie gardło inferencji i proponuje MQA: jedna głowa K i V współdzielona przez wszystkie głowy Q. Redukuje cache H-krotnie.
Pope, Douglas, Chowdhery et al. z Google publikują pierwszą szczegółową analizę KV cache jako głównego czynnika kosztu inferencji LLM przy dużej skali. Praca formalizuje memory-bound charakter fazy decode.
GQA jako kompromis MHA↔MQA: grupy głów Q współdzielą jedną parę K/V. Standard w Llama-2-70B, Mistral i większości modeli post-2023 — redukuje cache 4-8× bez utraty jakości MQA.
Kwon et al. wprowadzają PagedAttention — stronicowanie KV cache wzorowane na pamięci wirtualnej OS. Eliminuje fragmentację cache, umożliwia continuous batching i 2-4× wyższy throughput w serwowaniu LLM.
Anthropic (sierpień 2024) wprowadza prompt caching w Claude API — KV cache zaprojektowane do współdzielenia między requestami z tym samym prefixem. OpenAI i Google idą tą samą drogą. Redukcja kosztu i latencji do 90% dla powtarzających się kontekstów.
W fazie decode z aktywnym KV cache, dominującym kosztem jest odczyt cache z pamięci HBM przy każdym kroku — operacja memory-bound, nie compute-bound. Rozmiar cache ogranicza także maksymalny batch size i długość kontekstu.
Typ danych dla zapisanych K i V. Standardowo FP16/BF16; kwantyzacja do INT8/INT4 (KV cache quantization) redukuje rozmiar cache 2-4× kosztem niewielkiej utraty jakości.
Górne ograniczenie rozmiaru cache na sesję inferencji — wprost determinuje maksymalną długość prompt + generation.
Strategia odzyskiwania pamięci, gdy cache zbliża się do limitu — np. sliding window (StreamingLLM, H2O), attention sink, brak eviction.
KV cache nie zmienia wzorca aktywacji modelu — wszystkie głowy i warstwy są aktywne. Modyfikuje wyłącznie strategię reużycia obliczeń K/V między krokami dekodowania.