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 모델용이라 필요 없음.

Was this page helpful?