metadata
license: apache-2.0
datasets:
- werty1248/Korean-1930-Novel-Scene-Summarize
language:
- ko
pipeline_tag: text-generation
Model Card
- ์์ฝ ์๋๋ฆฌ์ค ๊ธฐ๋ฐ ์์ค ์์ฑ ๋ชจ๋ธ
- werty1248/Korean-1930-Novel-Scene-Summarize ์์ ์ ํจ๊ณผ ํ์ธ์ฉ ๋ชจ๋ธ์ ๋๋ค.
Training Details
Dataset
- werty1248/Korean-1930-Novel-Scene-Summarize
- ์ ์๊ถ์ด ๋ง๋ฃ๋ 20์ธ๊ธฐ ์ด ํ๊ตญ ๊ทผ๋๋ฌธํ 96ํธ
Preprocessing
system prompt์ ํจ๊ป ์์ค์ ์ฒซ ๋ฌธ๋จ์ ์ ๊ณต
์ดํ user๊ฐ ์๋๋ฆฌ์ค(50%) ๋๋ ์ด๋ฒคํธ(50%)๋ฅผ ์ ๊ณตํ๋ฉด assistant๊ฐ ๋ต๋ณ์ ์์ฑ
3-shot multi-turn ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํํ์ฌ ํ์ต
ํ๋กฌํํธ ์์๋ ์๋์ ์์ต๋๋ค.
Axolotl(full config๋ ์๋์ ์์ต๋๋ค)
- LoRA: (rank=32, alpha=128)
- NefTune_alpha: 5
- total_batch_size: 8
- num_epoch: 3
1xA100์์ ์ฝ 8์๊ฐ ํ์ต
Template & How to use
- ์ ์ instruction์ ๋ฌด์ํ๋ ๊ฒฝํฅ ์์
- ํ์/์์ด ๋จ์ด๊ฐ ์์ด๋ ํ์ ์ํ๋จ
- ํ๊ตญ์ด ๋ฅ๋ ฅ์ด ๋ ๋จ์ด์ง ๊ฒ ๊ฐ์
Input(๋๋ฌผ์ ๋ง์๋ ์ ๋์ ๋ถ)
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
tokenizer = AutoTokenizer.from_pretrained("werty1248/Qwen2-7B-Korean-1930-Novel-sft")
model = AutoModelForCausalLM.from_pretrained("werty1248/Qwen2-7B-Korean-1930-Novel-sft", torch_dtype=torch.bfloat16).to('cuda')
system_prompt = """๋น์ ์ ์์ค ์์ฑ ์ด์์คํดํธ์
๋๋ค. ๋น์ ์ ์๋ฌด๋ ์ ์ ์ ๊ฐ์ด๋์ ๋ฐ๋ผ 1900~1940๋
๋ ๊ทผ๋ ํ๊ตญ ์์ค์ ์์ฑํ๋ ๊ฒ์
๋๋ค.
- ์ฃผ์ด์ง ์๋๋ฆฌ์ค ์์ฝ์ ํ์ธํ๊ณ , ์ด์ ๋ํ๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ๋กฏ์ ๊ตฌ์ฑํ์ญ์์ค.
- ํ๋ถํ ํ๊ตญ์ด ํํ ๋ฐ ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐฝ์์ ์ผ๋ก ์งง์ ์ฌ์ ์์ฑํ์ธ์.
- ์ฌ์ ๋์ฌ์ ๊ทผ๋ ํ๊ตญ ํน์ ์ ํํ, ์ดํ, ์ฌํฌ๋ฆฌ, ์กด๋๋ง๊ณผ ๋ฐ๋ง์ ๋ฐ์ํ์ญ์์ค.
- ์ฌ์ ์ฃผ์ ์ฌ๊ฑด์ ๊ทผ๋ ํ๊ตญ์ ์ญ์ฌ์ , ๊ธฐ์ ์ ํน์ฑ์ ๋ฐ์ํ์ญ์์ค.
- ์ฌ์ 5~10๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑํ์ธ์.
"""
first_message = """### ์ฒซ ๋ฌธ๋จ
ํ๋์ ๋ถ์ฌ๋ฅด๋ ์ฉ์ ๋
ธ์ฌ์๋ ์ํ์ง๊ณ
์์๋ค์ ์๋น๋ ์ฌํ ์์ ๋ฌปํ๋ฒ๋ฆฐ
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฐ ๊ฒ๋ค์ ๋๊ตฌ๋ ์ ๊ฒฝ์ฐ์ง ์๋
์์กด์ด ์ฒ๋ฐํ ๋๋ด์ด ๋ ์๋์
ํ ๋จ์๊ฐ ์ฌ๋ง์ ๊ฑท๊ณ ์์๋ค.
"""
scenario = """### ๋ฑ์ฅ์ธ๋ฌผ
์ฌ๊ด ์ฃผ์ธ, ์ผ์ด๊ฑด ๋๋ผ์นด
### ์๋๋ฆฌ์ค
์ฌ๊ด ์ฃผ์ธ์ด ๋ฌธ๋ ์ฐฝ๋ฐ์ ๋ฐ๋ผ๋ณธ๋ค. ์ฌ๊ด ์ฃผ๋ณ์ ์จํต ์ฌ๋ง์ด๋ค. ์งํ์ ์ ๋ฉ๋ฆฌ์ ํ ์ฌ๋ด๊ฐ ํผ์ง๋งํ ์๋ฃจ๋ฅผ ์ง์ง ๋๋ฉด์ ์ฌ๊ด ๋ฐฉํฅ์ผ๋ก ๊ฑธ์ด์จ๋ค.
"""
messages = [{'role':'system', 'content':system_prompt + first_message},
{'role':'user', 'content':scenario},]
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512)
prompt = pipe.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipe(
prompt,
do_sample=True,
temperature=0.8,
top_k=50,
top_p=0.95,
add_special_tokens=True
)
print(outputs[0]["generated_text"][len(prompt):])
Result
ํ๋์ ๊นจ๋ํ์๋ค. ๋ฐ๋๋ ์์ด์ง ์์๋ค. ๋ฐ์ ์์ ๊ตด๋ฌ์ ธ ์๋ ํฌ์น์ด ํ ๋ฉ๋งํ๊ณ ํธ๋ฅธ ํ๋น ์๋ ์ ๋ณด์๋ค.
๊ฑฐ๊ธฐ๋ ๋ง์นจ ํ ์ฑ์ ์ฌ๊ด์ด ์ง์ฒด๋ก ๊ฝํ ์์๋ค. ์ข์ฐ ๋ฉ๋ฆฌ ๋ฐ์๊ฐ ์ฐ์ ๋ฟ์ด๋ค. ๋๋ฌด๋ ์๋ชฉ๋ ์๋ ์จ ์ฒ์ง๊ฐ ํคํ ์ฌ๊ด ์์ ์์์ธ๊ณ ์๋ ๊ฒ์ด๋ค. ์ผ๋ฅธ ๋ณด๋ฉด ํ ์กฐ๊ฐ ์์ถ ์ ๊ฐ๊ธฐ๋ ํ์ง๋ง ๊ฑด์ถ์ด๋ผ๋๋ ๋ณด๋ค๋ ๋ํ์ ๋
์ ๋ด์ด๋๊ณ ๋จ์ํ ๊ฐํ ํ๋๋ฅผ ๊ฑธ์ด์ ๊ทธ๋๋ก ๋ฒ์ดํ๋ โ์ฌ๊ดโ์ด๋ค. ๋ช๋ช ์ข์ ๊ธธ๋ง ๋ค์ด์๋ค๊ฐ ์ฌ๋ผ์ก์ ๋ฟ ํ ๊ธธ๋ ์ ๋ซ๋ ค์ง ๊ทธ ์๋ฆฌ์ ๊ทธ๋๋ก ์งํฑ๋์ด ์๋ ์ฌ๊ด์ด๋ค. ๊ธธ์ ๋ํ๋๋ ์ฌ๋์ ์๋ค. ์ข์ฐ๋ก ๋ฐ์๋ฅผ ๋ผ๊ณ ๋ ๋น์ด ์๋ ์ฐ ์ค์์ ๊ฐ๊ฐ์ด ๊ณ ๊ธฐ ๊ตฝ๋ ๋ฅ์ด์ ์ฏ๋ฐ๊ตฌ๋๋ฉฐ ๊ณ ๊น๊ฐ๋ง๋ฅผ ๊ฑธ๊ณ ํ์ธ๋ง ๋ช ๋ง๋ฆฌ์ฉ ์ง๋๊ฐ๊ณ ํคํ๊ฒ ์ ๋ฐ๋ฅ์ ํ๋น๋ง ๋น์น๊ณ ํ๋ ์ธ์ธํ ์ฌ๊ด์ด๋ค. ๊ทธ๊ฒ์ด ๋ฃธ_service๋ผ๋ ์ธ๊ณ์๋ ๋ฌ๋ฆฌ ์ฃผ์ธ๋ ์๊ณ ์ฌ์ฅ๋ ์๊ณ ์๋ ์๊ณ ํ ๊ฐํ๋ง ๊ฑธ๊ณ ์ฒ๋น์ฒ๋ผ ์ธ๋กญ๊ฒ ์งํค๊ณ ์๋ ๋ชจ์์ด๋ค.
๊ทธ๋ฐ ์ฌ๊ด์์ ์ด์ฝ๊ณ ์์ด ํ ์ฌ๋ ๋ํ๋ฌ๋ค. ์ฐฝ๋ฌธ์ด ์ด๋ ธ๋ค. ๋ฐ์ ๋ด๋ค๋ณด๋ ํ ์ ์ ๊ฒ์ ๊ทธ๋ฆผ์๊ฐ ์ฐฝ ์์์ ๋๋๋ด ์ค๋ฏ๋ฌ์ง๋ค. ๊ทธ๋ฌ๋๋ ๋ค์ ํ์ฐธ ํ์ ๊ทธ ๊ฒ์ ๊ทธ๋ฆผ์๋ ์๋ชฉ์ผ๋ก ์ฐจ์ฐจ ๋์ ๊ฐ์ง๊ณ ๋ ๊ทธ๋๋ก ์ฌ๋ผ์ง๋ ๊ฒ์ด๋ค.
๊ทธ๋ก๋ถํฐ ์ฌ๊ด์ ์๋ก์ด ์ผ์ ๋นํ์๋ค. ๋ฐ์๋ฆฌ์ค ์๋ฃจ๋ฅผ ๋ค๊ณ ํ ์ฌ๋์ด๊ฐ ๊ฑธ์ด ๋ค์ด์ค์ง ์์๋๊ฐ. ์ผ๊ตด์ ๋จผ๋น์ผ๋ก ๋๋ํ ๋ชป ๋ณด์ด๋ ๋ฒ์จ ์ฌ๋ฉด ์ฌ์ค ๊ฐ๋ฐ์ ์ ๋๋ ๊ณณ์ ํผ์งํ ์๋ฃจ๋ฅผ
Result of Original model(Qwen/Qwen2-7b-instruct)
"๊ทธ๊ฒ ๋๊ตฌ๋? ์ ์ด๋ ๊ฒ ๋จผ ๊ณณ์์ ์ด๊ณณ์ผ๋ก ์?" ์ฌ๊ด ์ฃผ์ธ์ด ๋ฌผ์ด๋ณด๋ฉฐ ์ฐฝ๋ฌธ์ ๋ฒ๋ฆฌ๊ณ ๋งํ๋ค. ๊ทธ๋
์ ๋ชฉ์๋ฆฌ๋ ์ฌ๋ง์ ๊ฑด์กฐํจ๊ณผ ํจ๊ป ๊ฑฐ์น ๋ฐ๋์ ๊ฐ๋ผ์์๋ค.
์ผ์ด๊ฑด ๋๋ผ์นด๋ผ๋ ์ฌ๋ด๋ ์์ ์ ์๋ฃจ๋ฅผ ๋ ์ง์ง ๋๋ฉฐ ์ฌ๊ด ์ชฝ์ผ๋ก ๋ค๊ฐ๊ฐ๋ค. ๊ทธ์ ๋์๋ ํฌ๋ฏธํ๊ฒ ๋ณด์ด๋ ๋จผ์ง์ ๋จผ์ง๊ฐ ๊ฐ์ธ๊ณ ์๋ ํ๋น์ด ๋น๋๋ ๋ฏํ๋ค. ๊ทธ์ ์ผ๊ตด์๋ ๋๋ฐฉ์ธ์ด ๊ตด๋ฌ ๋ด๋ ค๊ฐ๋ฉฐ, ๊ทธ์ ์
์ ๋งํ ์ค๋น๋ฅผ ํ๊ณ ์์๋ค.
"์ฌ๊ด ์ฃผ์ธ๋, ์ ๋ฅผ ๋ฐ์์ฃผ์ค ์ ์์๊น์? ์ ๊ฐ ์ด๊ณณ์์ ์ ์ ์ฌ๊ณ ์ถ์ต๋๋ค." ๊ทธ์ ๋ชฉ์๋ฆฌ๋ ์ฌ๋ง์ ๋ฌด๋ํ ์กฐ์ฉํจ์ ๊นจ์ฐ๋ฉฐ ์ ํด์ก๋ค.
์ฌ๊ด ์ฃผ์ธ์ ๊ทธ์ ์ฒด์ก๋ณต๊ณผ ๋ๆฑๆฑํ ๋ชจ์ต์ ๋ณด๋ฉฐ, ์ด ์ฌ๋ด์ ์ํฉ์ ๋ํด ๊ฑฑ์ ์ค๋ฌ์ ๋ค. "๊ทธ๋, ๋ค๊ฐ ํ์ํ๋ค๊ณ ๋๊ผ๋ค๋ฉด, ์ฌ๊ธฐ์ ์ฌ์ด๋ผ. ํ์ง๋ง ์ ์ด๋ฐ ๊ณณ๊น์ง ์๋์ง ์ค๋ช
ํด ์ค์ผ ํ ๊ฒ ๊ฐ์." ๊ทธ๋
์ ๋งํฌ๋ ์น๊ทผํ๋ฉด์๋ ๋ถ๋ช
ํ ์ง์์๋ค.
Others
Axolotl config
base_model: Qwen/Qwen2-7B-Instruct
trust_remote_code: true
load_in_8bit: false
load_in_4bit: false
strict: false
datasets:
- path: train_data.jsonl
type: sharegpt
dataset_prepared_path:
val_set_size: 0.05
output_dir: ./outputs/out
sequence_len: 4096
sample_packing: true
eval_sample_packing: true
pad_to_sequence_len: true
adapter: lora
lora_model_dir:
lora_r: 32
lora_alpha: 128
lora_dropout: 0.05
lora_target_linear: true
lora_fan_in_fan_out:
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:
neftune_noise_alpha: 5
gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 3
optimizer: adamw_torch
lr_scheduler: cosine
learning_rate: 0.0002
train_on_inputs: false
group_by_length: false
bf16: auto
fp16:
tf32: false
gradient_checkpointing: true
gradient_checkpointing_kwargs:
use_reentrant: false
early_stopping_patience:
resume_from_checkpoint:
local_rank:
logging_steps: 1
xformers_attention:
flash_attention: true
warmup_steps: 10
evals_per_epoch: 4
saves_per_epoch: 1
debug:
deepspeed:
weight_decay: 0.0
fsdp:
special_tokens: