Step 17 LoRA: 효율적인 파인튜닝

거대 모델을 가볍게 - Low-Rank Adaptation으로 적은 비용에 성능 극대화

1. 왜 LoRA가 필요한가?

GPT-3는 파라미터가 1750억 개입니다. 이걸 전체 파인튜닝하려면 GPU 메모리가 수백 GB 필요합니다. 대부분의 개인·기업은 불가능하죠. LoRA는 이 문제를 우아하게 해결합니다.

📊 Full Fine-tuning vs LoRA 비교

구분Full Fine-tuningLoRA
학습 파라미터전체 (100%)0.1~1% 수준
GPU 메모리수백 GB수 GB (소비자 GPU 가능)
학습 속도매우 느림3~10배 빠름
원본 모델 수정전체 가중치 변경원본 동결, 어댑터만 추가
저장 용량모델 전체어댑터만 (수 MB~수백 MB)
성능기준거의 동일 (~99%)

2. LoRA의 핵심 아이디어: 저랭크 분해

모델을 파인튜닝할 때 가중치 변화량 $\Delta W$는 사실 매우 낮은 랭크를 가진다는 관찰에서 출발합니다. 큰 행렬을 두 개의 작은 행렬 곱으로 근사할 수 있다는 것이죠!

🧮 수학적 원리

Low-Rank Decomposition Full Weight Change ΔW d × d (예: 4096×4096) = 16M 파라미터! A (다운) A d × r (4096×8) × B (업) B r × d (8×4096) r = rank (랭크) 보통 4, 8, 16, 64 A: 4096×8 = 32K B: 8×4096 = 32K 합계: 64K vs 16M → 250배 절약!
# 기존 Forward Pass
h = x @ W                          # 원본 가중치 (동결)

# LoRA Forward Pass
h = x @ W + x @ (A @ B) * scale   # 원본 + 저랭크 어댑터
# W는 동결, A와 B만 학습!

3. LoRA 동작 방식 시각화

🏗️ LoRA 레이어 구조

LoRA 어댑터 구조 입력 x 원본 W (동결) 학습 안 함 A (학습, d×r) B (학습, r×d) + 출력 h = Wx + BAx

4. Rank(랭크) 설정에 따른 차이

⚙️ Rank 값 가이드

Rank (r)파라미터 수메모리성능추천 상황
r = 4최소최소기본빠른 실험, 리소스 제한
r = 8좋음일반적 권장 (기본값)
r = 16더 좋음복잡한 태스크
r = 64최상Full Fine-tuning에 근접

5. PEFT 라이브러리로 LoRA 사용하기

💻 코드 예시

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%

6. LoRA 계열 기법들

🌱 LoRA에서 파생된 기법들

기법특징LoRA 대비
LoRA원조, A·B 행렬 추가기준
QLoRA4비트 양자화 + LoRA메모리 추가 절약, 70B 모델도 소비자 GPU에서 가능
AdaLoRA중요도 기반 랭크 자동 조정더 효율적
DoRA방향·크기 분리 학습성능 소폭 향상
LoRA+A·B에 다른 학습률 적용수렴 빠름

✅ LoRA 핵심 정리