TurboQuant: kompresja KV-cache w LLM 6 razy bez utraty dokładności
Google Research przedstawił TurboQuant — algorytm ekstremalnej kompresji KV-cache dla dużych modeli językowych. Zmniejszenie zużycia pamięci o co najmniej 6 razy towarzyszy przyspieszeniu inferencji nawet do 8 razy na GPU H100. Kluczowy efekt: zmniejszenie ograniczeń pasma pamięci bez pogorszenia jakości generacji.
KV-cache jako wąskie gardło inferencji
W trakcie generacji autoregresyjnej mechanizm uwagi w modelach językowych wykorzystuje wektory Key i Value z poprzednich tokenów. Pełne ponowne obliczanie kontekstu na każdym kroku jest nieefektywne, dlatego pośrednie reprezentacje są buforowane. KV-cache rośnie liniowo wraz ze wzrostem długości kontekstu, co ogranicza throughput i maksymalną długość kontekstu.
Na długich sekwencjach inferencja napotyka ograniczenie pasma pamięci: GPU spędza czas na czytaniu danych zamiast na obliczeniach. To zwiększa opóźnienia i koszty. TurboQuant rozwiązuje problem kompresji przy zachowaniu semantyki wektorów używanych przez mechanizm uwagi.
Zasada działania PolarQuant
Pierwszy etap — PolarQuant. Wektory są przekształcane do współrzędnych biegunowych po losowym obróceniu (rotation). Promień koduje długość wektora, kąt — jego kierunek.
# Pseudokod PolarQuant
rotated = rotate_random(vector)
rho = norm(rotated) # promień
phi = angle(rotated) # kąt
quantized = quantize(rho, phi)
Obrót upraszcza rozkład danych, czyniąc je bardziej przewidywalnymi dla kwantyzacji. Brak dodatkowego narzutu na bufor lub parametry — kompresja osiąga 3–4 bity na wartość bez potrzeby dopasowania modelu.
Kompensacja błędów przez QJL
Kwantyzacja wprowadza szum. Drugi etap — QJL (Quantized Johnson-Lindenstrauss) koduje resztę błędu w 1 bit na wartość. Przekształcenie zachowuje odległości euklidesowe między wektorami, co ma kluczowe znaczenie dla uwagi typu dot-product.
QJL aproksymuje lemat JL w wersji skwantyzowanej:
- Wejście: reszta po PolarQuant
- Wyjście: korekta 1-bitowa
- Właściwość: ||Qx - Qy|| ≈ ||x - y|| dla x, y ∈ KV-cache
Połączenie daje kompresję KV-cache do 1,25–2 bity na wartość z minimalną degradacją perplexity.
Benchmarki i wydajność
Testy na Llama-3.1-8B-Instruct (LongBench):
- Kompresja: 6–8 razy w porównaniu do podstawy
- Przyspieszenie obliczeń logitów: do 8 razy na H100 (bazowanie na JAX)
- Jakość: spadek poniżej 1% w zadaniach needle-in-haystack i długokontekstowych
Na GloVe (d=200) TurboQuant dominuje w równowadze recall vs stosunek kompresji (1:k optymalne).
| Metoda | Bity/wartość | Kompresja | Spadek perplexity |
|-------|------------|--------|------------------|
| Podstawa | 16 | 1x | 0% |
| INT8 | 8 | 2x | 0,5% |
| TurboQuant (3-bit) | 3 | 6x | 0,2% |
Do 3 bitów bez ponownego trenowania — przełom dla zero-shot quantization.
Co ważne
- Ekstremalna kompresja: KV-cache 6 razy mniejszy przy 3 bitach/wartość.
- Przyspieszenie inferencji: do 8 razy na obciążeniach pamięciowych.
- Zachowanie odległości: QJL gwarantuje zgodność z mechanizmem uwagi.
- Uniwersalność: działa w wyszukiwaniu wektorów i RAG.
- Bez dopasowania modelu: gotowa do użycia z istniejącymi LLM.
Zastosowanie poza LLM
TurboQuant wykracza poza ramy transformatorów. W bazach wektorowych kompresja embeddingów zachowuje funkcjonalność wyszukiwania ANN (HNSW, FAISS). Na urządzeniach krawędziowych zmniejsza wymagania dotyczące DRAM, umożliwiając inferencję lokalną.
Dla senior developerów: zintegruj w niestandardowe silniki inferencji. Obsługa JAX/Flax ułatwia prototypowanie. Testuj na długich kontekstach (>128k tokenów) by uzyskać rzeczywisty zysk.
— Editorial Team
Brak komentarzy.