Strona główna / Rozdział 3 · Jak model pisze i ile to kosztuje
    Ostatnia zmiana · 6 min czytania

    Użyj z AI

    Pętla generowania i KV cache

    Generowanie to pętla: jeden przebieg modelu daje jeden token, który trafia na koniec wejścia. KV cache trzyma klucze i wartości attention wszystkich wcześniejszych tokenów, więc każdy krok liczy tylko nowy token, a ceną jest pamięć GPU, która ogranicza długość kontekstu i liczbę równoległych rozmów.

    Po ludzkuPiszesz list i przy każdym nowym słowie zerkasz do notatek z tego, co już napisałeś. Nie czytasz listu od nowa, ale notatki przeglądasz za każdym razem. KV cache to te notatki. Leżą na biurku, czyli w pamięci karty graficznej, i im dłuższy list, tym więcej miejsca zajmują.

    Przejdź krok po kroku z cache’em i bez. Porównaj, ile tokenów liczy każdy krok

    policzone w tym krokuodczytane z cache’unowy token
    0tokenów policzonych w tym kroku
    0łącznie od startu
    0odczytanych z cache’u w tym kroku
    –faza

    Co jest w KV cache’u i czemu to działa

    Ile pamięci zajmuje KV cache

    Wybierz model, kontekst i liczbę rozmów. Zobacz, ile kart H100 zajmuje sam cache

    średnio na jeden token
    na jedną rozmowę
    łącznie
    kart H100 (80 GB) tylko na cache

    Wzór: 2 × warstwy × głowy KV × wymiar głowy × bajty × tokeny. MLA zapisuje zamiast K i V jeden wektor 576 liczb na warstwę, więc bez mnożenia przez 2. W Gemmie 3 co szósta warstwa jest pełna, a pozostałe trzymają najwyżej 1024 ostatnie tokeny. Bez wag modelu i narzutów serwera. Suwak kończy się na 128 tys. tokenów, najdłuższym kontekście tych modeli.

    Prefill i decode

    Zwiększ kontekst i liczbę rozmów w batchu. Zobacz, kiedy czytanie cache’u zaczyna dominować nad czytaniem wag

    zajęte z 80 GB karty
    czas jednego kroku
    tokenów/s na rozmowę
    tokenów/s łącznie
    czytania to cache

    Model poglądowy jak w temacie „Czemu GPU się nudzi”: 8 mld parametrów w FP16 (16 GB wag, cache 128 KB na token), jedna karta H100 z 80 GB pamięci i 3,35 TB/s. Czas kroku = (wagi + cache wszystkich rozmów) / przepustowość. To górna granica prędkości, bez narzutów.

    Cache na serwerze

    Sprawdź się

    Czym jest KV cache i czym różni się prefill od decode?

    Generowanie to pętla: jeden przebieg modelu daje jeden token. Attention potrzebuje kluczy i wartości wszystkich wcześniejszych tokenów, a dzięki masce przyczynowej one się nie zmieniają, więc liczy się je raz i trzyma w pamięci GPU. Prefill liczy cały prompt równolegle, jest ograniczony obliczeniami i wyznacza czas do pierwszego tokena. Decode idzie token po tokenie i czeka na pamięć, bo każdy krok czyta wagi i cały cache. Cache to ok. 0,33 MB na token dla 70B z GQA, więc to on ogranicza kontekst i batch. Zmniejszają go GQA, MLA, okno przesuwne i FP8.

    In English

    Generation is a loop: one forward pass yields one token. Attention needs the keys and values of all earlier tokens, and thanks to the causal mask they never change, so they are computed once and kept in GPU memory. Prefill processes the whole prompt in parallel, is compute-bound and sets time to first token. Decode goes token by token and is memory-bound, because every step reads the weights and the whole cache. The cache is about 0.33 MB per token for a 70B model with GQA, so it is what caps context length and batch size. GQA, MLA, sliding windows and FP8 shrink it.

    Pytania pogłębiające (4)
    Od czego zależy czas do pierwszego tokena, a od czego prędkość pisania?
    Czas do pierwszego tokena zależy od kolejki i od tego, ile promptu trzeba policzyć poza trafionym cache’em, bo to prefill. Prędkość pisania zależy od rozmiaru wag, długości kontekstu, liczby rozmów w batchu i przepustowości pamięci, bo to decode.
    Czemu długi kontekst spowalnia pisanie, skoro każdy krok liczy jeden token?
    Bo każdy krok czyta cały cache. Dla modelu 70B przy 128 tys. tokenów to 43 GB na krok, prawie jedna trzecia tego, co ważą wagi, a decode jest ograniczony przepustowością pamięci.
    vLLM pada z braku pamięci przy długich kontekstach. Co robisz?
    Policz budżet: wagi plus cache na token × maksymalny kontekst × liczba równoległych sekwencji. Potem ogranicz maksymalną długość i liczbę sekwencji, włącz cache w FP8 i współdzielenie prefiksów, a gdy to za mało, podziel model na więcej kart. Tensor parallelism dzieli cache GQA po głowach KV, więc najwyżej na tyle kart, ile jest głów KV (8 w Llama 3.1 70B). Cache MLA jest powielany na każdej karcie, dlatego modele w stylu DeepSeek używają zamiast tego data-parallel attention.
    Jak zmniejszyć KV cache?
    Przy projektowaniu modelu: GQA lub MQA, MLA, okno przesuwne, warstwy SSM. Przy serwowaniu: FP8, współdzielenie prefiksów, zrzut do RAM-u, wyrzucanie tokenów. Wyniku nie zmieniają tylko współdzielenie i zrzut.

    Źródła

    Zgłoś błąd · Zaproponuj poprawkę