1. Dlaczego rozmiar pliku GGUF to nie całe zużycie pamięci?
Początkujący inżynierowie AI często zakładają, że skoro skwantyzowany model 14B zajmuje na dysku 9 GB, to karta graficzna z 12 GB pamięci VRAM bez trudu poradzi sobie z analizą kilkudziesięciu stron dokumentacji PDF. W praktyce po przesłaniu długiego tekstu proces kończy się błędem CUDA Out of Memory.
Całkowite zużycie pamięci podczas inferencji składa się z trzech niezależnych elementów:
• Wagi modelu (Model Weights) — stały rozmiar pliku załadowanego do pamięci (np. 4.8 GB dla modelu 8B w formacie Q4_K_M).
• Bufor kontekstu (KV Cache) — dynamiczny obszar pamięci, który rośnie liniowo wraz z każdym wygenerowanym słowem oraz długością przesłanego promptu.
• Bufor obliczeniowy CUDA / Compute Buffer — tymczasowa przestrzeń robocza dla bieżącej warstwy sieci neuronowej (zazwyczaj od 500 MB do 1.5 GB).
Całkowite zużycie pamięci podczas inferencji składa się z trzech niezależnych elementów:
• Wagi modelu (Model Weights) — stały rozmiar pliku załadowanego do pamięci (np. 4.8 GB dla modelu 8B w formacie Q4_K_M).
• Bufor kontekstu (KV Cache) — dynamiczny obszar pamięci, który rośnie liniowo wraz z każdym wygenerowanym słowem oraz długością przesłanego promptu.
• Bufor obliczeniowy CUDA / Compute Buffer — tymczasowa przestrzeń robocza dla bieżącej warstwy sieci neuronowej (zazwyczaj od 500 MB do 1.5 GB).
2. Czym jest bufor KV Cache (Key-Value Cache)?
Modele oparte na architekturze Transformer są autoregresyjne — generując każde kolejne słowo (token), muszą przeanalizować wszystkie poprzednie słowa znajdujące się w oknie rozmowy. Gdyby model przy każdym nowym słowie przeliczał cały dotychczasowy tekst od zera, czas odpowiedzi rósłby wykładniczo.
Aby temu zapobiec, silnik inferencyjny (np. llama.cpp lub vLLM) zapisuje macierze stanu dla dotychczasowych słów w pamięci podręcznej nazywanej KV Cache (Key-Value Cache).
Przy standardowym oknie kontekstowym rzędu 2048 lub 4096 tokenów bufor ten zajmuje niespełna 500 MB. Jednak po zwiększeniu okna kontekstu (parametru num_ctx w Ollama) do 32 768 lub 65 536 tokenów, sam bufor KV Cache potrafi zająć dodatkowe 8–16 GB pamięci VRAM, przewyższając rozmiar samego modelu.
Aby temu zapobiec, silnik inferencyjny (np. llama.cpp lub vLLM) zapisuje macierze stanu dla dotychczasowych słów w pamięci podręcznej nazywanej KV Cache (Key-Value Cache).
Przy standardowym oknie kontekstowym rzędu 2048 lub 4096 tokenów bufor ten zajmuje niespełna 500 MB. Jednak po zwiększeniu okna kontekstu (parametru num_ctx w Ollama) do 32 768 lub 65 536 tokenów, sam bufor KV Cache potrafi zająć dodatkowe 8–16 GB pamięci VRAM, przewyższając rozmiar samego modelu.
3. Wąskie gardło LLM: Przepustowość pamięci (GB/s) vs rdzenie CUDA
W przeciwieństwie do renderowania grafiki 3D lub trenowania sieci, generowanie tekstu przez pojedynczego użytkownika nie jest ograniczone mocą obliczeniową rdzeni karty graficznej (Compute-Bound), lecz szybkością przesyłania danych z pamięci VRAM do procesora (Memory-Bound).
Aby wygenerować zaledwie 1 token, karta graficzna musi odczytać z pamięci VRAM wszystkie wagi modelu od początku do końca. Dlatego o prędkości generowania tekstu decyduje bezpośrednio przepustowość pamięci (Memory Bandwidth):
• Pamięć RAM DDR4 na serwerze VPS (ok. 35–50 GB/s) — pozwala na generowanie ok. 5–9 tokenów na sekundę dla modelu 8B.
• Pamięć RAM DDR5 w nowoczesnych serwerach EPYC (ok. 80–120 GB/s) — osiąga ok. 12–18 tokenów na sekundę na samym procesorze.
• Karta NVIDIA RTX 3060 12 GB (360 GB/s) — generuje ok. 45–55 tokenów na sekundę.
• Karty NVIDIA RTX 3090 / RTX 4090 24 GB (936–1008 GB/s) — przekraczają barierę 100–130 tokenów na sekundę dla modeli 8B oraz 45–60 tokenów na sekundę dla modeli 32B.
Aby wygenerować zaledwie 1 token, karta graficzna musi odczytać z pamięci VRAM wszystkie wagi modelu od początku do końca. Dlatego o prędkości generowania tekstu decyduje bezpośrednio przepustowość pamięci (Memory Bandwidth):
• Pamięć RAM DDR4 na serwerze VPS (ok. 35–50 GB/s) — pozwala na generowanie ok. 5–9 tokenów na sekundę dla modelu 8B.
• Pamięć RAM DDR5 w nowoczesnych serwerach EPYC (ok. 80–120 GB/s) — osiąga ok. 12–18 tokenów na sekundę na samym procesorze.
• Karta NVIDIA RTX 3060 12 GB (360 GB/s) — generuje ok. 45–55 tokenów na sekundę.
• Karty NVIDIA RTX 3090 / RTX 4090 24 GB (936–1008 GB/s) — przekraczają barierę 100–130 tokenów na sekundę dla modeli 8B oraz 45–60 tokenów na sekundę dla modeli 32B.
4. Flash Attention i kwantyzacja pamięci podręcznej (Q8_0 / Q4_0)
Domyślnie silniki LLM przechowują bufor KV Cache w nieskompresowanej precyzji 16-bitowej (FP16), nawet jeśli sam model jest skwantyzowany do 4 bitów. W nowoczesnych wdrożeniach produkcyjnych można ten narzut drastycznie zredukować za pomocą dwóch flag środowiskowych:
• Algorytm Flash Attention (OLLAMA_FLASH_ATTENTION=1) — optymalizuje operacje odczytu macierzy uwagi bezpośrednio w szybkiej pamięci SRAM procesora graficznego, przyspieszając przetwarzanie długich promptów i redukując narzut pamięciowy.
• Kwantyzacja bufora KV (OLLAMA_KV_CACHE_TYPE=q8_0 lub q4_0) — kompresuje pamięć kontekstu z 16 bitów do 8 lub 4 bitów. Ustawienie wariantu q8_0 zmniejsza zużycie VRAM przez okno kontekstowe dokładnie o połowę przy zerowej utracie dokładności wyszukiwania informacji w tekście.
• Algorytm Flash Attention (OLLAMA_FLASH_ATTENTION=1) — optymalizuje operacje odczytu macierzy uwagi bezpośrednio w szybkiej pamięci SRAM procesora graficznego, przyspieszając przetwarzanie długich promptów i redukując narzut pamięciowy.
• Kwantyzacja bufora KV (OLLAMA_KV_CACHE_TYPE=q8_0 lub q4_0) — kompresuje pamięć kontekstu z 16 bitów do 8 lub 4 bitów. Ustawienie wariantu q8_0 zmniejsza zużycie VRAM przez okno kontekstowe dokładnie o połowę przy zerowej utracie dokładności wyszukiwania informacji w tekście.
5. Ile pamięci VRAM i RAM potrzebujesz pod duże okna kontekstowe?
Planując infrastrukturę pod agentów AI w n8n lub systemy RAG analizujące dokumentację, dobierz sprzęt pod docelową wielkość kontekstu:
• Krótkie zadania i klasyfikacja JSON (kontekst do 4k tokenów) — wystarczy serwer VPS z 8–16 GB RAM lub pojedyncza karta 8–12 GB VRAM.
• Analiza dokumentów i asystenci kodu (kontekst 16k – 32k tokenów) — optymalnym wyborem jest karta z 24 GB VRAM (np. RTX 3090 / RTX 4090 lokalnie lub w chmurze RunPod) z włączoną kwantyzacją KV Cache Q8_0.
• Praca wielozadaniowa (Multi-Agent / równoległe webhooki) — pamiętaj, że ustawienie zmiennej OLLAMA_NUM_PARALLEL=4 mnoży rozmiar bufora KV Cache czterokrotnie, aby obsłużyć cztery niezależne strumienie jednocześnie.
• Krótkie zadania i klasyfikacja JSON (kontekst do 4k tokenów) — wystarczy serwer VPS z 8–16 GB RAM lub pojedyncza karta 8–12 GB VRAM.
• Analiza dokumentów i asystenci kodu (kontekst 16k – 32k tokenów) — optymalnym wyborem jest karta z 24 GB VRAM (np. RTX 3090 / RTX 4090 lokalnie lub w chmurze RunPod) z włączoną kwantyzacją KV Cache Q8_0.
• Praca wielozadaniowa (Multi-Agent / równoległe webhooki) — pamiętaj, że ustawienie zmiennej OLLAMA_NUM_PARALLEL=4 mnoży rozmiar bufora KV Cache czterokrotnie, aby obsłużyć cztery niezależne strumienie jednocześnie.
Często zadawane pytania (FAQ)
Dlaczego Ollama domyślnie obcina długie prompty mimo tego, że model obsługuje 128k tokenów?
Aby chronić karty graficzne przed brakiem pamięci VRAM, Ollama ustawia domyślne okno kontekstowe (num_ctx) na 2048 tokenów. Aby analizować dłuższe teksty, musisz jawnie przekazać wyższą wartość parametru num_ctx (np. 16384 lub 32768) w zapytaniu API lub w pliku Modelfile.
Dlaczego model odpowiada natychmiast na krótkie pytania, a przy wklejeniu dużego pliku czeka kilkanaście sekund przed pierwszym słowem?
Faza przed wygenerowaniem pierwszego słowa nazywa się Prompt Evaluation (Prefill). W tym czasie karta graficzna musi przetworzyć cały wklejony tekst i zbudować dla niego macierze KV Cache. Dopiero po zakończeniu tego etapu rozpoczyna się szybkie generowanie odpowiedzi token po tokenie.