ML Atlas

08 · LLM · 4 min czytania · aktualizacja

Czym jest LoRA i jak pozwala dostroić duży model na jednej karcie GPU?

W skrócie

LoRA zamraża wagi modelu i uczy małej poprawki: iloczynu dwóch wąskich macierzy. Trenuje ułamek procenta parametrów, a działa prawie jak pełne dostrajanie.

Co to jest

LoRA (Low-Rank Adaptation, Hu i in., 2021) to metoda dostrajania, w której oryginalne wagi modelu pozostają zamrożone, a uczy się tylko poprawki ΔW zapisanej jako iloczyn dwóch wąskich macierzy: ΔW = B·A. Dla macierzy wag d×k macierz B ma wymiar d×r, a A — r×k, gdzie ranga r jest mała (zwykle 4–64). Liczba trenowanych parametrów spada z d·k do r·(d + k).

LoRA należy do szerszej rodziny metod PEFT (parameter-efficient fine-tuning), które dostrajają mały ułamek parametrów. Inne przykłady to adaptery (małe warstwy wstawione między istniejące), prefix tuning i prompt tuning (uczone wektory dopisywane do wejścia). LoRA stała się najpopularniejsza, bo jest prosta, skuteczna i nie spowalnia działania gotowego modelu.

Praktyczny skutek: model, którego pełne dostrajanie wymagałoby kilku dużych kart GPU, można dostroić na jednej, a wynikowy „adapter” zajmuje megabajty zamiast gigabajtów.

Mechanizm — dlaczego tak działa

Hipoteza niskiego wymiaru zmian. Model po pretreningu już „umie” prawie wszystko, czego potrzeba. Dostosowanie go do zadania nie wymaga przebudowy całej macierzy 4096×4096, tylko przesunięcia w kilku kierunkach. Aghajanyan i in. (2021) pokazali, że dostrajanie dużych modeli ma niski „wymiar wewnętrzny”: dobre rozwiązanie istnieje w małej podprzestrzeni parametrów. Hu i in. przyjęli, że także sama zmiana wag ΔW ma niską rangę — i doświadczalnie to się potwierdza.

Ranga jako pokrętło pojemności. Macierz rangi r przekształca wejście, rzutując je najpierw na r kierunków (A), a potem rozkładając z powrotem na d wymiarów (B). Mała ranga oznacza mało stopni swobody: poprawka nie zdoła zapamiętać przypadkowych szczegółów, co działa jak regularyzacja. Zbyt mała ranga może jednak nie wystarczyć do zadań odległych od pretreningu.

Szczegóły, które mają znaczenie. Macierz B inicjuje się zerami, a A losowo, więc na starcie ΔW = 0 i model zachowuje się dokładnie jak oryginał. Poprawkę skaluje się czynnikiem α/r. W pierwotnej pracy LoRA nakładano na macierze zapytań i wartości w samouwadze; dziś często obejmuje się wszystkie macierze liniowe, co zwykle poprawia jakość.

Dlaczego to oszczędza pamięć. Gradienty i stan optymalizatora Adam liczy się tylko dla parametrów trenowanych. Zamrożone wagi wystarczy przechowywać w niskiej precyzji — QLoRA (Dettmers i in., 2023) trzyma je w 4 bitach, co pozwoliło dostroić model 65 mld parametrów na jednej karcie 48 GB.

Brak kosztu przy inferencji. Po treningu B·A można dodać do W i dostajemy zwykłą macierz tego samego rozmiaru — bez dodatkowych obliczeń. Można też trzymać jeden model bazowy i wiele adapterów, przełączanych zależnie od klienta czy zadania.

Ograniczenia. LoRA zwykle dorównuje pełnemu dostrajaniu w zadaniach bliskich pretreningowi, ale przy dużych zmianach dziedziny (nowy język, intensywna matematyka) może zostawać w tyle. Zapomina mniej niż pełne dostrajanie, ale też uczy się mniej.

Na przykładzie

Weźmy jedną macierz projekcji w samouwadze o wymiarach 4096×4096. Pełne dostrajanie zmienia 4096 · 4096 = 16 777 216 wag. LoRA z rangą r = 8 trenuje B (4096×8) i A (8×4096), razem 2 · 4096 · 8 = 65 536 parametrów — 0,39% oryginału, czyli 256 razy mniej.

W skali całego modelu: Llama 2 7B ma 32 warstwy. LoRA na macierzach zapytań i wartości w każdej warstwie to 32 · 2 · 65 536 ≈ 4,19 mln parametrów, około 0,06% z 6,7 mld. Zapisany w fp16 adapter waży 4,19 mln · 2 B ≈ 8,4 MB wobec około 13,5 GB wag modelu. Hu i in. (2021) dla GPT-3 175B podają zmniejszenie liczby trenowanych parametrów 10 000 razy i zużycia pamięci GPU trzykrotnie, przy jakości porównywalnej z pełnym dostrajaniem.

W praktyce

  • Biblioteka peft: LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05, target_modules=[...]) i get_peft_model(model, config).
  • Typowe wartości: r = 8–64, α = r lub 2·r, współczynnik uczenia rzędu 10⁻⁴ (wyższy niż przy pełnym dostrajaniu).
  • QLoRA: ładuj model w 4 bitach (BitsAndBytesConfig(load_in_4bit=True)) i trenuj adapter w 16 bitach.
  • Po treningu merge_and_unload() scala adapter z wagami, jeśli nie potrzebujesz przełączania adapterów.
  • Typowy błąd: zbyt mała ranga przy trudnym zadaniu albo pominięcie warstw MLP — gdy strata stoi, spróbuj większego r lub szerszego target_modules.

Najczęstsze pytania

Czy LoRA jest gorsza od pełnego dostrajania?
W wielu zadaniach daje porównywalną jakość. Przy dużych zmianach dziedziny pełne dostrajanie bywa lepsze, ale kosztuje wielokrotnie więcej pamięci i ryzykuje większe zapominanie.
Jaką rangę wybrać?
Zacznij od r = 8 lub 16. Jeśli model nie uczy się zadania, zwiększ rangę lub objęte macierze; jeśli przeucza się na małym zbiorze, zmniejsz ją lub dodaj dropout.
Czy LoRA spowalnia model?
Nie, jeśli scalisz adapter z wagami. Bez scalania dochodzi niewielki dodatkowy koszt dwóch wąskich mnożeń macierzy na warstwę.

Źródła

  • Hu E. J. i in., 2021, „LoRA: Low-Rank Adaptation of Large Language Models”, arXiv:2106.09685 (ICLR 2022).
  • Dettmers T. i in., 2023, „QLoRA: Efficient Finetuning of Quantized LLMs”, NeurIPS 2023.
  • Aghajanyan A., Gupta S., Zettlemoyer L., 2021, „Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning”, ACL 2021.
  • Houlsby N. i in., 2019, „Parameter-Efficient Transfer Learning for NLP”, ICML 2019.
  • Dokumentacja Hugging Face PEFT, https://huggingface.co/docs/peft

Zobacz też