PEFT
Parameter-Efficient Fine-Tuning
일부 파라미터만 업데이트하여 효율적으로 모델을 적응시키는 기법들의 총칭.
Parameter-Efficient Fine-Tuning
일부 파라미터만 업데이트하여 효율적으로 모델을 적응시키는 기법들의 총칭.
PEFT(Parameter-Efficient Fine-Tuning)는 대규모 언어 모델(LLM)의 전체 파라미터 대신 일부 파라미터만 업데이트하여 효율적으로 모델을 특정 태스크에 적응시키는 기법들의 총칭입니다. 수십~수천억 파라미터를 가진 모델을 소수의 GPU로도 파인튜닝할 수 있게 해줍니다.
PEFT는 LLM 시대에 등장한 핵심 기술입니다. GPT-3(175B), LLaMA(65B) 등 대형 모델의 전체 파라미터를 학습하려면 수백 GB의 GPU 메모리가 필요하지만, PEFT를 사용하면 일반 소비자용 GPU로도 파인튜닝이 가능해졌습니다.
대표적인 PEFT 기법으로는 LoRA(Low-Rank Adaptation), QLoRA, Prefix Tuning, Prompt Tuning, Adapter 등이 있습니다. LoRA는 가중치 행렬에 저랭크(low-rank) 분해 행렬을 추가하여 0.1~1%의 파라미터만으로 Full Fine-tuning에 가까운 성능을 달성합니다.
실무에서는 비용과 시간을 획기적으로 절감합니다. 7B 모델 기준 LoRA는 8GB VRAM으로 학습이 가능하고, 태스크별 어댑터를 분리 저장하여 하나의 기본 모델로 여러 용도에 활용할 수 있습니다.
# PEFT (LoRA) 파인튜닝 예제
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model, TaskType
from datasets import load_dataset
from trl import SFTTrainer
# 1. 기본 모델 로드
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto" # 자동으로 GPU에 분산
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. LoRA 설정 (핵심!)
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16, # LoRA 랭크 (낮을수록 파라미터 적음)
lora_alpha=32, # 스케일링 팩터
lora_dropout=0.1, # Dropout
target_modules=["q_proj", "v_proj"], # 적용할 레이어
)
# 3. PEFT 모델로 변환
peft_model = get_peft_model(model, lora_config)
# 학습 가능한 파라미터 확인
peft_model.print_trainable_parameters()
# 출력: trainable params: 4M || all params: 7B || trainable%: 0.05%
# 4. 학습 설정
training_args = TrainingArguments(
output_dir="./lora-output",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
fp16=True, # 메모리 절약
)
# 5. 학습 및 저장
trainer = SFTTrainer(
model=peft_model,
args=training_args,
train_dataset=load_dataset("your_dataset")["train"],
)
trainer.train()
# 6. 어댑터만 저장 (수 MB 크기)
peft_model.save_pretrained("./my-lora-adapter")
"7B 모델을 Full Fine-tuning하려면 A100 80GB가 여러 대 필요하지만, LoRA를 사용하면 RTX 4090 한 장으로도 충분합니다. 비용을 90% 이상 절감할 수 있습니다."
"LoRA는 가중치 행렬 W를 W + BA로 분해합니다. B와 A는 저랭크 행렬이라 파라미터 수가 적고, 추론 시 병합하면 추가 지연 없이 사용할 수 있습니다."
"QLoRA는 4비트 양자화된 모델에 LoRA를 적용하는 기법입니다. 메모리를 더욱 절약하면서도 16비트 파인튜닝과 동등한 성능을 보여주는 연구 결과가 있습니다."
r=4 등 너무 낮은 랭크는 표현력이 부족합니다. 일반적으로 r=16~64가 권장되며, 복잡한 태스크는 더 높은 값을 사용하세요.
모든 레이어에 적용하면 파라미터가 늘어나 PEFT의 장점이 줄어듭니다. q_proj, v_proj 또는 attention 레이어만 적용해도 충분합니다.
태스크 복잡도에 따라 rank를 조절하고, target_modules는 실험을 통해 최적화하세요. 어댑터는 기본 모델과 분리 저장하여 여러 태스크에 재사용합니다.