튜토리얼2026년 3월 28일
LLM 파인튜닝 실전 가이드: QLoRA로 나만의 모델 만들기 (2025)
## 파인튜닝을 해야 하는 경우
파인튜닝은 모든 상황에서 필요하지 않습니다. 먼저 파인튜닝이 진짜 필요한지 판단하세요:
```mermaid
flowchart TD
Start[커스텀 AI 필요] --> Q1{프롬프트만으로<br/>해결 가능?}
Q1 -- Yes --> Prompt[System Prompt + Few-shot<br/>충분함]
Q1 -- No --> Q2{지식을 추가해야 하나?}
Q2 -- Yes --> RAG[RAG 구축<br/>파인튜닝보다 쉬움]
Q2 -- No --> Q3{특정 스타일/형식<br/>일관성이 필요?}
Q3 -- Yes --> FT[파인튜닝 고려]
Q3 -- No --> Q4{응답 속도/비용<br/>극단적 최적화?}
Q4 -- Yes --> FT
Q4 -- No --> Prompt
```
**파인튜닝이 진짜 필요한 경우:**
- 특정 산업 용어, 말투, 형식을 일관되게 써야 할 때
- API 비용을 대폭 줄이고 싶을 때 (소형 파인튜닝 모델 > 대형 범용 모델)
- 지연 시간을 극단적으로 줄여야 할 때
- 인터넷 연결 없는 온프레미스 환경
---
## QLoRA: 저사양에서 파인튜닝하는 방법
QLoRA(Quantized Low-Rank Adaptation)는 RTX 3090(24GB VRAM) 한 장으로도 70B 모델을 파인튜닝할 수 있게 해주는 기법입니다.
### 핵심 개념
**LoRA의 원리:**
모델의 모든 가중치를 업데이트하는 대신, 저랭크(low-rank) 행렬 2개만 학습합니다.
```
원본 가중치 W (고정)
+ 델타 = A × B (A: r×d, B: d×r, r << d)
────────────────
실제 사용 가중치 = W + A × B
```
전체 파라미터의 0.1~1%만 학습 → 메모리 90% 이상 절감
**QLoRA 추가:**
기본 모델을 4비트로 양자화해 메모리를 더 줄이고, 그 위에 LoRA 어댑터를 학습합니다.
---
## 실전: Llama 3.1 8B 파인튜닝
### 환경 설정
```bash
pip install transformers datasets peft trl accelerate bitsandbytes
```
### 데이터 준비파인튜닝 데이터는
**지시-응답 쌍**입니다:
```python
# 데이터 형식 (Alpaca 스타일)
training_data = [
{
"instruction": "다음 고객 리뷰의 감정을 분석하세요",
"input": "배송이 3일이나 걸렸어요. 제품은 괜찮은데 배송이 너무 느려요.",
"output": "감정: 혼합 (부정적 배송 경험 + 긍정적 제품 평가)
주요 불만: 배송 속도
만족 요인: 제품 품질"
},
# 최소 수백~수천 개 필요
]
# HuggingFace Dataset 형식으로 변환
from datasets import Dataset
def format_prompt(example):
return {
"text": f"#
## 지시:
{example['instruction']}
### 입력:
{example['input']}
### 응답:
{example['output']}"
}
dataset = Dataset.from_list(training_data).map(format_prompt)
```
### QLoRA 학습
```python
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, TaskType
from trl import SFTTrainer, SFTConfig
import torch
# 4비트 양자화 설정
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
# 모델 로드
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B-Instruct",
quantization_config=bnb_config,
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
# LoRA 설정
lora_config = LoraConfig(
r=16, # 랭크 (작을수록 파라미터 적음, 16~64 권장)
lora_alpha=32, # 스케일링 파라미터 (r의 2배 권장)
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM,
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 6,815,744 || all params: 8,037,986,304 || trainable%: 0.085
# 학습
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
args=SFTConfig(
output_dir="./output",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
warmup_steps=100,
learning_rate=2e-4,
fp16=True,
logging_steps=10,
save_steps=500,
),
dataset_text_field="text",
max_seq_length=2048,
)
trainer.train()
trainer.save_model("./my-finetuned-model")
```
---
## GPU 메모리 요구사항 가이드
| 모델 | 기법 | 최소 VRAM | 권장 VRAM |
|------|------|-----------|-----------|
| Llama 3.1 8B | QLoRA | 12GB | 16GB |
| Llama 3.1 8B | LoRA (fp16) | 20GB | 24GB |
| Llama 3.1 70B | QLoRA | 40GB | 80GB |
| Qwen 2.5 14B | QLoRA | 20GB | 24GB |
| Mistral 7B | QLoRA | 10GB | 16GB |
**클라우드 GPU 옵션:**
- RunPod: RTX 3090 (24GB) $0.44/시간
- Lambda Labs: A100 (80GB) $1.10/시간
- Google Colab Pro+: A100 (40GB) 월 $50 무제한
---
## OpenAI 파인튜닝 API (코딩 없는 방법)
직접 학습 환경을 구축하기 어렵다면 OpenAI의 파인튜닝 API를 사용합니다:
```python
from openai import OpenAI
client = OpenAI()
# 1. 데이터 업로드
with open("training_data.jsonl", "rb") as f:
file = client.files.create(file=f, purpose="fine-tune")
# 2. 파인튜닝 시작
job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini", # 가장 저렴한 옵션
hyperparameters={"n_epochs": 3}
)
# 3. 완료 후 사용
response = client.chat.completions.create(
model=job.fine_tuned_model, # ft:gpt-4o-mini:org:custom:id
messages=[{"role": "user", "content": "..."}]
)
```
**데이터 형식 (JSONL):**
```json
{"messages": [{"role": "system", "content": "당신은 고객서비스 직원입니다"}, {"role": "user", "content": "환불 요청합니다"}, {"role": "assistant", "content": "안녕하세요! 불편을 드려 죄송합니다..."}]}
```
---
## 파인튜닝 vs 프롬프트 엔지니어링 비용 비교
**시나리오: 하루 10만 건 분류 태스크**
| 방법 | 모델 | 월 비용 | 레이턴시 |
|------|------|---------|---------|
| System Prompt | GPT-4o | ~$750 | 1-2초 |
| System Prompt | GPT-4o-mini | ~$60 | 0.5초 |
| 파인튜닝 | GPT-4o-mini ft | ~$30 | 0.3초 |
| 자체 QLoRA | Llama 3.1 8B | GPU 비용만 | 0.1초 |
파인튜닝으로 비용 50~90% 절감 가능합니다.
---
## 결론파인튜닝 시작 전 체크리스트:
1. ✅ 프롬프트 최적화로 충분하지 않은가?
2. ✅ 학습 데이터가 최소 500개 이상 있는가?
3. ✅ 데이터 품질이 일관적인가?
4. ✅ GPU 또는 클라우드 환경이 준비됐는가?
빠르게 시작하고 싶다면: **OpenAI gpt-4o-mini 파인튜닝** → 코드 최소화, 학습 데이터만 준비
성능과 비용 최적화가 목표라면: **QLoRA + Llama 3.1 8B** → 자체 인프라에서 완전 제어