Robocikowo>ROBOCIKOWO
Wnioskowanie

KV Cache

2017AktywnyOpublikowano: 29 maja 2026Aktualizacja: 29 maja 2026Opublikowany
Mechanizm pamięci podręcznej w autoregresywnych Transformerach, który zapisuje tensory Key i Value z poprzednich tokenów, eliminując ich rekomputację w każdym kroku generacji i zmieniając złożoność prefill→decode z kwadratowej na liniową względem długości kontekstu.
Kluczowa innowacja
Cache'owanie tensorów Key i Value z poprzednich kroków autoregresywnego dekodowania, redukujące koszt wnioskowania per nowy token z O(n²·d) do O(n·d) przez eliminację rekomputacji.
Kategoria
Wnioskowanie
Poziom abstrakcji
Wzorzec
Poziom operacji
InferencjaElement architektury
Zastosowania
Inferencja każdego autoregresywnego LLM (GPT, Claude, Gemini, Llama, Mistral)Serwowanie modeli w środowiskach produkcyjnych (vLLM, TGI, TensorRT-LLM)Generacja długich sekwencji (chat, code completion, summarization)Multi-turn dialogue — cache kontekstu rozmowy między turamiPrompt caching (Anthropic, OpenAI) — współdzielenie cache dla powtarzających się prefixówSpeculative decoding — draft model i target model współdzielą strukturę cacheContinuous batching w serwerach inferencji (PagedAttention)

Jak działa

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.

Rozwiązany problem

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ą.

Komponenty

Bufor K (Key cache)

Tensor o kształcie [batch, num_heads, seq_len, head_dim] przechowujący projekcje Key dla wszystkich poprzednich tokenów, per warstwa Transformera.

Bufor V (Value cache)

Tensor o tym samym kształcie co bufor K, przechowujący projekcje Value. Razem z K stanowi pełny stan kontekstu warstwy uwagi.

Append operation

Mechanizm dopisywania nowo wygenerowanych K i V dla bieżącego tokenu na koniec bufora — typowo realizowany przez preallokowany tensor i write pointer.

Implementacja

Pułapki implementacyjne
Eksplozja pamięci przy długim kontekścieWysoka

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.

Rozwiązanie:Stosuj MQA/GQA dla mniejszego cache per token. Włącz KV cache quantization (INT8/INT4). Użyj PagedAttention/vLLM dla efektywnego zarządzania pamięcią. Rozważ sliding window attention.
Fragmentacja pamięci w batch servingWysoka

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.

Rozwiązanie:Użyj PagedAttention (vLLM): cache podzielony na stałe bloki (np. 16 tokenów) alokowane on-demand, jak strony w pamięci wirtualnej OS.
Invalidacja cache przy zmianie systemu promptuŚrednia

Każda modyfikacja prefiksu kontekstu (system prompt, retrieved documents) unieważnia cache wszystkich tokenów od punktu zmiany — eliminuje korzyści prompt caching.

Rozwiązanie:Projektuj prompty z niezmiennym prefiksem (system → cached examples → user query). Mid-conversation system messages wymagają rekomputacji ogona cache.
Latencja decode dominowana przez bandwidthŚrednia

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.

Rozwiązanie:Wybieraj akceleratory z wysokim HBM bandwidth (H100, MI300X). Stosuj speculative decoding aby zwiększyć utylizację compute. Batchuj requesty (continuous batching).

Ewolucja

Oryginalny paper · 2022 · MLSys 2023 · Reiner Pope
Efficiently Scaling Transformer Inference
Reiner Pope, Sholto Douglas, Aakanksha Chowdhery, Jacob Devlin, James Bradbury, Anselm Levskaya, Jonathan Heek, Kefan Xiao, Shivani Agrawal, Jeff Dean
2017
Wprowadzenie Transformera (Vaswani et al.)
Punkt przełomowy

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.

2019
Multi-Query Attention (Shazeer)
Punkt przełomowy

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.

2022
Formalizacja w 'Efficiently Scaling Transformer Inference' (Pope et al.)
Punkt przełomowy

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.

2023
Grouped Query Attention (Ainslie et al.)

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.

2023
PagedAttention i vLLM (Kwon et al.)
Punkt przełomowy

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.

2024
Prompt caching w API komercyjnych (Anthropic, OpenAI, Google)

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.

Hiperparametry (konfigurowalne osie)

Precyzja cacheWysoka

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.

fp16
bf16
int8
int4
Maksymalna długość kontekstuKrytyczna

Górne ograniczenie rozmiaru cache na sesję inferencji — wprost determinuje maksymalną długość prompt + generation.

Polityka usuwaniaŚrednia

Strategia odzyskiwania pamięci, gdy cache zbliża się do limitu — np. sliding window (StreamingLLM, H2O), attention sink, brak eviction.

Złożoność obliczeniowa

Wąskie gardło obliczeniowe

Memory bandwidth / HBM capacity

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.

Zależy od
Długość kontekstuLiczba głów / wymiar głowyBatch size

Paradygmat wykonania

Tryb główny
Gęsty

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.

Wzorzec aktywacji
Wszystkie ścieżki aktywne

Równoległość

Poziom równoległości
W pełni równoległy
Zakres
InferencjaPomiędzy tokenamiPomiędzy warstwami

Wymagania sprzętowe

Podstawowe
Podstawowe