말동무 β€” 독거 μ–΄λ₯΄μ‹ μš© AI λŒ€ν™” 챗봇 (QLoRA μ–΄λŒ‘ν„°)

EleutherAI/polyglot-ko-3.8bλ₯Ό QLoRA(4bit NF4)둜 νŒŒμΈνŠœλ‹ν•œ LoRA μ–΄λŒ‘ν„°μž…λ‹ˆλ‹€. 독거 μ–΄λ₯΄μ‹ κ³Ό μ§§κ³  λ”°λœ»ν•œ μ‘΄λŒ“λ§λ‘œ λŒ€ν™”ν•˜λ©°, λ¨Όμ € κ³΅κ°ν•˜κ³  ν•„μš”μ‹œ μ•ˆλΆ€λ₯Ό μ±™κΈ°λŠ” 페λ₯΄μ†Œλ‚˜λ‘œ ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€.

ν•™μŠ΅ 데이터

  • λ‹¨λ°œ λŒ€ν™” 11,266개: 16개 μΉ΄ν…Œκ³ λ¦¬(건강/μ™Έλ‘œμ›€/손주/λͺ…μ ˆ λ“±) Γ— 8개 감정, GPT-4o-mini둜 생성 + μ‹€μ œ μ–΄λ₯΄μ‹  인터뷰 μ „μ‚¬μ—μ„œ μΆ”μΆœν•œ μ‚¬νˆ¬λ¦¬/ꡬ어체 λ°œν™” 1,266개(μ‚¬νˆ¬λ¦¬ μž…λ ₯ 이해 λ³΄κ°•μš©)
  • λ©€ν‹°ν„΄ λŒ€ν™” 1,000편(λŒ€ν™”λ‹Ή 평균 7.1ν„΄) β†’ ν„΄λ§ˆλ‹€ μŠ¬λΌμ΄λ”© μœˆλ„μš°λ‘œ ν™•μž₯ν•΄ 3,546개 ν•™μŠ΅ μƒ˜ν”Œλ‘œ λ³€ν™˜
  • μ΅œμ’… train 14,072 / val 740

ν•™μŠ΅ μ„€μ •

  • LoRA: r=8, alpha=16, dropout=0.1, target_modules=["query_key_value", "dense"] (GPT-NeoX μ–΄ν…μ…˜ μœ„μ£Όλ‘œ 쒁게 타깃 β€” 과적합 μ–΅μ œ)
  • 4bit NF4 μ–‘μžν™”(bitsandbytes), MAX_LENGTH=768
  • batch_size=2, gradient_accumulation_steps=8 (유효 배치 16), 5 epoch μΊ‘ + EarlyStoppingCallback(patience=3)
  • κ²°κ³Ό: epoch 3.296μ—μ„œ early stopping, eval_loss 1.366, RTX 3060 Ti(8GB)μ—μ„œ 141.9λΆ„ μ†Œμš”, peak VRAM 3.4GB

μ‚¬μš©λ²•

베이슀 λͺ¨λΈ(7.6GB)을 4bit둜 λ‘œλ“œν•œ λ’€ 이 μ–΄λŒ‘ν„°λ₯Ό μ–ΉμŠ΅λ‹ˆλ‹€.

import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig

BASE_MODEL = "EleutherAI/polyglot-ko-3.8b"
ADAPTER = "Junping0645/Vtuber"  # 이 리포

tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
bnb = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
)
base = AutoModelForCausalLM.from_pretrained(BASE_MODEL, quantization_config=bnb, device_map={"": 0})
model = PeftModel.from_pretrained(base, ADAPTER)
model.eval()

prompt = "### μ–΄λ₯΄μ‹ : μš”μ¦˜ 많이 μ™Έλ‘­μŠ΅λ‹ˆλ‹€.\n### 말동무:"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=80, do_sample=True, temperature=0.8,
                      top_p=0.9, repetition_penalty=1.15,
                      pad_token_id=tokenizer.eos_token_id, eos_token_id=tokenizer.eos_token_id)
print(tokenizer.decode(out[0], skip_special_tokens=True))

λ©€ν‹°ν„΄(λŒ€ν™” 이λ ₯ μœ μ§€)

이전 턴듀을 같은 포맷으둜 이어뢙이면 λ¬Έλ§₯을 λ°˜μ˜ν•œ 닡변이 λ‚˜μ˜΅λ‹ˆλ‹€(ν•™μŠ΅ μ‹œ μ‚¬μš©ν•œ 포맷과 동일해야 함):

### μ–΄λ₯΄μ‹ : 손주가 λ‹€μŒ 주에 λ†€λŸ¬ μ˜¨λŒ€μš”.
### 말동무: μ •λ§μš”? κΈ°λŒ€λ˜μ‹œκ² μ–΄μš”! 즐거운 μ‹œκ°„ λ³΄λ‚΄μ‹œκΈΈ λ°”λž˜μš”.
### μ–΄λ₯΄μ‹ : λͺ‡ 살인지 μ•ˆ λ¬Όμ–΄λ³΄μ…¨λ„€μš”, μ΄λ²ˆμ— μ΄ˆλ“±ν•™κ΅ λ“€μ–΄κ°€μš”.
### 말동무: κ·Έλ ‡κ΅°μš”! μš”μ¦˜ 아이듀은 λΉ λ₯΄μ£ .
### μ–΄λ₯΄μ‹ : κ±”κ°€ 였면 뭘 ν•΄μ£Όλ©΄ μ’‹μ•„ν• κΉŒμš”?
### 말동무:

μ°Έκ³ 

  • VRAM: ν•™μŠ΅ 3.4GB / μΆ”λ‘  μ•½ 3.3GB (RTX 3060 Ti 8GB κΈ°μ€€)
  • Framework: PEFT 0.19.1, transformers 5.13.0, bitsandbytes 0.49.2, torch 2.11.0+cu128
Downloads last month
17
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for Junping0645/vtuber

Adapter
(1)
this model