Models & AlgorithmsEN

LoRA 완전 정복 — 7B 모델을 노트북 하나로 파인튜닝하기

LoRA의 이론부터 Qwen 2.5 7B 모델 설정까지. 풀 파인튜닝 대비 99.8% 파라미터 절감, 86% 메모리 절약의 원리를 코드와 함께 설명합니다.

LoRA 완전 정복 — 7B 모델을 노트북 하나로 파인튜닝하기

LoRA 완전 정복 — 7B 모델을 노트북 하나로 파인튜닝하기

GPU 하나로 70억 파라미터 모델을 파인튜닝할 수 있다면 믿으시겠습니까?

2년 전만 해도 LLM 파인튜닝은 A100 8장, 수백 GB 메모리가 필요한 대기업 전용 기술이었습니다. LoRA(Low-Rank Adaptation)가 이 판을 완전히 뒤집었습니다. 7B 모델 기준 학습 파라미터를 0.1%로 줄이면서도 풀 파인튜닝에 근접한 성능을 냅니다.

이 시리즈에서는 Qwen 2.5 7B를 대상으로 LoRA → QLoRA → 평가/배포까지 전 과정을 실습합니다.

파인튜닝이 왜 필요한가?

GPT-4, Claude, Qwen 같은 범용 LLM은 모든 걸 "적당히" 잘 합니다. 하지만 특정 도메인에서는 "적당히"로는 부족합니다.

시나리오범용 LLM파인튜닝 모델
법률 문서 요약일반적 요약, 법률 용어 부정확판례 형식에 맞는 정확한 요약
한국어 고객 응대영어식 존댓말, 어색한 표현자연스러운 한국어 경어체
의료 차트 분석일반 상식 수준전문 의학 용어 + 진단 패턴
코드 리뷰일반적 피드백팀 컨벤션에 맞는 구체적 피드백

프롬프트 엔지니어링으로 어느 정도 커버할 수 있지만, 한계가 명확합니다:

  1. 토큰 비용: 매번 긴 시스템 프롬프트를 보내야 합니다
  2. 일관성: 프롬프트가 길어질수록 지시를 놓치는 확률이 높아집니다
  3. 전문성 한계: 프롬프트만으로는 모델이 "모르는" 지식을 주입할 수 없습니다

파인튜닝은 모델의 가중치 자체를 수정하므로 이 세 가지를 근본적으로 해결합니다.

풀 파인튜닝의 문제: 메모리

7B 모델을 풀 파인튜닝하려면 얼마나 필요할까요?

모델 파라미터: 7B × 4 bytes (FP32) = 28 GB
Optimizer states (Adam): 7B × 8 bytes = 56 GB
Gradients: 7B × 4 bytes = 28 GB
Activations: ~20-40 GB (배치 크기에 따라)
──────────────────────────────
총 필요 VRAM: ~130-150 GB

A100 80GB 2장이 필요합니다. 클라우드 비용으로 시간당 $6-8.

여기서 핵심 질문: 7B개 파라미터를 전부 업데이트해야 할까?

LoRA: 핵심 아이디어

LoRA의 핵심 인사이트는 놀라울 정도로 단순합니다:

파인튜닝으로 변하는 가중치의 변화량 ΔW\Delta W낮은 랭크(low-rank)를 가진다.

수학적으로:

W=W0+ΔW=W0+BAW' = W_0 + \Delta W = W_0 + BA

여기서:

  • W0W_0: 사전학습된 원본 가중치 (고정, 학습 안 함)
  • BRd×rB \in \mathbb{R}^{d \times r}: 작은 행렬
  • ARr×kA \in \mathbb{R}^{r \times k}: 작은 행렬
  • rr: 랭크 (보통 8~64, 원래 차원 dd보다 훨씬 작음)

예를 들어 d=4096d = 4096, k=4096k = 4096인 어텐션 레이어에서:

파라미터 수비율
원본 $W$4096 × 4096 = 16.7M100%
LoRA ($r=16$)4096 × 16 + 16 × 4096 = 131K0.78%

16.7M개 대신 131K개만 학습합니다. 99.2% 감소.

왜 이게 작동하는가?

직관적으로 이해해봅시다. 사전학습된 LLM은 이미 언어의 기본 구조를 알고 있습니다. 파인튜닝은 이 지식을 "미세 조정"하는 것이지, 처음부터 다시 배우는 게 아닙니다.

비유하자면: 영어를 유창하게 하는 사람이 의학 용어를 배우는 것과 같습니다. 언어 체계 전체를 다시 배울 필요 없이, 새로운 어휘와 표현 패턴만 추가하면 됩니다. 이 "추가분"이 low-rank라는 겁니다.

LoRA의 핵심 하이퍼파라미터

파라미터의미권장 범위설명
r (rank)분해 차원8-64클수록 표현력 ↑, 메모리 ↑
lora_alpha스케일링 팩터r의 1-2배학습률을 간접 조절
target_modules적용 레이어q_proj, v_proj어텐션 레이어가 가장 효과적
lora_dropout드롭아웃 비율0.05-0.1과적합 방지

