왜 PEFT가 필요한가?
최신 대규모 언어 모델(LLM)을 파인튜닝하려면 엄청난 GPU 메모리와 계산 자원이 필요합니다. 예를 들어 LLaMA-2 7B 모델을 전체 파인튜닝하면 약 60GB 이상의 GPU 메모리가 필요하죠. 하지만 LoRA, QLoRA, DoRA 같은 파라미터 효율적 파인튜닝(PEFT) 기법을 사용하면 16GB GPU로도 충분히 파인튜닝이 가능합니다.
핵심 포인트: PEFT 기법은 전체 모델 파라미터를 학습하지 않고, 소수의 파라미터만 업데이트하여 메모리와 시간을 획기적으로 절약합니다.
LoRA(Low-Rank Adaptation): 가장 기본이 되는 기법
LoRA의 핵심 원리
LoRA는 2021년 Microsoft에서 발표한 기법으로, 저랭크 행렬 분해를 활용합니다. 기존 가중치 행렬 W를 고정하고, 두 개의 작은 행렬 A와 B의 곱으로 변화량을 표현합니다.
# LoRA 업데이트 수식
# W' = W + BA (W는 고정, B와 A만 학습)
# W: d×d, B: d×r, A: r×d (r << d)
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=8, # 랭크 (낮을수록 파라미터 적음)
lora_alpha=32, # 스케일링 계수
target_modules=["q_proj", "v_proj"], # 적용할 레이어
lora_dropout=0.1,
bias="none"
)
model = get_peft_model(base_model, config)
model.print_trainable_parameters()
# 출력: trainable params: 4.2M || all params: 6.7B || trainable%: 0.06%
LoRA의 장단점
장점:
– 학습 파라미터를 0.1% 미만으로 줄임
– 추론 시 원본 가중치와 병합 가능 (레이턴시 증가 없음)
– 여러 태스크용 어댑터를 교체하며 사용 가능
단점:
– 여전히 전체 모델을 메모리에 로드해야 함 (FP16 기준)
– Quantization 없이는 대형 모델에서 메모리 부족 발생
QLoRA(Quantized LoRA): 메모리 최적화의 게임 체인저
QLoRA의 혁신
QLoRA는 LoRA에 4비트 양자화(Quantization)를 결합한 기법입니다. 2023년 발표 후 가장 널리 사용되는 PEFT 방법이 되었습니다.
핵심 기술 3가지:
1. 4비트 NormalFloat(NF4): 정규분포에 최적화된 양자화
2. Double Quantization: 양자화 상수까지 양자화
3. Paged Optimizers: CPU-GPU 메모리 자동 관리
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import prepare_model_for_kbit_training, LoraConfig
# QLoRA 설정
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto"
)
model = prepare_model_for_kbit_training(model)
lora_config = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05)
model = get_peft_model(model, lora_config)
메모리 절감 효과
| 모델 크기 | Full FT | LoRA (FP16) | QLoRA (4bit) |
|---|---|---|---|
| 7B | ~60GB | ~30GB | ~10GB |
| 13B | ~120GB | ~55GB | ~16GB |
| 65B | ~500GB | ~250GB | ~80GB |
실전 팁: RTX 4090(24GB)로도 QLoRA를 사용하면 13B 모델까지 파인튜닝 가능합니다!
DoRA(Weight-Decomposed LoRA): 성능 향상의 새로운 접근
DoRA의 차별점
DoRA는 2024년 발표된 최신 기법으로, 가중치를 방향(Direction)과 크기(Magnitude) 두 성분으로 분해합니다.
수식:
W' = m · (W + BA) / ||W + BA||
- m: 크기 성분 (학습 가능)
- (W + BA) / ||W + BA||: 방향 성분
from peft import LoraConfig
# DoRA 활성화
config = LoraConfig(
r=8,
lora_alpha=16,
use_dora=True, # DoRA 활성화
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"]
)
DoRA vs LoRA 성능 비교
| 벤치마크 | LoRA (r=8) | DoRA (r=8) | Full FT |
|---|---|---|---|
| GSM8K | 42.3% | 48.7% | 51.2% |
| MMLU | 51.2% | 54.8% | 56.1% |
| HumanEval | 28.5% | 33.2% | 35.7% |
DoRA는 동일한 파라미터 수로 LoRA 대비 5-15% 성능 향상
세 기법 총정리 비교표
| 특징 | LoRA | QLoRA | DoRA |
|---|---|---|---|
| 메모리 효율 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 성능 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 학습 속도 | 빠름 | 중간 | 중간 |
| 구현 난이도 | 쉬움 | 쉬움 | 쉬움 |
| 추천 사용처 | 일반 파인튜닝 | 메모리 제약 환경 | 성능 중요 태스크 |
| GPU 요구사항 | 24GB+ | 10GB+ | 24GB+ |
실무 활용 가이드
상황별 최적 선택
-
GPU 메모리가 충분한 경우 (A100 40GB+)
– LoRA 또는 DoRA 사용
– 더 높은 랭크(r=32~64) 시도 가능 -
제한된 GPU 환경 (RTX 3090/4090 24GB)
– QLoRA 필수
– Gradient checkpointing 활성화 -
성능이 최우선인 경우
– DoRA 사용 (QLoRA + DoRA 조합도 가능)
– 여러 랭크 실험으로 최적값 탐색
하이퍼파라미터 튜닝 팁
# 추천 시작 설정
config = LoraConfig(
r=16, # 8~64 범위에서 실험
lora_alpha=32, # 보통 r의 2배
lora_dropout=0.05, # 과적합 방지
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], # Attention 전체
use_dora=False, # 성능 필요시 True
)
training_args = TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=4, # 효과적인 배치 사이즈 16
learning_rate=2e-4, # PEFT는 높은 LR 가능
fp16=True, # A100에서는 bf16 추천
)
마무리
LoRA는 PEFT의 기본이자 표준으로, 간단하면서도 효과적입니다. QLoRA는 4비트 양자화로 메모리 사용량을 1/3 수준으로 줄여 소형 GPU에서도 대형 모델 파인튜닝을 가능하게 만들었습니다. DoRA는 가중치 분해를 통해 동일한 파라미터 수로 더 높은 성능을 달성합니다.
실무에서는 메모리 제약이 있다면 QLoRA, 성능이 중요하다면 DoRA, 일반적인 경우 LoRA를 선택하면 됩니다. 세 기법 모두 HuggingFace PEFT 라이브러리에서 몇 줄의 코드로 쉽게 구현할 수 있어, 직접 실험해보며 프로젝트에 최적인 방법을 찾는 것을 추천합니다.
최종 권장: 먼저 QLoRA로 시작해 베이스라인을 만들고, 필요에 따라 DoRA나 LoRA로 확장하는 전략이 가장 효율적입니다.
이 글이 도움이 되셨나요? ☕
Buy me a coffee
Anomynous에 답글 남기기 응답 취소