KV cache między modelami. Nvidia zmniejsza koszt przełączania
Wyobraźmy sobie agenta, który analizuje błąd w aplikacji. Mały model czyta pliki, zbiera logi i sprawdza proste hipotezy. Po kilku krokach trafia na problem wymagający mocniejszego modelu. Przekazujemy mu dotychczasową rozmowę, wyniki narzędzi i fragmenty kodu. Mocniejszy model musi przetworzyć ten kontekst, zanim zajmie się właściwym zadaniem. Płacimy więc również za ponowne przeczytanie materiału, który inny model już przeczytał.
Badacze Nvidii pokazali, że można przekształcić KV cache jednego modelu w pamięć użyteczną dla drugiego. Otwiera to ciekawą możliwość: dobierać model do kolejnego etapu pracy, zachowując część wykonanych już obliczeń.
Dlaczego pamięć nie pasuje do drugiego modelu
Model językowy generuje tekst token po tokenie. Zanim zacznie odpowiadać, przetwarza wejście w fazie zwanej prefill. W warstwach mechanizmu uwagi powstają wtedy klucze i wartości, czyli K i V. Klucze pomagają ustalić, do których fragmentów kontekstu należy się odwołać, a wartości dostarczają informacji wykorzystywanej w dalszych obliczeniach.
KV cache przechowuje te wektory dla przetworzonych tokenów. Przy generowaniu kolejnego tokenu model korzysta z zapisanych K i V oraz dopisuje nowe. Nadal odwołuje się do wcześniejszego kontekstu, lecz nie wylicza od początku wszystkich jego reprezentacji. Dokumentacja Hugging Face opisuje ten mechanizm wraz z układem pamięci w poszczególnych warstwach.
Ta pamięć zależy od wag modelu. Dwa modele mogą przeczytać identyczne zdanie i zapisać je jako różne zestawy liczb. Zgodny rozmiar tablic nie oznacza jeszcze zgodnego znaczenia ich zawartości. Cache modelu A pozostaje poprawny dla A, ale nie staje się przez to poprawnym wejściem dla B.
Odbiorca może odtworzyć pamięć z tekstu przez prefill. To koszt obliczeń; jego przełożenie na rachunek użytkownika zależy od sposobu rozliczania usługi.
Jak przeliczyć jedną reprezentację na drugą
Nvidia traktuje tę niezgodność jako problem reprezentacji: czy z wektorów jednego modelu da się przewidzieć wektory potrzebne drugiemu? Procedurę można prześledzić w kodzie kalibracji niezależnego projektu kvbridge.
Najpierw oba modele przetwarzają ten sam zestaw przykładowych tekstów. Zapisujemy ich K i V. Następnie dla każdej warstwy docelowej wybieramy kilka warstw źródłowych, których pamięć najlepiej pozwala przewidzieć jej zawartość. Łączymy informacje z tych warstw i dopasowujemy osobne przekształcenia dla kluczy oraz wartości.
Służy do tego regresja grzbietowa, czyli regresja liniowa z karą stabilizującą rozwiązanie. W uproszczeniu szukamy macierzy W i przesunięcia b, aby pamięć_A × W + b możliwie dobrze odtwarzała pamięć_B. Nie zmieniamy wag samych modeli. Przygotowujemy konwerter dla konkretnego kierunku transferu; później można go wielokrotnie stosować do nowych kontekstów.
Pozostaje pozycja tokenu. RoPE to sposób kodowania pozycji przez obracanie wektorów. Konwerter odwraca obrót kluczy modelu źródłowego, przelicza je i nakłada obrót właściwy dla odbiorcy. Wartości przelicza bez tego kroku. Tak działa funkcja transferu w kvbridge. Oddzielenie pozycji upraszcza używanie konwertera dla różnych długości kontekstu, ale samo w sobie nie gwarantuje zachowania jakości.
Model docelowy dostaje w ten sposób przybliżoną pamięć wcześniejszego tekstu. Może korzystać z niej podczas dalszego generowania, pomijając prefill przeniesionego fragmentu. Nowe pytanie lub nowe wyniki narzędzi nadal trzeba przetworzyć.
Co znaczy zachować 98% jakości
Nvidia badała modele z pełną uwagą, wewnątrz rodzin, ze wspólnym tokenizerem i zgodną geometrią KV: liczbą głów oraz ich wymiarem. Wyniki zależały od pary:
| Transfer | Średnia retencja | Retencja w GSM8K |
|---|---|---|
| Qwen3 14B → 32B | 97,6% | 95,6% |
| Qwen3 8B → 32B | 87,5% | 68,8% |
| Llama 3.1 8B → 70B | 72,8% | 18,2% |
| Ministral 3 3B → 8B | 76,2% | 36,6% |
| Ministral 3 3B → 14B | 44,2% | 3,2% |
| Ministral 3 8B → 14B | 41,6% | 1,6% |
Źródło: tabela 1 pracy Nvidii. Średnia obejmuje ARC-Challenge, HellaSwag, WinoGrande, MMLU i GSM8K. Ostatni test wymaga generowania rozwiązań zadań matematycznych.
Retencja porównuje wynik po transferze z wynikiem odbiorcy używającego własnego prefillu. Dla przykładowego modelu z trafnością 80% retencja 90% oznaczałaby trafność 72%. Nie oznacza ani 90% poprawnych odpowiedzi, ani zachowania 90% każdej zdolności modelu.
Dlatego kolumna matematyczna tak zmienia interpretację tabeli. Jeżeli przekazujemy problem mocniejszemu modelowi właśnie po to, żeby lepiej rozumował, średnia z kilku testów nie odpowiada na najważniejsze pytanie. Trzeba sprawdzić, czy po transferze nadal rozwiązuje ten rodzaj problemów lepiej niż model, od którego zaczęliśmy.
Na ten problem zwraca uwagę Imre Nagi w krytycznym omówieniu pracy. Jego argument dotyczy doboru testów: wynik zagregowany nie wystarcza do zatwierdzenia konwertera dla programowania, używania narzędzi czy matematyki. Jest to analiza opublikowanych pomiarów, bez własnej replikacji.
Szybsza konwersja i szybsze zadanie to dwa pomiary
Zakres 2,7–25× dotyczy konwersji względem ponownego prefillu. Dla Qwen3 14B → 32B i 32 768 tokenów było to 278 ms wobec 6975 ms. Pomiar na węźle 8×H100 z NVLink, w bf16, używał syntetycznych wejść. Uwzględniał przesyłanie między GPU, lecz nie dostarczenie przeliczonej pamięci do procesu odbiorcy. Prefill używał FlashAttention 2 i pomijał głowicę wyjściową. Warunki pomiaru
Niezależny kvbridge publikuje kod i wyniki dla Qwen3-1.7B → Qwen3-4B. Na A100, przy 16 384 tokenach, konwerterze korzystającym z 12 warstw źródłowych i medianie pięciu prób, podaje 290 ms konwersji wobec 1270 ms prefillu modelu 4B. Daje to około 4,4×, jeśli pamięć małego modelu już istnieje.
Jeżeli zaczynamy od samego tekstu, trzeba doliczyć 568 ms prefillu modelu 1.7B. Łącznie to około 858 ms, czyli przewaga maleje do 1,48×. Nadal mierzymy przygotowanie kontekstu, bez czasu generowania odpowiedzi.
Projekt podaje też średnią retencję 83,7% w trzech testach: HellaSwag, ARC-Challenge i MMLU. W MMLU model 4B po transferze uzyskuje 55,1%, podczas gdy sam model 1.7B osiąga 60,8%. Konwerter w bf16 zajmuje około 1,8 GB. To pomiary autora tej implementacji, na innej parze niż w głównych wynikach Nvidii, bez integracji z vLLM lub SGLang.
Te wyniki dobrze pasują do scenariusza trwającej rozmowy. Mały model już pracował, więc jego pierwszego odczytu nie wykonujemy specjalnie na potrzeby transferu. Możliwa oszczędność pojawia się w momencie zmiany modelu. Jeśli natomiast od początku wiadomo, że zadanie wymaga mocniejszego modelu, trzeba porównać cały wariant „mały model plus konwersja” z bezpośrednim uruchomieniem mocniejszego.
Od konwertera dla pary do wspólnej pamięci
Wcześniejsze Cache-to-Cache, czyli C2C, uczy sieć, która przekształca i łączy pamięć źródła z pamięcią odbiorcy. Pozwala modelom wymieniać informacje bez generowania pośredniej wiadomości tekstowej. Odbiorca nadal tworzy własny cache, dlatego wyników tego systemu nie należy czytać jako tego samego eksperymentu z pominięciem jego prefillu.
Jeszcze inny wariant opisuje badanie Google DeepMind nad wspólną przestrzenią KV. Każdy model dostaje adapter wejścia do tej przestrzeni i adapter wyjścia. Pozwala to uniknąć osobnego zestawu adapterów dla każdego połączenia. Eksperymenty dotyczyły modeli opartych na Gemma-2 o rozmiarach 100–400 mln parametrów, bez wliczania embeddingów, oraz krótkich sekwencji. To dowód możliwości takiego układu na małej skali.
Ta różnica zaczyna mieć znaczenie, gdy chcemy korzystać z większej liczby modeli. Przy osobnym konwerterze dla każdego kierunku trzy modele dają sześć możliwych przejść, a pięć modeli już dwadzieścia. Wspólna reprezentacja mogłaby uprościć rozbudowę takiego systemu, choć jakość i koszt adapterów nadal trzeba zmierzyć.
Z perspektywy projektowania agentów dochodzi więc kolejna cecha modelu: jak dobrze potrafi przejąć pracę po innym. Można wyobrazić sobie rodzinę modeli przygotowanych do współpracy od początku, z tanim modelem obsługującym rutynowe kroki i mocniejszym przejmującym trudniejsze fragmenty. Sprawdzianem byłaby pełna sekwencja: praca małego modelu, przekazanie pamięci, decyzja mocniejszego i powrót. Gdyby taki układ zachował jakość, moglibyśmy wybierać model osobno dla etapu pracy, bez każdorazowego odtwarzania całego kontekstu.
Wykorzystuję treści generowane przez AI jako część mojego codziennego procesu nauki.