harveykim's picture
docs: README์— GitHub ์ฝ”๋“œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋งํฌ ์ถ”๊ฐ€
b7b3d19
|
Raw
History Blame Contribute Delete
8.38 kB
metadata
license: cc-by-nc-4.0
tags:
  - translation
  - korean
  - english
  - ko-en
  - en-ko
  - kanana
  - kanana-1.5
  - lora
  - peft
  - unsloth
language:
  - ko
  - en
library_name: peft
pipeline_tag: translation
base_model: kakaocorp/kanana-1.5-2.1b-base
datasets:
  - AI-Hub-126-korean-english-parallel
model-index:
  - name: kanana-1.5-2.1b-aihub-ko-en-lora
    results:
      - task:
          type: translation
        dataset:
          name: AI Hub
          type: AI-Hub-126
        metrics:
          - type: bleu
            value: 32.04
            name: BLEU
          - type: chrf
            value: 57.26
            name: chrF++

kanana-1.5-2.1b-aihub-ko-en-lora

Kanana 1.5 2.1B base (์นด์นด์˜ค)๋ฅผ AI Hub ํ•œ-์˜ ๋ณ‘๋ ฌ ๋ง๋ญ‰์น˜ (#126) ๋กœ QLoRA ํŒŒ์ธํŠœ๋‹ํ•œ ํ•œโ†”์˜ ๋ฒˆ์—ญ ์–ด๋Œ‘ํ„ฐ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œยท๋ฌธ์„œ ์ „์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ: github.com/DeepMav/on-device-translation ์ž๋งค ๋ชจ๋ธ: harveykim/gemma-3-1b-aihub-ko-en-lora โ€” ๋™์ผ ๋ฐ์ดํ„ฐยท๋™์ผ ํ‰๊ฐ€ ํ”„๋กœํ† ์ฝœ๋กœ ํ•™์Šต๋œ Gemma 3 1B ๋ฒ„์ „.


๋ชจ๋ธ ์ •๋ณด

ํ•ญ๋ชฉ ๊ฐ’
๋ฒ ์ด์Šค ๋ชจ๋ธ kakaocorp/kanana-1.5-2.1b-base (Apache-2.0)
์–ด๋Œ‘ํ„ฐ LoRA (PEFT 0.19.1), r = 32, ฮฑ = 64, dropout = 0
ํƒ€๊ฒŸ ๋ชจ๋“ˆ ์–ธ์–ด ๋ ˆ์ด์–ด ์ „์ฒด ์„ ํ˜• ๊ณ„์ธต (attn q/k/v/o + mlp gate/up/down)
์–ด๋Œ‘ํ„ฐ ํฌ๊ธฐ ์•ฝ 184 MB (safetensors) โ€” ํ† ํฌ๋‚˜์ด์ € ํฌํ•จ ์ด ์•ฝ 201 MB
์‹œํ€€์Šค ๊ธธ์ด 1,024
ํ•™์Šต ๋ฐ์ดํ„ฐ AI Hub #126 โ€” ํ•œ๊ตญ์–ด-์˜์–ด ๋ณ‘๋ ฌ ๋ง๋ญ‰์น˜
ํ•™์Šต ์Œ ์ˆ˜ 988,003 (์–‘๋ฐฉํ–ฅ, ๊ท ํ˜• ์ƒ˜ํ”Œ๋ง)
์ง€์› ์–ธ์–ด ํ•œ๊ตญ์–ด โ†” ์˜์–ด
๋ผ์ด์„ ์Šค (์–ด๋Œ‘ํ„ฐ) CC BY-NC 4.0 โ€” ๋น„์˜๋ฆฌ ์šฉ๋„ ํ•œ์ •
๋ผ์ด์„ ์Šค (๋ฒ ์ด์Šค ๋ชจ๋ธ) Apache 2.0

๋ฒ ์ด์Šค ๋ชจ๋ธ ์ž์ฒด๋Š” Apache 2.0์ด๋ผ ์ƒ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ณธ ์–ด๋Œ‘ํ„ฐ๋Š” ํ•™์Šต ๋ฐ์ดํ„ฐ(AI Hub #126)์˜ ๋น„์˜๋ฆฌยท์—ฐ๊ตฌ ๋ชฉ์  ์ •์‹ ์— ๋งž์ถฐ CC BY-NC 4.0์œผ๋กœ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ƒ์šฉ ์‚ฌ์šฉ์„ ์›ํ•œ๋‹ค๋ฉด ์ž์ฒด ๋ฐ์ดํ„ฐ๋กœ ์žฌํ•™์Šตํ•˜์„ธ์š”.


์„ฑ๋Šฅ (๊ท ํ˜• ๊ฒ€์ฆ์…‹ 200์Œ, AI Hub #126 12๊ฐœ ์นดํ…Œ๊ณ ๋ฆฌ ร— ์–‘๋ฐฉํ–ฅ)

๋ชจ๋ธ BLEU chrF++
Kanana 1.5 2.1B base (๋ฒ ์ด์Šค) 13.78 38.11
+ LoRA (988K, 1 epoch) 32.04 57.26
ฮ” +18.26 +19.15

์ž๋งค Gemma ๋ชจ๋ธ๊ณผ์˜ ๋น„๊ต (๋™์ผ ๋ฐ์ดํ„ฐยท๋™์ผ ํ‰๊ฐ€)

๋ชจ๋ธ ๋ฒ ์ด์Šค BLEU ๋ฒ ์ด์Šค chrF++ Post-SFT BLEU Post-SFT chrF++
Gemma 3 1B-IT + LoRA 1.88 23.07 25.13 49.64
Kanana 1.5 2.1B base + LoRA 13.78 38.11 32.04 57.26
์ฐจ์ด +11.90 +15.04 +6.91 +7.62
  • Kanana base์˜ ์ถœ๋ฐœ์„ (13.78 BLEU)์ด Gemma-IT ๋ฒ ์ด์Šค(1.88)๋ณด๋‹ค ์›”๋“ฑํžˆ ๋†’์Œ โ€” ์นด์นด์˜ค์˜ ํ•œ๊ตญ์–ด ์‚ฌ์ „ํ•™์Šต ์šฐ์œ„
  • Post-SFT ์ ˆ๋Œ€ ์ ์ˆ˜๋„ Kanana ์šฐ์œ„ (+6.91 BLEU, +7.62 chrF++)
  • SFT ๊ฒŒ์ธ(ฮ”)์€ ์ถœ๋ฐœ์„ ์ด ๋‚ฎ์•˜๋˜ Gemma๊ฐ€ ๋” ํผ โ€” ๋ฒ ์ด์Šค ์ž์ฒด์˜ ํ•œ๊ตญ์–ด ๋Šฅ๋ ฅ ์ฐจ์ด๊ฐ€ ๋ฐ˜์˜๋จ

ํŒŒ์ผ ๋ชฉ๋ก

ํŒŒ์ผ ํฌ๊ธฐ ํ˜•์‹
adapter_model.safetensors 184 MB PEFT LoRA ๊ฐ€์ค‘์น˜
adapter_config.json 1.4 KB PEFT ์„ค์ • (r=32, ฮฑ=64, target_modules)
tokenizer.json 17 MB Kanana ํ† ํฌ๋‚˜์ด์ € (LFS)
tokenizer_config.json / special_tokens_map.json / chat_template.jinja ~70 KB ํ† ํฌ๋‚˜์ด์ € ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
eval_result.json < 1 KB 200์Œ BLEU/chrF ๊ฒฐ๊ณผ

์‚ฌ์šฉ๋ฒ•

์ž…๋ ฅ ํฌ๋งท (์ค‘์š”)

๋ณธ ์–ด๋Œ‘ํ„ฐ๋Š” base ๋ชจ๋ธ ์œ„์— ํ•™์Šต๋˜์—ˆ์œผ๋ฏ€๋กœ chat template์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  raw Instruction/Response ํฌ๋งท์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

### Instruction:
{์ง€์‹œ๋ฌธ}

### Input:
{์ž…๋ ฅ ๋ฌธ์žฅ โ€” ์˜ต์…˜}

### Response:
{์ถœ๋ ฅ}

PyTorch + PEFT

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

base = AutoModelForCausalLM.from_pretrained(
    "kakaocorp/kanana-1.5-2.1b-base",
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
model = PeftModel.from_pretrained(base, "harveykim/kanana-1.5-2.1b-aihub-ko-en-lora")
tok = AutoTokenizer.from_pretrained("harveykim/kanana-1.5-2.1b-aihub-ko-en-lora")

prompt = (
    "### Instruction:\n๋‹ค์Œ ํ•œ๊ตญ์–ด ๋ฌธ์žฅ์„ ์˜์–ด๋กœ ๋ฒˆ์—ญํ•˜์„ธ์š”.\n\n"
    "### Input:\n์˜ค๋Š˜ ์ ์‹ฌ์€ ๊น€์น˜์ฐŒ๊ฐœ ์–ด๋•Œ์š”?\n\n"
    "### Response:\n"
)
inputs = tok(prompt, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128, do_sample=False)
print(tok.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))
# โ†’ "How about kimchi stew for lunch today?"

Unsloth (ํ•™์Šตยทํ‰๊ฐ€์— ๊ถŒ์žฅ, ๋” ๋น ๋ฆ„)

from unsloth import FastModel
model, tok = FastModel.from_pretrained(
    model_name="harveykim/kanana-1.5-2.1b-aihub-ko-en-lora",
    max_seq_length=1024,
    load_in_4bit=True,
)

ํ•™์Šต ์ •๋ณด

ํ•ญ๋ชฉ ๊ฐ’
ํ”„๋ ˆ์ž„์›Œํฌ Unsloth + PEFT 0.19.1 + TRL 0.19.1
์ •๋ฐ€๋„ bfloat16 (Unsloth 4-bit ๋ฒ ์ด์Šค)
๋ฐฐ์น˜ device๋‹น 16 ร— grad-accum 2 (effective 32)
์‹œํ€€์Šค ๊ธธ์ด 1,024
์˜ตํ‹ฐ๋งˆ์ด์ € AdamW 8-bit
ํ•™์Šต๋ฅ  / ์Šค์ผ€์ค„ 7e-5, cosine, 2% warmup
Weight decay 0.01
์Šคํ… ์ˆ˜ 30,876 (988K / 32, 1 epoch)
์ด ํ•™์Šต ์‹œ๊ฐ„ 5.88 ์‹œ๊ฐ„ (RTX 3090)
Train loss (์ตœ์ข…) 1.377
Eval loss 1.413 โ†’ 1.299 (15ํšŒ ํ‰๊ฐ€, ๋‹จ์กฐ ๊ฐ์†Œ, ๊ณผ์ ํ•ฉ ์—†์Œ)
Seed 42

์ „์ฒด ํ•™์Šต ์Šคํฌ๋ฆฝํŠธ: training/train_kanana.py 4๋‹จ๊ณ„ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ: training/run_pipeline_kanana.sh Gemma์™€์˜ ์ƒ์„ธ ๋น„๊ต ๋ฆฌํฌํŠธ: docs/COMPARISON_REPORT.md

Gemma ๋ชจ๋ธ ๋Œ€๋น„ LR์„ 7e-5๋กœ ๋ณด์ˆ˜์ ์œผ๋กœ ์„ค์ •ํ•œ ์ด์œ : Kanana 2.1B base๋Š” instruct-tuned๊ฐ€ ์•„๋‹Œ raw base ๋ชจ๋ธ์ด๋ผ, ๊ฐ•ํ•œ LR์ด ์‚ฌ์ „ํ•™์Šต๋œ ํ•œ๊ตญ์–ด ํ‘œํ˜„ ๋Šฅ๋ ฅ์„ ์†์ƒ์‹œํ‚ฌ ์œ„ํ—˜์ด ๋” ํฝ๋‹ˆ๋‹ค.


ํ•œ๊ณ„์ 

  • ๋„๋ฉ”์ธ ๋ถ„ํฌ ํŽธํ–ฅ โ€” AI Hub #126 ๋ถ„ํฌ (๋Œ€ํ™”์ฒดยท๊ตฌ์–ด์ฒด ์ค‘์‹ฌ)์— ๋งž์ถฐ์ ธ ์žˆ์–ด ์‹œยท๋ฌธํ•™ยท์ „๋ฌธ ๋ถ„์•ผ๋Š” ๋ณด์žฅ ์—†์Œ
  • 1 epoch ๋‹จ๋ฐฉํ–ฅ ํ•™์Šต โ€” Eval loss๊ฐ€ ๋‹จ์กฐ ๊ฐ์†Œ ์ค‘์ด๋ฉฐ plateau ๋ฏธ๋„๋‹ฌ. ์ถ”๊ฐ€ ํ•™์Šต ์—ฌ์ง€ ์žˆ์Œ
  • Base ๋ชจ๋ธ ์ถœ๋ ฅ ํ˜•์‹ ์˜์กด โ€” Instruction/Response ํฌ๋งท์„ ์ •ํ™•ํžˆ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉด ํ’ˆ์งˆ ์ €ํ•˜

๋ผ์ด์„ ์Šค

  • ์–ด๋Œ‘ํ„ฐ ๊ฐ€์ค‘์น˜ (์ด ๋ ˆํฌ) โ€” CC BY-NC 4.0 (๋น„์˜๋ฆฌยท์—ฐ๊ตฌ ๋ชฉ์ ). ์ถœ์ฒ˜ ํ‘œ๊ธฐ ์‹œ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋ฒ ์ด์Šค ๋ชจ๋ธ โ€” Apache 2.0 (kakaocorp/kanana-1.5-2.1b-base)
  • ๋ฐ์ดํ„ฐ์…‹ โ€” AI Hub #126์€ NIA(ํ•œ๊ตญ์ง€๋Šฅ์ •๋ณด์‚ฌํšŒ์ง„ํฅ์›)๊ฐ€ ์—ฐ๊ตฌ ๋ชฉ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋ฉฐ ์žฌ๋ฐฐํฌ ๊ธˆ์ง€. ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ๋ณธ ๋ ˆํฌ์— ํฌํ•จ๋˜์ง€ ์•Š์Œ

์ƒ์šฉ ์‚ฌ์šฉ์„ ์›ํ•œ๋‹ค๋ฉด

๋ฒ ์ด์Šค ๋ชจ๋ธ ์ž์ฒด๋Š” Apache 2.0์ด๋ฏ€๋กœ, ๋ณธ์ธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ„๋„ LoRA๋ฅผ ์žฌํ•™์Šตํ•˜๋ฉด ์ƒ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. AI Hub #126 ํ•™์Šต ๊ฒฐ๊ณผ๋ฌผ์ธ ์ด ์–ด๋Œ‘ํ„ฐ๋Š” ๋น„์˜๋ฆฌ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


์ธ์šฉ

@misc{kanana_aihub_ko_en_lora_2026,
  title  = {kanana-1.5-2.1b-aihub-ko-en-lora: Korean-English Translation LoRA for Kanana 1.5},
  author = {Kim, Harvey},
  year   = {2026},
  url    = {https://huggingface.co/harveykim/kanana-1.5-2.1b-aihub-ko-en-lora}
}

๊ฐ์‚ฌ์˜ ๊ธ€

๋ณธ ๋ชจ๋ธ์€ ๊ณผํ•™๊ธฐ์ˆ ์ •๋ณดํ†ต์‹ ๋ถ€์˜ ์žฌ์›์œผ๋กœ ํ•œ๊ตญ์ง€๋Šฅ์ •๋ณด์‚ฌํšŒ์ง„ํฅ์›์˜ ์ง€์›์„ ๋ฐ›์•„ ๊ตฌ์ถ•๋œ "ํ•œ๊ตญ์–ด-์˜์–ด ๋ฒˆ์—ญ(๋ณ‘๋ ฌ) ๋ง๋ญ‰์น˜"(AI Hub, ๋ฐ์ดํ„ฐ์…‹ ๋ฒˆํ˜ธ 126)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•™์Šต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.