K-quants
Jak działa
1) Wagi tensora dzielone są na super-bloki po 256 wag. 2) Super-blok dzieli się na mniejsze bloki: 16 bloków po 16 wag (Q2_K, Q3_K, Q6_K) albo 8 bloków po 32 wagi (Q4_K, Q5_K). 3) Każdy blok ma własną skalę; typy „type-1" (Q2_K, Q4_K, Q5_K) mają też własne minimum (wzór w = q · block_scale + block_min), a typy „type-0" (Q3_K, Q6_K) używają tylko skali (w = q · block_scale). 4) Same skale i minima są kwantyzowane osobno przy niskiej precyzji (np. 4-bit dla Q2_K, 6-bit dla Q3_K/Q4_K/Q5_K, 8-bit dla Q6_K), co daje efektywne bity na wagę: ok. 2,6 (Q2_K), 3,4375 (Q3_K), 4,5 (Q4_K), 5,5 (Q5_K), 6,5625 (Q6_K). 5) Warianty _S/_M/_L przypisują różne typy K-quant różnym tensorom modelu, balansując rozmiar i jakość. 6) Podczas inferencji bloki są dekwantyzowane w locie do mnożeń macierzowych; Q8_K służy do kwantyzacji wyników pośrednich w produktach skalarnych.
Rozwiązany problem
Wcześniejsze formaty round-to-nearest (Q4_0, Q4_1) z pojedynczą skalą na 32-wagowy blok traciły dużo jakości przy niskich bitach na wagę. K-quants ograniczają ten spadek jakości przy zbliżonym lub mniejszym rozmiarze, umożliwiając uruchamianie dużych modeli LLM na sprzęcie konsumenckim (CPU, ograniczona pamięć GPU).
Komponenty
Podstawowa jednostka kwantyzacji K-quant obejmująca 256 wag, dzielona dalej na mniejsze bloki. Wymaga, aby rozmiar wiersza tensora był podzielny przez 256.
Mniejszy blok wewnątrz super-bloku: 16 wag (Q2_K, Q3_K, Q6_K) lub 32 wagi (Q4_K, Q5_K). Każdy blok ma własną skalę (i minimum w type-1).
Skale (oraz minima w typach type-1) są kwantyzowane osobno przy niskiej precyzji: 4-bit (Q2_K), 6-bit (Q3_K/Q4_K/Q5_K), 8-bit (Q6_K). To one dają narzut ponad nominalną liczbę bitów kwantyzacji.
Predefiniowane mieszanki (small/medium/large) przypisujące różne typy K-quant do różnych tensorów (attention, feed-forward, wyjście), np. Q4_K_M, Q5_K_M, Q3_K_L, aby optymalizować kompromis perplexity/rozmiar.
Oficjalna
Implementacja
Rozmiar wiersza tensora musi być podzielny przez 256 (rozmiar super-bloku). Tensory, które tego nie spełniają, są kwantyzowane innym typem (np. fallback do Q8_0).
Najniższe typy (zwł. Q2_K) mocno podnoszą perplexity; bez macierzy ważności (imatrix) jakość małych modeli potrafi znacząco spaść.
Warianty _S/_M/_L to mieszanki wielu typów per tensor, a nie pojedynczy bit-width; realny rozmiar i jakość zależą od konkretnej mieszanki, nie tylko od głównej liczby (np. Q4_K_M vs Q4_K_S).
Ewolucja
Iwan Kawrakow dodaje typy Q2_K–Q6_K oraz Q8_K wraz z mieszankami _S/_M/_L.
Kwantyzacja z użyciem macierzy ważności poprawia jakość K-quant (i I-quant) przy niskich bitach na wagę.
Nowa rodzina IQ (IQ2_XXS, IQ3_S, IQ4_NL itd.) oparta na importance matrix osiąga niższe bity na wagę niż K-quants.
Złożoność obliczeniowa
Złożoność przestrzenna: ~2.6–6.6 bit/wagę.
Równoległość
Dekwantyzacja bloków jest niezależna między blokami/super-blokami, więc łatwo się zrównolegla na CPU (SIMD) i GPU.
Wymagania sprzętowe
K-quants zaprojektowano głównie pod wydajną inferencję na CPU (AVX2/AVX-512, ARM NEON) w llama.cpp/GGML.
Istnieją zoptymalizowane kernele CUDA/Metal do dekwantyzacji K-quant, umożliwiające inferencję i offloading na GPU.