GPU do badań ML · Płatność crypto bez KYC
IteraGPU
Pamięć inferencji · Kontekst i współbieżność

Ile pamięci przeznaczyć na cache KV?

Dla gęstego, jednorodnego cache policz dwa tensory, K i V, dla każdej warstwy, głowy KV, zachowanej pozycji i równoczesnej sekwencji. Użyj rzeczywistego formatu cache, a nie formatu wag. To obliczenie daje teoretyczną objętość jednego stanowiska pamięci; nie przewiduje ani całkowitego szczytu GPU, ani opóźnienia, ani jakości odpowiedzi. Następnie zweryfikuj strategię alokacji na swoim obciążeniu.

01 /

Opisz, co pozostaje w pamięci

Podczas generacji autoregresyjnej klucze i wartości już przetworzonych tokenów mogą być zachowane na kolejne kroki. Ten cache należy do warstw uwagi. Jego objętość zależy więc od modelu i zachowanej historii, nie tylko od liczby parametrów. Kontekst rozmowy obejmuje także instrukcje, poprzednie wiadomości i dokumenty dodane przez aplikację.

Twoja pierwsza decyzja jest operacyjna: ile sekwencji musi pozostać aktywnych i do jakiej długości? Kolejka dwudziestu żądań, z których dwa są wykonywane równocześnie, niekoniecznie oznacza dwadzieścia rezydujących cache’ów. Zanotuj rzeczywiste przyjmowanie żądań i ewentualne dodatkowe sekwencje tworzone przez generację.

Przygotuj kartę z rewizją modelu, warstwami uwagi, głowami KV, wymiarem kluczy i wartości, ich dtype oraz strategią cache. Policz tokeny po tokenizerze i szablonie rozmowy. Limit znaków nie opisuje tej alokacji.

Źródła techniczne: Hugging Face — działanie i kształt cache’ów według warstw

02 /

Użyj głów KV, zwłaszcza z GQA

Liczba głów zapytań Q i liczba głów KV mogą się różnić. W klasycznej uwadze wielogłowej są one zgodne. W MQA udostępniana jest jedna głowa KV; GQA grupuje kilka głów Q wokół jednej głowy KV. Odczytaj num_key_value_heads w konfiguracji, gdy to pole istnieje, i zweryfikuj jego znaczenie dla architektury.

Na przykład czterdzieści głów Q i osiem głów KV tworzy pięć głów Q na grupę KV. Wzór na przechowywany cache używa ośmiu, a nie czterdziestu. Ten stosunek nie opisuje całej pamięci uwagi: operacje lub konwersje mogą tworzyć dane tymczasowe.

Nie zmieniaj po prostu tej liczby, aby zmniejszyć zapotrzebowanie na pamięć już wytrenowanego modelu. Schemat uwagi jest częścią jego architektury. Dwa modele o różnych liczbach głów nie stają się równoważnymi wariantami przez obliczenie pojemności; ich jakość należy oceniać osobno.

Źródła techniczne: Hugging Face — pola LlamaConfig i rozróżnienie MHA, MQA, GQA · PyTorch — wymiary Q/K/V i ograniczenia uwagi GQA

03 /

Ustalenie wzoru i jego jednostek

W przypadku jednorodnym L to liczba warstw, Hkv liczba głów KV, D ich wymiar, T liczba pozycji zachowanych na sekwencję, B liczba sekwencji, a q liczba bajtów na wartość. Współczynnik dwa uwzględnia K i V. To przybliżenie zakłada klucze i wartości o tym samym wymiarze i tym samym formacie, bez kompresji ani współdzielenia prefiksu.

Konwertuj tylko wynik końcowy: jeden GiB to 1 073 741 824 bajtów; jeden dziesiętny GB to 1 000 000 000 bajtów. Zachowaj bajty w swoich notatkach, aby zaokrąglenie lub zmiana jednostki nie ukryły różnicy.

Dla różnych długości bez paddingu zastąp B × T sumą faktycznie przechowywanych pozycji. Dla warstw niejednorodnych zsumuj warstwa po warstwie. Gęste przechowywanie z paddingiem, alokacja blokowa lub rezerwacja statyczna wymagają policzenia przydzielonych miejsc, które mogą przekraczać użyteczne tokeny.

KV teoretyczne (bajty) = 2 × L × Hkv × D × T × B × q ; KV (GiB) = KV (bajty) ÷ 1 073 741 824

Źródła techniczne: Hugging Face — wymiary tensorów cache · NIST — jednostki dziesiętne i przedrostki binarne

04 /

Przykład przeanalizowany: sześć sekwencji, bez pomiaru GPU

Weźmy fikcyjną architekturę czterdziestu warstw, ośmiu głów KV i wymiaru 128. Załóżmy jednorodny cache o dwóch bajtach na wartość. Każda sekwencja otrzymuje co najwyżej 3 072 tokeny wejściowe i rezerwację na 1 024 dodatkowe tokeny, czyli granicę 4 096 pozycji. To założenia dydaktyczne, a nie potwierdzona konfiguracja modelu.

Koszt obliczony na pozycję i na sekwencję to 2 × 40 × 8 × 128 × 2 = 163 840 bajtów. Sekwencja o 4 096 pozycjach to zatem 671 088 640 bajtów, czyli 0,625 GiB. Sześć sekwencji daje 4 026 531 840 bajtów, czyli 3,75 GiB na sam cache.

