QLoRA składa się z trzech komponentów technicznych. (1) 4-bit NormalFloat (NF4) — nowy typ danych do kwantyzacji wag. Wagi sieci neuronowych mają rozkład w przybliżeniu normalny (zero-centered), więc NF4 używa kwantyli rozkładu normalnego jako poziomów kwantyzacji — to information-theoretically optimal dla danych o tym rozkładzie, lepsze niż zwykły 4-bit int lub float. (2) Double Quantization (DQ) — kwantyzuje się także stałe kwantyzacji (quantization constants). Każdy blok 64 wag ma własną stałą skalującą w 32-bit; DQ kwantyzuje te stałe do 8-bit, oszczędzając ~0.37 bit/parametr (dla 65B = ~3 GB). (3) Paged Optimizers — używają unified memory NVIDIA do automatycznego przerzucania stanów optymalizatora między GPU a CPU RAM, gdy pojawia się memory spike (np. długa sekwencja), zapobiegając OOM. Forward/backward: zamrożone wagi NF4 są dekwantyzowane do bf16 w locie podczas mnożenia macierzy, gradient płynie tylko przez adaptery LoRA (W + BA, gdzie B∈R^{d×r}, A∈R^{r×k}, r≪d). Baza nigdy nie jest aktualizowana. Wynik: jakość Guanaco (QLoRA na Llama 65B) dorównuje ChatGPT na Vicuna benchmark przy treningu na jednym GPU w 24h.
Pełen fine-tuning LLM wymaga trzymania wag, gradientów i stanów optymalizatora w 16-bit — dla modelu 65B to >780 GB VRAM, czyli klaster wielu GPU. Sama LoRA redukuje liczbę trenowanych parametrów, ale zamrożony model bazowy nadal musi siedzieć w 16-bit (130 GB dla 65B). QLoRA atakuje ten ostatni koszt: kwantyzuje zamrożoną bazę do 4-bit, dzięki czemu 65B mieści się w ~35 GB, a całość fine-tuningu w 48 GB. Kluczowe było wykazanie, że 4-bit baza + adaptery LoRA NIE pogarszają jakości — wcześniej zakładano, że agresywna kwantyzacja podczas treningu degraduje wyniki.
Model bazowy skwantyzowany do 4-bit typu NormalFloat. Poziomy kwantyzacji to kwantyle rozkładu normalnego — optymalne dla wag zero-centered. Dekwantyzowany do bf16 w locie podczas matmul, nigdy nie aktualizowany.
Oficjalna
Trenowane macierze B∈R^{d×r}, A∈R^{r×k} (r≪d) w bf16. Jedyna część aktualizowana gradientem. Dla najlepszej jakości podpięte do WSZYSTKICH warstw liniowych.
Stałe skalujące bloków NF4 (normalnie 32-bit) są same kwantyzowane do 8-bit. Oszczędza ~0.37 bit/parametr (~3 GB dla 65B) bez utraty jakości.
Oficjalna
Stany optymalizatora (np. AdamW 8-bit) są paginowane między GPU a CPU RAM przez NVIDIA unified memory przy memory spikes, zapobiegając OOM.
Oficjalna
Naiwne LoRA podpina adaptery tylko do q/v. QLoRA pokazuje, że dla osiągnięcia jakości full fine-tuningu adaptery MUSZĄ być na wszystkich warstwach liniowych (włącznie z MLP gate/up/down). Pominięcie tego zostawia jakość na stole.
NF4 jest dopasowany do rozkładu normalnego wag i empirycznie bije int4/fp4. Użycie gorszego typu kwantyzacji obniża jakość bez powodu.
Adaptery LoRA są w bf16, baza w 4-bit. Naiwny merge (W + BA) do 4-bit bazy gubi precyzję adapterów. Należy merge'ować do 16-bit dekwantyzowanej bazy lub trzymać adaptery osobno.
Memory spikes na długich sekwencjach (gradient checkpointing przeładowuje) powodują OOM mimo że średnie zużycie mieści się w VRAM. Paged optimizer rozwiązuje to przez unified memory.
Low-Rank Adaptation — trenowanie tylko niskorangowych adapterów zamiast pełnych wag. Fundament QLoRA.
Ten sam autor wprowadza 8-bit kwantyzację inferencji LLM bez utraty jakości (biblioteka bitsandbytes). Bezpośredni prekursor 4-bit kwantyzacji QLoRA.
Dettmers, Pagnoni, Holtzman, Zettlemoyer publikują QLoRA (arXiv:2305.14314, NeurIPS 2023). NF4 + Double Quantization + Paged Optimizers pozwalają dotrenować 65B na jednym GPU 48 GB. Model Guanaco dorównuje ChatGPT na Vicuna benchmark.
QLoRA trafia do PEFT i Transformers w ciągu tygodni — `load_in_4bit=True` + LoRA staje się jednolinijkową receptą. Masowa adopcja społeczności open-source.
Powstają zoptymalizowane frameworki (Unsloth z custom Triton kernelami daje 2× szybszy QLoRA), które czynią 4-bit fine-tuning standardem na consumer hardware.
Następcy poprawiają QLoRA: DoRA (rozdziela magnitude/direction), LoftQ (lepsza inicjalizacja adapterów dla kwantyzowanej bazy), QA-LoRA (kwantyzacyjnie-świadome adaptery dla deployment 4-bit po fine-tuningu).
Złożoność czasowa: O(T · |θ|) + narzut dekwantyzacji NF4→bf16 (~5–30% nad bf16 LoRA). Złożoność przestrzenna: O(0.5 · |θ|) baza (4-bit) + O(2 · r · d · L) adaptery + O(optimizer 8-bit).
Każdy matmul wymaga dekwantyzacji bloku wag z NF4 do bf16. To główny narzut czasowy QLoRA względem czystego LoRA. Custom kernele (Unsloth Triton) redukują go z ~30% do ~5–10%.
Ranga macierzy adapterów B i A. Determinuje liczbę trenowanych parametrów (2·r·d per warstwa). QLoRA pokazuje, że nawet małe r=8–64 wystarcza — większe r nie poprawia jakości, bo limit leży w danych nie w pojemności adaptera.
Typ kwantyzacji bazy. NF4 (4-bit NormalFloat) to flagowy wkład — optymalny dla wag o rozkładzie normalnym. FP4 jest alternatywą, gorszą empirycznie. Praca dowodzi przewagi NF4 nad FP4 i int4.
Czy kwantyzować stałe kwantyzacji. Oszczędza ~0.37 bit/parametr (~3 GB dla 65B) przy zerowej utracie jakości. Niemal zawsze włączone.
Liczba wag dzielących jedną stałą skalującą. Mniejszy blok = dokładniejsza kwantyzacja ale więcej stałych. Praca używa 64 dla NF4 i 256 dla DQ.
Czy używać unified memory do paginowania stanów optymalizatora przy memory spikes. Zapobiega OOM przy długich sekwencjach. Bez kosztu jakości, niewielki narzut czasu przy spike.
Które warstwy dostają adaptery. Praca pokazuje, że dla najlepszej jakości należy podpiąć LoRA do WSZYSTKICH warstw liniowych (q,k,v,o,gate,up,down), nie tylko attention — to istotne odkrycie odróżniające QLoRA od naiwnego LoRA.
QLoRA modyfikuje reprezentację wag i ścieżkę treningu, nie strukturę modelu — sieć pozostaje gęsta. Można łączyć z MoE (kwantyzacja ekspertów) ale to ortogonalne.
QLoRA to standardowy supervised training z dodatkową dekwantyzacją w locie. Skaluje się przez DDP/FSDP; dekwantyzacja NF4→bf16 jest tania i równoległa. Główny zysk to redukcja pamięci, nie zmiana profilu równoległości.
QLoRA został zaprojektowany pod NVIDIA GPU z bitsandbytes (custom CUDA kernels dla NF4 dekwantyzacji) i unified memory (paged optimizers). Działa od consumer RTX 3090/4090 po data-center A100/H100.
Idea jest przenośna, ale efektywne 4-bit kernele NF4 są CUDA-first. Wsparcie ROCm/Metal istnieje, ale mniej dojrzałe.