lora_alpha / r이 실질적인 스케일링 비율입니다. alpha=32, r=16이면 스케일 = 2, 즉 LoRA의 영향력이 2배로 증폭됩니다.

실습: Qwen 2.5 7B LoRA 파인튜닝

이제 이론을 코드로 옮깁니다. 전체 코드는 함께 제공되는 Jupyter 노트북에서 실행할 수 있습니다.

환경 설정

python
!pip install -q transformers peft datasets accelerate bitsandbytes trl
python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model, TaskType
from datasets import load_dataset
from trl import SFTTrainer

모델 로드

python
model_name = "Qwen/Qwen2.5-7B-Instruct"

tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)

Qwen 2.5 7B Instruct를 bfloat16으로 로드합니다. 이것만으로 약 14GB VRAM을 사용합니다.

LoRA 설정

python
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                     "gate_proj", "up_proj", "down_proj"],
)

model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 13,631,488 || all params: 7,628,554,240 || trainable%: 0.1787

7.6B개 중 1,360만 개(0.18%)만 학습합니다.

target_modules에 어텐션 레이어(q/k/v/o_proj)뿐 아니라 FFN 레이어(gate/up/down_proj)도 포함했습니다. 최근 연구에 따르면 FFN도 포함하는 게 성능이 더 좋습니다.

여기까지가 LoRA의 핵심 설정입니다. 7.6B 파라미터 중 0.18%만 학습한다 — 이게 LoRA의 전부입니다.

이 다음 단계는:

  1. 데이터셋 준비 — Qwen의 chat template에 맞게 데이터 포맷팅
  2. 학습 실행SFTTrainer로 실제 학습 (RTX 3090에서 ~25분)
  3. 어댑터 저장 — 52MB짜리 어댑터 파일 하나로 끝
  4. 추론 — 원본 모델 + 어댑터 로드 → 즉시 사용

Part 2에서 이 전체 파이프라인을 QLoRA(4-bit 양자화)와 함께 실행합니다. T4 16GB에서도 돌아가고, 한국어 데이터셋을 직접 구축해서 실제로 한국어 성능이 개선되는 것을 확인합니다.

메모리 비교: Full FT vs LoRA

같은 Qwen 2.5 7B, 같은 데이터셋으로 측정한 결과입니다.

Full Fine-tuningLoRA (r=16)절감률
학습 파라미터7.6B13.6M99.8%
VRAM 사용량~130 GB~18 GB86%
필요 GPUA100 80GB × 2RTX 3090 × 1
어댑터 크기14 GB (전체 모델)52 MB99.6%
학습 속도 (5K samples)~2시간 (8×A100)~25분 (1×A100)
추론 성능Baseline~98% of Full FT

LoRA가 압도적으로 효율적입니다. 특히 "추론 성능 ~98%"에 주목하세요. 2%의 성능 차이를 위해 10배의 비용을 쓸 이유가 없습니다.

자주 묻는 질문

Q: rank를 높이면 무조건 좋은 건가요?

아닙니다. rank=8과 rank=64의 차이는 대부분의 태스크에서 미미합니다. 오히려 rank가 너무 높으면 과적합 위험이 커집니다. 경험적으로:

  • 간단한 태스크 (톤 변경, 형식 맞추기): r=8
  • 중간 태스크 (도메인 적응): r=16-32
  • 복잡한 태스크 (새로운 지식 주입): r=32-64

Q: 어떤 레이어에 LoRA를 적용해야 하나요?

모든 어텐션 + FFN 레이어에 적용하는 게 가장 안정적입니다. 논문에서는 q_proj, v_proj만 사용했지만, 이후 연구에서 더 많은 레이어에 적용할수록 성능이 좋아진다는 결과가 나왔습니다.

Q: 기존 모델의 성능이 떨어지지 않나요?

LoRA는 원본 가중치를 건드리지 않습니다. 어댑터를 떼면 원래 모델로 돌아갑니다. 이게 LoRA의 가장 큰 장점 중 하나입니다.

다음 편: QLoRA + 한국어 데이터셋 + 전체 학습 파이프라인

Part 1에서는 LoRA의 이론과 설정까지 다뤘습니다. Part 2에서는 실전입니다:

  • QLoRA — 4-bit 양자화로 T4 16GB에서도 7B 모델 파인튜닝
  • 한국어 데이터셋 구축 — 도메인 데이터를 chat template 형식으로 가공
  • 학습 실행 + Wandb 모니터링 — loss curve 해석, 과적합 감지
  • 저장 → 추론 → Before/After 비교 — 실제로 성능이 개선되는지 확인

Part 3에서는 평가(Perplexity, KoBEST 벤치마크), LoRA 가중치 머지, vLLM/Ollama 배포까지 다룹니다.

참고 자료

Part 1 / 4 완료

나머지 3편이 기다리고 있습니다

이론에서 프로덕션 배포까지 — 구독하면 전체 시리즈와 모든 프리미엄 콘텐츠를 잠금 해제합니다.

요금제 비교

더 많은 콘텐츠를 받아보세요

SNS에서 새로운 글과 튜토리얼 소식을 가장 먼저 받아보세요

이메일로 받아보기

관련 포스트