Fine Tuning Process
한국어 최적화 Llama 3 모델(MLP-KTLim/llama-3-Korean-Bllossom-8B)을 활용한 공인중개사 시험 문제 생성기 훈련 가이드
Step 1: 환경 초기화 및 패키지 설치
!pip install -q -U datasets accelerate peft bitsandbytes trl wandb
!pip install -q sentencepiece einops
!pip install -U transformers
Step 2:
from huggingface_hub import login
import wandb
hf_token = "hf_WElsx..."
wandb_token = "5c54b533305..."
login(hf_token)
wandb.login(key=wandb_token)
Step 3: 데이터셋 업로드 (Colab 파일 업로드 사용)
from google.colab import files
uploaded = files.upload() # merge.csv 파일 업로드
📍Step 4: JSONL 파싱 → Hugging Face Dataset으로 변환
from datasets import Dataset, DatasetDict
# 파일 열기
with open("merged.jsonl", "r", encoding="utf-8") as f:
raw_lines = [line.strip() for line in f if line.strip()]
# {"text": ...} 형태로 변환
formatted_data = [{"text": line} for line in raw_lines]
# Dataset 생성
dataset = Dataset.from_list(formatted_data)
# 4. train / test 분리
dataset_split = dataset.train_test_split(test_size=0.1, seed=42)
# 5. Trainer용 DatasetDict 구성
dataset = DatasetDict({
"train": dataset_split["train"],
"test": dataset_split["test"]
})
📍 Step 5: 데이터 토크나이징
from transformers import AutoTokenizer
# LLaMA 3 기반 Bllossom 모델 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained("MLP-KTLim/llama-3-Korean-Bllossom-8B")
tokenizer.pad_token = tokenizer.eos_token # 필수
# text 하나로 되어 있을 때
def tokenize_function(examples):
tokenized = tokenizer(
examples["text"],
padding="max_length",
truncation=True,
max_length=2048,
)
tokenized["labels"] = tokenized["input_ids"].copy()
return tokenized
tokenized_dataset = dataset.map(
tokenize_function,
batched=True,
remove_columns=["text"]
)
📍 Step 6: Base 모델 및 tokenizer 로딩 (QLoRA 4bit)
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
model_id = "MLP-KTLim/llama-3-Korean-Bllossom-8B"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="float16",
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto"
)
📍 Step 7: LoRA 적용
# QLoRA 파인튜닝 설정
from peft import LoraConfig, prepare_model_for_kbit_training, get_peft_model
model.gradient_checkpointing_enable()
model = prepare_model_for_kbit_training(model)
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"]
)
model = get_peft_model(model, peft_config)
📍 Step 8: Trainer 설정
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="./results",
eval_strategy="epoch",
save_strategy="epoch",
learning_rate=2e-5, # 학습률 추가
weight_decay=0.01, # 가중치 감소 추가
fp16=True, # 혼합 정밀도 학습 활성화
gradient_accumulation_steps=4, # 배치 크기 효과적 증가
logging_dir="./logs",
logging_steps=10,
per_device_train_batch_size=4,
per_device_eval_batch_size=4,
num_train_epochs=3,
remove_unused_columns=False
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
eval_dataset=tokenized_dataset["test"],
tokenizer=tokenizer,
)
✔ Step 10: 학습 (필수)
trainer.train()
✔ Step 11: 병합 전 모델 저장 (선택, 백업 용도)
👉 최종 병합된 모델만 사용할 거면 이건 생략해도 됨
model.save_pretrained("/content/drive/MyDrive/llama-3-korean-bllossom", safe_serialization=False)
tokenizer.save_pretrained("/content/drive/MyDrive/llama-3-korean-bllossom")
✔ Step 12: 병합 및 최종 모델 저장 (핵심!)
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
# base 모델 로드
base = AutoModelForCausalLM.from_pretrained("MLP-KTLim/llama-3-Korean-Bllossom-8B")
# LoRA 적용된 모델 로드
# model = PeftModel.from_pretrained(base, "kyeong-ho/llama-3-korean-bllossom")
# Step 12 수정 (로드 경로 명확히)
model = PeftModel.from_pretrained(base, "./results") # 실제 LoRA 체크포인트 경로
# 병합
model = model.merge_and_unload()
# 병합된 모델 저장
model.save_pretrained("/content/drive/MyDrive/llama-3-korean-bllossom", safe_serialization=False)
tokenizer = AutoTokenizer.from_pretrained("MLP-KTLim/llama-3-Korean-Bllossom-8B")
tokenizer.save_pretrained("/content/drive/MyDrive/llama-3-korean-bllossom")
✔ Step 13: Hugging Face 업로드 (병합된 모델만 업로드)
from huggingface_hub import login, upload_folder
login(token="your_hf_token") # ← 너의 HF 토큰 입력
upload_folder(
repo_id="kyeong-ho/llama-3-korean-bllossom",
folder_path="/content/drive/MyDrive/llama-3-korean-bllossom",
repo_type="model",
commit_message="Upload merged full model"
)
병합된 모델은 이미
upload_folder
로 한번에 업로드됨.
💡요약
PeftModel
로 학습 →merge_and_unload()
로 병합 → 병합된 모델만 업로드upload_folder()
만 쓰면 됨.push_to_hub()
는 병합 안된 LoRA 모델용이라 필요 없음.