개요
**LoRA(Low-Rank Adaptation)**는 대형 언어 모델을 효율적으로 파인튜닝하는 기법. 원본 모델 가중치는 고정하고, 저순위(Low-Rank) 행렬만 학습해 파라미터 수와 메모리를 대폭 절감.
- 논문: “LoRA: Low-Rank Adaptation of Large Language Models” (2021, Microsoft)
- 핵심 아이디어: 전체 가중치 업데이트 ΔW를 두 개의 작은 행렬 A·B의 곱으로 근사
작동 원리
기존 파인튜닝: W' = W + ΔW (W 전체 업데이트)
LoRA: W' = W + B × A (B, A만 학습)
W: d×d 원본 가중치 (고정)
A: d×r 행렬 (학습)
B: r×d 행렬 (학습)
r: rank (하이퍼파라미터, 보통 4~64)
→ r ≪ d 이므로 학습 파라미터 수가 극적으로 감소
장점
| 항목 | Full Fine-tuning | LoRA |
|---|---|---|
| 학습 파라미터 | 전체 | 0.1~1% |
| GPU 메모리 | 많이 필요 | 대폭 절감 |
| 학습 속도 | 느림 | 빠름 |
| 원본 모델 보존 | ❌ (덮어씀) | ✅ (고정) |
| 멀티 어댑터 | 불가 | 여러 LoRA 교체 가능 |
주요 변형
| 기법 | 설명 |
|---|---|
| QLoRA | LoRA + 4bit 양자화, 소비자용 GPU에서 70B 모델 파인튜닝 가능 |
| LoRA+ | Learning rate 분리 적용으로 성능 향상 |
| DoRA | 크기·방향 분리 학습 |
| AdaLoRA | rank를 레이어별로 적응적으로 배분 |
| LongLoRA | 긴 컨텍스트 파인튜닝 특화 |
실전 사용 (PEFT 라이브러리)
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B")
lora_config = LoraConfig(
r=16, # rank
lora_alpha=32, # 스케일링 계수
target_modules=["q_proj", "v_proj"], # 적용할 레이어
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 8,034,000,000 || trainable%: 0.05