LoRA
Low-Rank Adaptation
효율적인 LLM 파인튜닝 기법. 소수 파라미터만 학습. 메모리 절약.
Low-Rank Adaptation
효율적인 LLM 파인튜닝 기법. 소수 파라미터만 학습. 메모리 절약.
LoRA(Low-Rank Adaptation)는 대규모 언어 모델을 효율적으로 파인튜닝하는 기법입니다. 전체 모델 가중치를 업데이트하는 대신, 작은 저랭크(Low-Rank) 행렬만 학습하여 메모리와 계산 비용을 획기적으로 줄입니다.
Microsoft 연구팀이 2021년 발표한 LoRA는 GPT-3 175B 모델 파인튜닝에 필요한 학습 파라미터를 10,000배 줄이고, GPU 메모리를 3분의 1로 감소시켰습니다. 이를 통해 소비자 GPU(RTX 3090, RTX 4090 등)에서도 LLM 파인튜닝이 가능해졌습니다.
LoRA의 핵심 아이디어는 가중치 업데이트가 낮은 내재 랭크(intrinsic rank)를 가진다는 가설입니다. 원본 가중치 W에 대해 W' = W + BA 형태로 분해하며, A와 B는 저랭크 행렬입니다. 랭크 r=4~8 정도로 설정해도 전체 파인튜닝과 동등한 성능을 달성합니다.
실무에서 LoRA는 도메인 특화 LLM 개발, 스타일 커스터마이징, 멀티태스크 어댑터 등에 활용됩니다. HuggingFace PEFT 라이브러리로 쉽게 적용 가능하며, QLoRA(양자화+LoRA)를 사용하면 7B 모델을 14GB GPU에서도 파인튜닝할 수 있습니다.
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model, TaskType
from datasets import load_dataset
from trl import SFTTrainer
# 베이스 모델 로드
model_name = "meta-llama/Llama-3.2-3B"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
# LoRA 설정 (핵심 하이퍼파라미터)
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8, # 랭크 (4~64, 높을수록 표현력 증가)
lora_alpha=16, # 스케일링 팩터 (보통 r*2)
lora_dropout=0.05, # 드롭아웃
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], # 적용 레이어
bias="none"
)
# LoRA 어댑터 적용
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 출력: trainable params: 3,407,872 || all params: 3,213,539,072 || 0.11%
# 학습 데이터 준비
dataset = load_dataset("json", data_files="train_data.json")
# 학습 설정
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,
warmup_ratio=0.03,
logging_steps=10,
save_strategy="epoch"
)
# SFT Trainer로 학습
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
tokenizer=tokenizer,
max_seq_length=2048
)
trainer.train()
# 어댑터만 저장 (수 MB)
model.save_pretrained("./my_lora_adapter")
2025년 1월 기준 LoRA vs Full Fine-tuning 비교입니다.
| 항목 | Full Fine-tuning | LoRA | QLoRA (4-bit) |
|---|---|---|---|
| 가격 | 오픈소스 (무료) | 오픈소스 (무료) | 오픈소스 (무료) |
| 학습 파라미터 | 100% | 0.1% ~ 1% | 0.1% ~ 1% |
| 7B 모델 VRAM | 60GB+ | 16GB | 6GB |
| 70B 모델 VRAM | 1,120GB+ | 140GB | 48GB |
| 메모리 절감율 | - | 3x (66%) | 17x (94%) |
| 성능 유지율 | 100% | 90~95% | 90~95% |
비용 절감: QLoRA 사용 시 RTX 4090($1,500)으로 70B 모델도 파인튜닝 가능. 학습 비용 50~70% 절감.
"Llama 3 모델을 우리 고객 서비스 데이터로 LoRA 파인튜닝했습니다. 전체 파라미터의 0.1%만 학습해서 A100 1장으로 4시간 만에 완료했고, 고객 문의 응답 품질이 35% 향상됐습니다."
"LoRA는 가중치 업데이트를 저랭크 행렬로 분해합니다. W' = W + BA 형태로, A는 (d, r), B는 (r, k) 크기입니다. 랭크 r을 4로 설정하면 원본 대비 0.01%의 파라미터만 학습하면서도 비슷한 성능을 얻습니다."
"QLoRA를 쓰면 4bit 양자화된 모델에 LoRA를 적용해서 GPU 메모리를 더 절약할 수 있습니다. RTX 4090 24GB로 70B 모델도 파인튜닝 가능합니다. 단, 추론 속도가 조금 느려지는 트레이드오프가 있어요."
일부 레이어에만 LoRA를 적용하면 성능이 떨어집니다. 모든 Attention 레이어에 적용해야 최적 성능을 얻습니다.
q_proj, k_proj, v_proj, o_proj 모두에 LoRA를 적용하세요. lora_alpha는 보통 r*2로 설정합니다. Learning rate는 일반 파인튜닝보다 10배 높게 (1e-4~3e-4) 설정해야 합니다.