파인튜닝
Fine-tuning
사전 학습 모델을 특정 작업에 맞게 추가 학습. 적은 데이터로 높은 성능. LoRA로 효율화.
Fine-tuning
사전 학습 모델을 특정 작업에 맞게 추가 학습. 적은 데이터로 높은 성능. LoRA로 효율화.
파인튜닝(Fine-tuning)은 대규모 데이터로 사전 학습된 모델(Pre-trained Model)을 특정 도메인이나 작업에 맞게 추가 학습시키는 기법입니다. 처음부터 학습하는 것보다 훨씬 적은 데이터와 시간으로 높은 성능을 달성할 수 있습니다. 기반 모델의 일반적인 언어/비전 이해 능력을 유지하면서 특정 분야의 전문성을 더하는 방식입니다.
파인튜닝의 개념은 2018년 BERT의 등장과 함께 대중화되었습니다. 이전에도 전이학습(Transfer Learning)이 있었지만, Transformer 기반 대규모 언어 모델이 등장하면서 파인튜닝의 효과가 극적으로 향상되었습니다. 2023년 이후 LLM 시대에는 Instruction Tuning, RLHF(인간 피드백 강화학습), LoRA 같은 효율적인 파인튜닝 기법이 발전하여, 수십억 파라미터 모델도 소규모 GPU에서 파인튜닝할 수 있게 되었습니다.
파인튜닝 방법은 크게 세 가지로 나뉩니다. Full Fine-tuning은 모든 파라미터를 업데이트하는 전통적 방식입니다. PEFT(Parameter-Efficient Fine-Tuning)는 LoRA, QLoRA, Adapters 등을 사용해 소수의 파라미터만 학습하여 메모리와 시간을 절약합니다. Instruction Tuning은 명령-응답 쌍으로 모델을 학습시켜 지시를 더 잘 따르게 합니다. 2024-2025년에는 QLoRA와 Unsloth 같은 도구로 소비자용 GPU에서도 7B-70B 모델 파인튜닝이 가능해졌습니다.
실무에서 파인튜닝은 RAG로 해결하기 어려운 도메인 특화 작업에 적용됩니다. 의료, 법률, 금융 등 전문 용어와 맥락이 중요한 분야, 특정 출력 형식이나 스타일이 필요한 경우, 응답 속도가 중요하여 외부 검색을 줄여야 하는 경우에 효과적입니다. 다만 최신 정보 반영이 필요하면 RAG가, 도메인 지식 내재화가 필요하면 파인튜닝이 적합합니다. 많은 경우 두 기법을 함께 사용하는 하이브리드 접근이 최선입니다.
Hugging Face와 PEFT를 사용한 LoRA 파인튜닝 예제입니다.
# LoRA 파인튜닝 예제
# pip install transformers peft datasets accelerate bitsandbytes
from transformers import (
AutoModelForCausalLM, AutoTokenizer,
TrainingArguments, Trainer, DataCollatorForLanguageModeling
)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from datasets import load_dataset
import torch
# 4비트 양자화로 모델 로드 (메모리 절약)
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(
model_name,
load_in_4bit=True,
device_map="auto",
torch_dtype=torch.float16,
)
# LoRA 설정
lora_config = LoraConfig(
r=16, # LoRA rank
lora_alpha=32, # 스케일링 파라미터
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], # 적용 레이어
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
# PEFT 모델 생성
model = prepare_model_for_kbit_training(model)
model = get_peft_model(model, lora_config)
# 학습 가능한 파라미터 수 확인
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
total_params = sum(p.numel() for p in model.parameters())
print(f"학습 가능 파라미터: {trainable_params:,} / {total_params:,} ({100 * trainable_params / total_params:.2f}%)")
# 데이터셋 준비 (예: 한국어 지시 데이터)
def preprocess(example):
prompt = f"### 질문: {example['instruction']}\n\n### 답변: {example['output']}"
return tokenizer(prompt, truncation=True, max_length=512)
dataset = load_dataset("your_dataset", split="train")
tokenized_dataset = dataset.map(preprocess, remove_columns=dataset.column_names)
# 학습 설정
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,
logging_steps=10,
save_steps=100,
)
# 학습 실행
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
trainer.train()
# 어댑터 저장
model.save_pretrained("./lora-adapter")
OpenAI API를 통한 GPT 파인튜닝 예제입니다.
# OpenAI 파인튜닝 API
# pip install openai
from openai import OpenAI
import json
client = OpenAI()
# 1. 학습 데이터 준비 (JSONL 형식)
training_data = [
{
"messages": [
{"role": "system", "content": "당신은 친절한 고객 상담원입니다."},
{"role": "user", "content": "배송이 언제 오나요?"},
{"role": "assistant", "content": "주문 번호를 알려주시면 배송 현황을 확인해드리겠습니다."}
]
},
# ... 더 많은 예시
]
# JSONL 파일로 저장
with open("training_data.jsonl", "w", encoding="utf-8") as f:
for item in training_data:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
# 2. 파일 업로드
file = client.files.create(
file=open("training_data.jsonl", "rb"),
purpose="fine-tune"
)
print(f"파일 ID: {file.id}")
# 3. 파인튜닝 작업 생성
fine_tune_job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini-2024-07-18", # 또는 gpt-3.5-turbo
hyperparameters={
"n_epochs": 3,
"learning_rate_multiplier": 1.0,
}
)
print(f"작업 ID: {fine_tune_job.id}")
# 4. 작업 상태 확인
job = client.fine_tuning.jobs.retrieve(fine_tune_job.id)
print(f"상태: {job.status}")
# 5. 완료 후 파인튜닝 모델 사용
# fine_tuned_model = "ft:gpt-4o-mini:your-org::xxxx"
# response = client.chat.completions.create(
# model=fine_tuned_model,
# messages=[{"role": "user", "content": "배송 문의드립니다"}]
# )
2025년 1월 기준 파인튜닝 방법별 비교입니다.
| 방법 | 메모리 요구량 | 학습 속도 | 성능 | 적용 모델 |
|---|---|---|---|---|
| Full Fine-tuning | 매우 높음 (80GB+) | 느림 | 최고 | 7B 이하 |
| LoRA | 중간 (24GB) | 빠름 | 높음 | 70B 이하 |
| QLoRA (4bit) | 낮음 (8-16GB) | 빠름 | 높음 | 70B 이하 |
| Adapters | 낮음 | 빠름 | 중간 | 모든 크기 |
클라우드 파인튜닝 서비스 가격 (2025년 1월):
| 서비스 | 학습 비용 | 추론 비용 | 특징 |
|---|---|---|---|
| OpenAI GPT-4o-mini | $3.00/1M 토큰 | $0.15/1M 입력 | 가장 쉬운 시작 |
| Together AI | $3.00/시간 | $0.20/1M 토큰 | 오픈소스 모델 지원 |
| AWS Bedrock | 모델별 상이 | 모델별 상이 | 엔터프라이즈 통합 |
적은 데이터로 오래 학습하면 과적합이 발생합니다. 학습 데이터에서만 잘 동작하고 새로운 입력에는 성능이 저하됩니다. 검증 셋으로 모니터링하고 early stopping을 적용하세요.
특정 도메인에 과하게 파인튜닝하면 기존에 학습한 일반 지식을 잊어버립니다. 학습률을 낮게 유지하고, 일반 데이터를 섞어서 학습하세요.
최소 1,000개 이상의 고품질 예시로 시작하세요. 학습률은 기본값의 0.1-0.5배로 낮추고, 에폭은 1-3회로 제한하세요. LoRA rank는 8-32에서 시작하고 성능에 따라 조정하세요.