Podwojenie zachowanej długości podwaja tę pozycję w tym wzorze. Zastąpienie ośmiu głów KV czterdziestoma mnoży ją przez pięć, przy wszystkich pozostałych założeniach bez zmian. Te proporcje nie zapowiadają żadnego przyspieszenia, utraty jakości ani zgodności rzeczywistego modelu.

Wyłącznie arytmetyka teoretyczna: L = 40, D = 128, q = 2 bajty; wagi i dane tymczasowe wyłączone.
Sekwencje BPozycje TGłowy KVObliczone bajtyGiB
14 0968671 088 6400,625
64 09684 026 531 8403,75
68 19288 053 063 6807,5
64 0964020 132 659 20018,75
05 /

Dostosowanie budżetu do strategii cache

Dynamiczny cache rośnie wraz z zachowanymi pozycjami. Statyczny cache rezerwuje maksymalną pojemność: wymiaruj tę rezerwację, a nie tylko krótkie zapytanie obserwowane przy starcie. W przypadku uwagi z przesuwanym oknem niektóre warstwy mogą ograniczać swoją historię; warstwy z pełną uwagą wymagają odrębnego obliczenia.

Kwantyzacja cache i jego przeniesienie na CPU to inne strategie, zależne od modelu i oprogramowania. Zmieniają one ograniczenia dotyczące przechowywania, transferu lub obliczeń. Kwantyzacja wag nie dowodzi, że cache ma ten sam format.

Zanotuj klasę cache i jej jawne parametry. Sprawdź także zwalnianie miejsc po zakończeniu lub anulowaniu zapytania. W przypadku obciążenia mieszającego krótkie i długie sekwencje jednolita maksymalna rezerwacja może ważyć więcej niż sama suma użytecznych treści.

Źródła techniczne: Hugging Face — cache dynamiczne, statyczne, skwantyzowane i przeniesione

06 /

Weryfikacja reprezentatywnego obciążenia krok po kroku

Zbuduj trzy przypadki: typowe wejście, oczekiwane długie wejście i maksymalna dozwolona liczba jednoczesnych zapytań. Ustal model, tokenizer, szablon, limit generowania i regułę zakończenia. Zmieniaj jeden wymiar naraz; skrócona odpowiedź lub obcięty dokument zmieniają wykonaną pracę.

Zmierz oddzielnie wczytywanie, wstępne przetwarzanie wejścia i generowanie. Synchronizuj device wokół mierzonych faz, zachowaj początkowe poziomy pamięci i piki. Metoda pomiaru pamięci wyjaśnia, dlaczego allocated i reserved się nie sumują i dlaczego różnica ich maksimów nie izoluje cache'u.

Twój test musi prowadzić do sprawdzonej granicy i akceptowalnych wyników: ID zakończonych żądań, błędów, długości wygenerowanego tekstu i kryterium jakości. Uruchomienie, które mieści się na krótkim wejściu, nie potwierdza maksymalnej współbieżności. Błąd pamięci przed końcem nie stanowi pomiaru zapotrzebowania na pełne wykonanie.

Źródła techniczne: PyTorch — synchronizacja pracy na wybranym device · PyTorch — zakres liczników pamięci

07 /

Odrzuć błędy, które fałszują wybór

Nie zamieniaj obliczonego cache'u na całkowitą pojemność GPU. Dodaj analizę wag, tymczasowych aktywacji, zachowanych wyjść i oprogramowania. Nie dziel też tego wolumenu automatycznie przez liczbę kart: rozmieszczenie warstw lub głowic musi być rzeczywiście skonfigurowane i sprawdzone na każdym device.

Notebook IteraGPU Lab to ćwiczenie z instrumentacji na małej gęstej sieci bez attention. Pomaga odczytać fazy pamięciowe; jego parametr context nie potwierdza tego obliczenia KV. Użyj karty obciążenia i katalogu inferencji, aby przygotować test własnego modelu.

Porównuj możliwości ofert dopiero po rozróżnieniu wolumenu arytmetycznego, maksimum rzeczywiście zaobserwowanego i przypadków jeszcze nieprzetestowanych. Abonament wynajmu organizuje Twoje okno pracy; nie gwarantuje żadnej długości kontekstu ani tempa generowania.

  • Mylenie głowic Q i głowic KV: wróć do konfiguracji architektury.
  • Budżetowanie tylko promptu: uwzględnij generowanie i rzeczywistą rezerwację.
  • Odczytanie „wagi 4 bity” jako „cache 4 bity”: sprawdź oba formaty.
  • Pomijanie współbieżności: policz sekwencje rzeczywiście rezydujące.
  • Obiecywanie wspólnej pamięci między kartami: zweryfikuj rzeczywiste rozmieszczenie.

Praktyczne pytania

Czy mogę poznać cache KV wyłącznie na podstawie liczby parametrów?

Nie. Potrzebna jest też architektura warstw attention, głowice KV, ich wymiary, format cache'u, zachowane pozycje i rezydujące sekwencje. Dwa modele o zbliżonym rozmiarze mogą wymagać różnych budżetów KV.

Czy statyczny cache zużywa tylko długość mojego żądania?

Trzeba zwymiarować jego zarezerwowaną pojemność. Krótkie żądanie nie pozwala wywnioskować tej maksymalnej alokacji. Sprawdź parametry cache'u i zmierz faktycznie utworzoną konfigurację.

Czy wynik formuły wystarczy do wyboru karty?

Szacuje wyłącznie cache według ogłoszonych założeń. Wybór musi też uwzględniać pozostałe pozycje pamięciowe, zgodność oprogramowania i pełny test z reprezentatywnym kontekstem, współbieżnością i jakością.