쉬운 비유:
AI 모델도 마찬가지:
일반적인 ChatGPT:
"AI가 뭐예요?"
→ 일반적인 설명
의료용 파인튜닝:
"AI가 뭐예요?"
→ "AI는 의학에서 질병 진단, 약물 발견 등에 사용됩니다..."
법률용 파인튜닝:
"AI가 뭐예요?"
→ "AI는 계약 검토, 판례 분석 등의 법률 업무에 활용됩니다..."
프로세스:
문제점:
| 항목 | 비용 |
|---|---|
| GPU 비용 | $10,000~100,000 |
| 학습 시간 | 수주~수개월 |
| 저장 공간 | 모델당 10GB~400GB |
| 기술 수준 | 매우 높음 |
예시:
GPT-3 규모 모델 파인튜닝:
- A100 GPU 2개: $2/시간
- 1주일 학습: $336
- 최적화 시간: 추가 비용
- 총 비용: $5,000 이상
혁신: "모든 가중치"를 업데이트하지 말고, **"추가적인 작은 가중치"**만 학습하면 어떨까?
비용:
| 항목 | LoRA | 전통적 파인튜닝 |
|---|---|---|
| GPU 메모리 | 12GB | 80GB+ |
| 학습 시간 | 1~3시간 | 수주 |
| GPU 비용 | $5~20 | $10,000+ |
| 저장 공간 | 1~5MB | 10~400GB |
혁신의 핵심:
모델의 모든 가중치: 1,000억 개
→ 그 중 1%만 특화 학습: 10억 개
→ 99%는 그대로 사용
→ 비용 99% 감소!
은유: 책에 포스트잇을 붙이는 것
원본 책 (기존 모델): 그대로 두기
↓
+ 포스트잇들 (LoRA): "이 부분은 의료 용어입니다"라고 추가
↓
= 결과물: 원본은 안 건드리고, 추가 정보만 더함
LoRA는 다음처럼 작동합니다:
일반 신경망:
입력 → [가중치 W (100억 개)] → 출력
LoRA:
입력 → [가중치 W (그대로)] + [LoRA 가중치 A, B (100만 개)] → 출력
└───────────────────────────────────────────────────┘
합쳐진 결과 출력
✅ 저렴함
✅ 빠름
✅ 간단함
✅ 공간 효율
❌ 성능이 조금 떨어짐 (대신 충분히 좋음)
❌ 기존 지식을 완전히 바꾸기 어려움 (특화 목적에는 충분)
LoRA가 좋은데, 더 저렴하게 할 수 있지 않을까?
LoRA + 양자화(Quantization) = QLoRA
쉬운 설명:
일반적 숫자 표현:
123.456789 (32비트)
양자화:
123 (4비트, 훨씬 작음)
손실:
약 0.5% 성능 저하, 하지만 메모리 75% 절감!
| 항목 | LoRA | QLoRA |
|---|---|---|
| 메모리 사용 | 12GB | 4GB |
| 속도 | 중간 | 빠름 |
| GPU 요구 | RTX 3060 | RTX 2060 |
| 성능 | 최고 | 99% |
비용 비교:
# Python 설치 (이미 있으면 skip)
# Python 3.10 이상
# 필요 라이브러리 설치
pip install transformers torch peft datasets bitsandbytes
형식: CSV 또는 JSON 파일
{
"instruction": "이 문장을 의료 용어로 설명해줘",
"input": "혈압이 높습니다",
"output": "혈압이 140/90 mmHg 이상인 고혈압 상태입니다..."
}
데이터 크기:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from datasets import load_dataset
from transformers import TrainingArguments, Trainer
# 1단계: 모델 로드 (Llama 2, Mistral, Qwen 등 선택 가능)
model_name = "meta-llama/Llama-2-7b" # 한국어는 "beomi/KoAlpaca-12.8B" 추천
# 양자화 설정 (4비트, QLoRA 사용)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
# 모델 로드
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2단계: LoRA 설정
lora_config = LoraConfig(
r=16, # LoRA 차수
lora_alpha=32,
target_modules=["q_proj", "v_proj"], # 어느 층을 학습할지
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
# 3단계: LoRA 적용
model = prepare_model_for_kbit_training(model)
model = get_peft_model(model, lora_config)
# 4단계: 데이터 로드
dataset = load_dataset("csv", data_files="your_data.csv")
# 5단계: 학습 시작
training_args = TrainingArguments(
output_dir="./lora-output",
learning_rate=2e-4,
per_device_train_batch_size=4,
num_train_epochs=3,
save_strategy="epoch",
logging_steps=10,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
data_collator=transformers.DataCollatorForLanguageModeling(
tokenizer, mlm=False
),
)
trainer.train()
# 6단계: 모델 저장
model.save_pretrained("./lora-finetuned")
tokenizer.save_pretrained("./lora-finetuned")
print("✅ 파인튜닝 완료!")
python finetune.py
# 약 2~4시간 소요
# Google Colab에서:
!pip install transformers peft bitsandbytes
# 위 코드 실행
# 약 4~6시간 소요
# Vast.ai에서 GPU 렌탈 ($2~5/시간)
# RTX 3060 or A6000 선택
# 위 코드 실행
# 학습된 모델 로드
from peft import AutoPeftModelForCausalLM
model = AutoPeftModelForCausalLM.from_pretrained(
"./lora-finetuned",
device_map="auto"
)
# 추론 (사용)
input_text = "의학 정보: 당뇨병의 초기 증상은?"
inputs = tokenizer(input_text, return_tensors="pt")
outputs = model.generate(**inputs, max_length=100)
print(tokenizer.decode(outputs[0]))
# 결과: "의학 정보: 당뇨병의 초기 증상은? ... [의료용 특화 답변]"
| 모델 | 크기 | 한국어 | 파인튜닝 |
|---|---|---|---|
| KoAlpaca | 7B / 13B | ⭐⭐⭐⭐⭐ | ✅ 쉬움 |
| Llama 2 (한국어 튜닝) | 7B | ⭐⭐⭐⭐ | ✅ 가능 |
| Qwen | 7B / 14B | ⭐⭐⭐⭐⭐ | ✅ 쉬움 |
| Mistral | 7B | ⭐⭐⭐ | ✅ 가능 |
추천: KoAlpaca 또는 Qwen
# 자신의 데이터 활용
# 예: 회사 FAQ, 고객 문의, 도메인 문서
# 또는 오픈소스 활용
from datasets import load_dataset
# 한국어 데이터셋
korean_dataset = load_dataset("KoAlpaca")
{
"instruction": "다음 문장을 한국어로 번역해줘",
"input": "Hello world",
"output": "안녕하세요 세계"
}
{
"instruction": "이 코드의 버그를 찾아줘",
"input": "def hello():
print(\"Hi\"
hello()",
"output": "닫는 괄호가 빠졌습니다. 올바른 코드:
def hello():
print(\"Hi\")
hello()"
}
기본 모델: KoAlpaca 7B
+
파인튜닝: 대한민국 법령 데이터 (500건)
+
결과: 한국 법률 전문 AI
비용: $20 (학습) + 무료 (사용)
기본 모델: Qwen 7B
+
파인튜닝: 한국 의료 Q&A 데이터 (1,000건)
+
결과: 한국 의료 상담 AI
비용: $30 (학습) + 저비용 배포
기본 모델: KoAlpaca
+
파인튜닝: 한국 소설, 시 데이터
+
결과: 한국 문학 이해 AI
비용: $15 (학습)
| 리소스 | 링크 |
|---|---|
| HuggingFace KoAlpaca | huggingface.co/beomi |
| 한국어 LoRA 레포 | github.com (한국 개발자 다수) |
| Naver AI Hub | aihub.or.kr (한국 데이터셋) |
| 한국 ML 커뮤니티 | 네이버 AI Hub, Kaggle 한국 그룹 |
❌ 너무 많은 데이터
❌ 모델 크기 너무 큼
❌ 학습 데이터와 테스트 데이터 혼합
✅ 데이터 전처리
# 데이터 정제
text = text.lower() # 소문자로
text = text.strip() # 앞뒤 공백 제거
# 특수문자 제거 (필요시)
✅ 하이퍼파라미터 튜닝
# learning_rate 시도
lr_values = [1e-5, 1e-4, 2e-4, 5e-4]
# 각각 시도해본 후 최고 성능 선택
✅ 다중 epoch 실험
# 3 epoch 후 평가
# 과적합 주의 (더 이상 향상 안 될 때 멈춤)
✅ AI 민주화의 시작
✅ 한국 개발자의 기회
✅ 차별화 전략
마지막 질문:
만약 당신의 회사 데이터로 "특화 AI"를 만들 수 있다면?
비용은 $20, 시간은 3시간이면 됩니다.
준비되셨나요?