INT4
Jak działa
INT4 mapuje ciągłe wartości wag na 16 dyskretnych poziomów całkowitych. Dla każdej grupy wag (np. 32, 64 lub 128 elementów) wyznacza się skalę (scale) oraz opcjonalnie punkt zerowy (zero-point), tak aby zakres grupy zmieścił się w [0,15] (asymetryczna) lub [-8,7] (symetryczna). Podczas inferencji wagi dekwantyzuje się w locie do FP16/FP32 tuż przed mnożeniem macierzy albo używa się dedykowanych kerneli, które mnożą bezpośrednio na spakowanych wartościach. Kwantyzacja grupowa (group-wise) ogranicza błąd, bo każda grupa ma własną skalę dopasowaną do lokalnego rozkładu wag. Metody takie jak GPTQ i AWQ dobierają kwantyzację minimalizując błąd wyjścia warstwy, a nie tylko błąd samych wag.
Rozwiązany problem
Wagi dużych modeli językowych w FP16 zajmują dziesiątki lub setki gigabajtów, przekraczając pamięć pojedynczych akceleratorów i limitując przepustowość inferencji, która jest ograniczona przepustowością pamięci. INT4 rozwiązuje to, kompresując wagi do 4 bitów, dzięki czemu model mieści się w mniejszej pamięci i mniej danych trzeba czytać z pamięci na każdy token.
Kluczowe mechanizmy
Mocne strony i ograniczenia
Komponenty
Każda waga koduje się jako jedna z 16 wartości całkowitych (0-15 lub -8..7), zajmując 4 bity zamiast 16 lub 32.
Współczynnik zmiennoprzecinkowy odwzorowujący zakres całkowity na rzeczywisty zakres wag danej grupy; przechowywany zwykle w FP16.
Przesunięcie całkowite w kwantyzacji asymetrycznej, pozwalające odwzorować rozkłady wag nieskupione wokół zera; w kwantyzacji symetrycznej pomijany.
Implementacja
Duże wartości odstające w aktywacjach lub wagach powodują, że naiwna kwantyzacja 4-bit gwałtownie traci dokładność, zwłaszcza w większych modelach.
Duża grupa (np. per-tensor) obniża narzut pamięci na skalę, ale zwiększa błąd kwantyzacji; zbyt mała grupa zwiększa narzut i może spowolnić kernele.
Ewolucja
GPTQ dowodzi, że modele rzędu 100B+ można skwantyzować do INT4 z minimalną utratą jakości metodą post-training.
AWQ (kwantyzacja świadoma aktywacji) oraz QLoRA (fine-tuning na wagach 4-bit NF4) czynią INT4 domyślnym formatem lokalnej inferencji i taniego dostrajania.
Formaty Q4 (K-quants) w llama.cpp umożliwiają uruchamianie modeli LLaMA na laptopach i CPU, upowszechniając 4-bitową inferencję.
Hiperparametry (konfigurowalne osie)
Liczba wag dzielących jedną skalę; mniejsza grupa poprawia dokładność kosztem narzutu.
Symetryczna (bez zero-point) lub asymetryczna (z zero-point) mapa wartości.
Algorytm doboru wartości skwantyzowanych.
Złożoność obliczeniowa
Złożoność czasowa: O(1) na wagę przy dekwantyzacji + koszt mnożenia macierzy. Złożoność przestrzenna: 0,5 bajta / waga (+ narzut skal/zero-point).
Metody takie jak GPTQ i AWQ pozwalają skwantyzować modele 7-70B do 4 bitów z niewielkim wzrostem perplexity (często poniżej 0,1-0,5 na WikiText-2 dla większych modeli) względem FP16. Praktyczny zysk to ~4-krotna redukcja pamięci wag; np. model 70B w FP16 (~140 GB) mieści się w INT4 w ~35-40 GB, co umożliwia uruchomienie na pojedynczej karcie 48 GB.
Wąskie gardło obliczeniowe
W inferencji INT4 wąskim gardłem jest odczyt spakowanych wag z pamięci oraz ich dekwantyzacja; właśnie redukcja bajtów na token daje przyspieszenie.
Paradygmat wykonania
Wszystkie warstwy działają gęsto; zmienia się jedynie reprezentacja wag.
INT4 to schemat kompresji wag; nie wprowadza routingu ani warunkowej aktywacji.
Równoległość
Dekwantyzacja i mnożenia macierzy są w pełni równoległe; grupy kwantyzowane są niezależnie.
Wymagania sprzętowe
Dedykowane kernele (np. Marlin, ExLlama, bitsandbytes) wykonują mnożenie z wagami INT4 i aktywacjami FP16, wykorzystując przepustowość pamięci GPU.
llama.cpp implementuje wydajne kernele INT4 (Q4) na CPU z instrukcjami SIMD (AVX2/AVX-512, NEON), umożliwiając inferencję LLM bez GPU.