KV Cache: Pamäť transformera, ktorá zrýchľuje generovanie textu

KV Cache (Key-Value Cache) je optimalizačná technika inference, bez ktorej by moderné LLM nedokázali generovať text v reálnom čase — najmä pri kontextoch s desiatkami tisíc tokenov.


1. Čo je KV Cache a prečo vznikol

Každý transformer model pri generovaní textu vykonáva pozornostný mechanizmus (attention). Ten pre každý token vypočítava tri vektory: Query (Q), Key (K) a Value (V). Pri generovaní odpovede token po tokene nastáva zásadný problém: každý nový token potrebuje vidieť K a V hodnoty všetkých predchádzajúcich tokenov.

Bez cachovania by model musel znova prepočítavať K a V pre každý predchádzajúci token pri každom novom generovanom tokene. Pre sekvenciu 1 000 tokenov to znamená kvadraticky rastúci počet výpočtov — čo by urobilo dlhé generovanie prakticky nepoužiteľným.

KV Cache rieši tento problém priamočiaro: K a V vektory každého tokenu sa uložia do pamäte GPU po prvom výpočte a pri ďalších krokoch sa len znovu použijú. Prepočítava sa iba Query pre práve generovaný token.

Kľúčové vlastnosti:

  • K a V sa cachujú pre každý token v každej vrstve modelu
  • Q sa nepotrebuje cachovať — každý nový token generuje nové Q nezávisle
  • Cache rastie lineárne s dĺžkou sekvencie
  • Bez cache: O(n²) výpočtová závislosť; s cache: O(n) pri inkrementálnom generovaní

2. Ako KV Cache funguje krok za krokom

Generovanie prebieha v dvoch odlišných fázach:

Prefill fáza: Model spracuje celý vstupný prompt naraz. Pre každý token v prompte sa vypočítajú K a V a uložia do cache. Táto fáza je výpočtovo náročná — vyžaduje paralelné spracovanie celého vstupu — ale prebehne iba raz.

Decode fáza: Každý nový generovaný token vypočíta K a V len pre seba, potom načíta uložené K a V z cache pre všetky predchádzajúce tokeny. Attention prebehne iba pre tento jeden nový token voči celej histórii — a to je dôvod, prečo je generovanie rýchle.

Pamäťová stopa KV cache závisí od viacerých faktorov:

  • Počtu vrstiev — každá vrstva má vlastný KV cache
  • Počtu attention hláv — viac hláv znamená viac uložených vektorov
  • Dĺžky sekvencie — cache lineárne rastie s každým tokenom
  • Dátového typu — float16 vs. float8 = dvojnásobný rozdiel v pamäti

Pre model veľkosti 70B s kontextovým oknom 128K tokenov môže KV Cache zaberať desiatky gigabajtov VRAM — niekedy viac ako samotné váhy modelu.


3. Varianty a optimalizácie KV Cache

Technika Princíp Dopad na pamäť
Multi-Head Attention (MHA) Každá hlava má vlastný K, V Základná varianta, žiadna úspora
Multi-Query Attention (MQA) Všetky hlavy zdieľajú jeden K, V 10–20× menej pamäte na K/V
Grouped-Query Attention (GQA) Skupiny hláv zdieľajú K, V Kompromis medzi MHA a MQA
PagedAttention (vLLM) Cache ukladaná v stránkach ako OS paging 24–40× vyšší throughput servera
Sliding Window Attention Cache iba pre N posledných tokenov Fixná pamäť bez ohľadu na dĺžku
Kvantizovaný KV cache K, V uložené v INT8 alebo FP8 2–4× menej pamäte, malá strata presnosti

GQA je dnes de facto štandardom — používajú ho Llama 3 a 4, Mistral, Gemma a väčšina moderných open-source architektúr. MQA stále nájdeme napríklad vo Falcone a starších Gemini variantoch. Kombinácia GQA s kvantizovaným cache umožňuje nasadiť veľké modely aj na hardvér, ktorý by inak nestačil.


4. Praktické dopady pre nasadenie

KV Cache priamo ovplyvňuje, ako sa LLM nasadzujú v produkcii.

vLLM a PagedAttention: Najvýznamnejší prielom priniesol vLLM framework, ktorý zaviedol PagedAttention — správu KV Cache podobnú virtuálnej pamäti operačného systému. Namiesto alokovania jedného súvislého bloku pre celý kontext sa cache ukladá do diskrétnych stránok. To eliminuje fragmentáciu pamäte a umožňuje serveru obsluhovať podstatne viac paralelných requestov bez OOM chýb.

Prefix caching: Ak viacero požiadaviek zdieľa rovnaký systémový prompt (napríklad pevná system prompt pri API), provider môže cachovať K a V pre tento prefix a nevypočítavať ich opakovane. Anthropic, OpenAI aj Google toto ponúkajú ako prompt caching — s priamou finančnou zľavou na API volania.

Orientačné hodnoty z praxe:

  • Bez KV Cache by generovanie jedného tokenu pri 128K kontexte trvalo sekundy
  • S KV Cache moderné servery dosiahnu 50–200 tokenov/s aj pri dlhých kontextoch
  • Anthropic prompt caching: 90 % zľava na tokeny v cachovanej časti promptu

Pre vývojárov nasadzujúcich LLM server platí:

  • Sledujte metriku kv_cache_usage — pri hodnotách blízkych 100 % nové requesty čakajú alebo sú odmietané
  • Batch size a dĺžka sekvencie súperia o VRAM s KV Cache — optimalizácia jedného vždy ovplyvní druhé
  • Modely s GQA sú pre deployment preferované práve kvôli menšej pamäťovej stope cache

5. Limity, riziká a ďalší vývoj

Pamäťový strop: KV Cache je hlavný dôvod, prečo mimoriadne dlhé kontexty (1M+ tokenov) vyžadujú obrovské množstvo VRAM. Pri miliontokenovom kontexte môže cache zabrať stovky gigabajtov — výzva pre súčasný hardware aj pri najvýkonnejších GPU klastroch.

Latencia vs. priepustnosť: Veľký KV Cache zvyšuje nároky na pamäťovú šírku pásma. Pri dlhých sekvenciách sa decode fáza stáva memory-bound — limitujúcim faktorom nie je výpočtový výkon čipov, ale rýchlosť prenosu dát medzi pamäťou a procesorom.

Bezpečnostné riziká: V systémoch zdieľaného inference môže nesprávna implementácia cache spôsobiť únik dát medzi requestmi rôznych používateľov. Tento vektor útoku je aktívnou témou bezpečnostného výskumu pri nasadení vo verejných API.

Smerovanie ďalšieho vývoja:

  • KV Cache offloading na CPU alebo NVMe disky pri dlhých nečinných konverzáciách
  • Distribuovaný KV Cache cez viacero GPU a nodov pre multi-agent systémy
  • Lineárna attention (Mamba, RWKV, Hawk), ktorá nepotrebuje rastúci cache vôbec
  • Hierarchická cache s rôznou presnosťou pre staré vs. nové tokeny

Zhrnutie: KV Cache je neviditeľná, no kľúčová infraštruktúra každého moderného LLM — bez nej by generovanie textu pri dnešných kontextových oknách bolo rádovo pomalšie a nákladnejšie. Pochopiť jeho princípy a limity je základ pre každého, kto navrhuje alebo nasadzuje produkčné AI aplikácie.