GPT-3는 파라미터가 1750억 개입니다. 이걸 전체 파인튜닝하려면 GPU 메모리가 수백 GB 필요합니다. 대부분의 개인·기업은 불가능하죠. LoRA는 이 문제를 우아하게 해결합니다.
| 구분 | Full Fine-tuning | LoRA |
|---|---|---|
| 학습 파라미터 | 전체 (100%) | 0.1~1% 수준 |
| GPU 메모리 | 수백 GB | 수 GB (소비자 GPU 가능) |
| 학습 속도 | 매우 느림 | 3~10배 빠름 |
| 원본 모델 수정 | 전체 가중치 변경 | 원본 동결, 어댑터만 추가 |
| 저장 용량 | 모델 전체 | 어댑터만 (수 MB~수백 MB) |
| 성능 | 기준 | 거의 동일 (~99%) |
모델을 파인튜닝할 때 가중치 변화량 $\Delta W$는 사실 매우 낮은 랭크를 가진다는 관찰에서 출발합니다. 큰 행렬을 두 개의 작은 행렬 곱으로 근사할 수 있다는 것이죠!
# 기존 Forward Pass h = x @ W # 원본 가중치 (동결) # LoRA Forward Pass h = x @ W + x @ (A @ B) * scale # 원본 + 저랭크 어댑터 # W는 동결, A와 B만 학습!
| Rank (r) | 파라미터 수 | 메모리 | 성능 | 추천 상황 |
|---|---|---|---|---|
| r = 4 | 최소 | 최소 | 기본 | 빠른 실험, 리소스 제한 |
| r = 8 | 소 | 소 | 좋음 | 일반적 권장 (기본값) |
| r = 16 | 중 | 중 | 더 좋음 | 복잡한 태스크 |
| r = 64 | 대 | 대 | 최상 | Full Fine-tuning에 근접 |
from peft import LoraConfig, get_peft_model from transformers import AutoModelForCausalLM # 1. 기본 모델 로드 model = AutoModelForCausalLM.from_pretrained("gpt2") # 2. LoRA 설정 config = LoraConfig( r=8, # 랭크 lora_alpha=32, # 스케일링 파라미터 target_modules=["q_proj", "v_proj"], # 어느 레이어에 적용? lora_dropout=0.1, bias="none", ) # 3. PEFT 모델 생성 peft_model = get_peft_model(model, config) # 4. 학습 가능한 파라미터 확인 peft_model.print_trainable_parameters() # trainable params: 294,912 || all params: 124,734,720 || trainable%: 0.24%
| 기법 | 특징 | LoRA 대비 |
|---|---|---|
| LoRA | 원조, A·B 행렬 추가 | 기준 |
| QLoRA | 4비트 양자화 + LoRA | 메모리 추가 절약, 70B 모델도 소비자 GPU에서 가능 |
| AdaLoRA | 중요도 기반 랭크 자동 조정 | 더 효율적 |
| DoRA | 방향·크기 분리 학습 | 성능 소폭 향상 |
| LoRA+ | A·B에 다른 학습률 적용 | 수렴 빠름 |