koelectra-emotion-7-emotion-base (ONNX)

ํ•œ๊ตญ์–ด ๋ฌธ์žฅ์˜ ๊ฐ์ •์„ ๋ถ„๋ฅ˜ํ•˜๋Š” KoELECTRA-base-v3 ํŒŒ์ธํŠœ๋‹ ๋ชจ๋ธ์˜ ONNX ๋ณ€ํ™˜๋ณธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์žฅ 1๊ฐœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด 7๊ฐœ ํด๋ž˜์Šค โ€” ๊ฐ์ • 6์ข…(๊ธฐ์จ, ๋ถ„๋…ธ, ์ƒ์ฒ˜, ๋ถˆ์•ˆ, ๋‹นํ™ฉ, ์Šฌํ””) + ์ค‘๋ฆฝ(๊ฐ์ • ์—†์Œ) โ€” ์˜ ํ™•๋ฅ ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

PyTorchยทtransformersยทCUDA๊ฐ€ ์ „ํ˜€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ์€ onnxruntime + tokenizers + numpy 3๊ฐœ๋ฟ์ด๋ฉฐ, CPU์—์„œ ๋ฌธ์žฅ 1๊ฐœ๋‹น ์ˆ˜์‹ญ ms๋กœ ๋™์ž‘ํ•ด GPU ์—†๋Š” ๋ฐฐํฌ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  • Base model: monologg/koelectra-base-v3-discriminator
  • ์›๋ณธ(PyTorch) ๋ชจ๋ธ: MelissaJ/koelectra-emotion-7-emotion-base
  • ์ž…๋ ฅ: ํ•œ๊ตญ์–ด ๋‹จ๋ฌธ(๋ฐœํ™” 1๊ฐœ), max_length 128 ํ† ํฐ
  • ๋ณ€ํ™˜: opset 17, fp32, ๋™์  ๋ฐฐ์น˜/์‹œํ€€์Šค ์ถ• (torch.onnx.export)
  • ๋ณ€ํ™˜ ๊ฒ€์ฆ: ์›๋ณธ torch ๋กœ์ง“๊ณผ 1e-3 ์ด๋‚ด ์ผ์น˜ (parity ํ…Œ์ŠคํŠธ ํ†ต๊ณผ)

ํŒŒ์ผ ๊ตฌ์„ฑ

ํŒŒ์ผ ์„ค๋ช…
model.onnx ๋ชจ๋ธ ๋ณธ์ฒด (fp32, ์•ฝ 452MB)
tokenizer.json HuggingFace tokenizers ํฌ๋งท ํ† ํฌ๋‚˜์ด์ €
config.json ๋ผ๋ฒจ ๋งคํ•‘(id2label) ํฌํ•จ โ€” ๋ณ„๋„ ๋ผ๋ฒจ ํŒŒ์ผ ๋ถˆํ•„์š”

์„ค์น˜

pip install onnxruntime tokenizers numpy huggingface_hub

์‚ฌ์šฉ๋ฒ•

import json
from pathlib import Path

import numpy as np
import onnxruntime as ort
from huggingface_hub import snapshot_download
from tokenizers import Tokenizer

model_dir = Path(snapshot_download("MelissaJ/koelectra-emotion-7-emotion-base-onnx"))

tokenizer = Tokenizer.from_file(str(model_dir / "tokenizer.json"))
tokenizer.enable_truncation(128)
session = ort.InferenceSession(
    str(model_dir / "model.onnx"), providers=["CPUExecutionProvider"]
)
config = json.loads((model_dir / "config.json").read_text(encoding="utf-8"))
id2label = {int(i): label for i, label in config["id2label"].items()}


def classify_emotion(text: str) -> dict[str, float]:
    enc = tokenizer.encode(text)
    feeds = {
        "input_ids": np.array([enc.ids], dtype=np.int64),
        "attention_mask": np.array([enc.attention_mask], dtype=np.int64),
        "token_type_ids": np.array([enc.type_ids], dtype=np.int64),
    }
    logits = session.run(None, feeds)[0][0]
    exp = np.exp(logits - logits.max())
    probs = exp / exp.sum()
    return dict(
        sorted(
            ((id2label[i], float(p)) for i, p in enumerate(probs)),
            key=lambda x: -x[1],
        )
    )


print(classify_emotion("์˜ค๋Š˜ ๋“œ๋””์–ด ํ•ฉ๊ฒฉ ์†Œ์‹์„ ๋“ค์—ˆ์–ด!"))
# {'๊ธฐ์จ': 0.998, ...}

์ถœ๋ ฅ ์˜ˆ์‹œ

"์˜ค๋Š˜ ๋“œ๋””์–ด ํ•ฉ๊ฒฉ ์†Œ์‹์„ ๋“ค์—ˆ์–ด!"      โ†’ ๊ธฐ์จ 0.998
"๋ฐค๋งˆ๋‹ค ๋ฏธ๋ž˜๊ฐ€ ๊ฑฑ์ •๋ผ์„œ ์ž ์ด ์•ˆ ์™€."   โ†’ ๋ถˆ์•ˆ 0.489 (2์œ„ ์ƒ์ฒ˜ 0.300)
"์˜ค๋Š˜ ํšŒ์˜๋Š” 3์‹œ์— ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค."        โ†’ ์ค‘๋ฆฝ 1.000
"์ ์‹ฌ ๋ญ ๋จน์„๊นŒ?"                      โ†’ ์ค‘๋ฆฝ 1.000

GPU ๊ฐ€์† (์„ ํƒ)

CPU๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด์ง€๋งŒ, ํ•„์š”ํ•˜๋ฉด onnxruntime-gpu ์„ค์น˜ ํ›„ providers๋งŒ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค:

session = ort.InferenceSession(
    str(model_dir / "model.onnx"),
    providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
)

ํ•™์Šต ๋ฐ์ดํ„ฐ

ํด๋ž˜์Šค ์†Œ์Šค train / val
๊ฐ์ • 6์ข… AI Hub ๊ฐ์„ฑ๋Œ€ํ™”๋ง๋ญ‰์น˜ (์‚ฌ๋žŒ๋ฌธ์žฅ1~3์„ ๋…๋ฆฝ ์ƒ˜ํ”Œ๋กœ ์ „๊ฐœ) 144,696 / 17,910
์ค‘๋ฆฝ KLUE-YNAT ๋‰ด์Šค ์ œ๋ชฉ 12,000 / 1,500
์ค‘๋ฆฝ ์†ก์˜์ˆ™ ์ฑ—๋ด‡ ๋ฐ์ดํ„ฐ ์ผ์ƒ(label 0) ์งˆ๋ฌธ 4,734 / 525
์ค‘๋ฆฝ KorNLI ์ „์ œ๋ฌธ (train: MultiNLI, val: XNLI dev+test) 8,000 / 1,000

์ด train 169,430 / val 20,935 ๋ฌธ์žฅ. ํด๋ž˜์Šค ๋ถˆ๊ท ํ˜•(๊ธฐ์จ์ด ์ ์Œ)์€ weighted cross-entropy๋กœ ๋ณด์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€ํ™” ์Šคํƒ€์ผ ์ฆ๊ฐ• (v2, 2026-08): train/val ๊ฐ 50%์— ํ˜ธ๋ช…("โ—‹โ—‹๋‹˜!", "โ—‹โ—‹์•„,"), ๊ตฌ์–ด ๊ฐํƒ„("์•„์ด๊ณ , ์ง„์งœ!", "์–ดํœด," ๋“ฑ), ๋ง์ค„์ž„("...")์„ ๋ผ๋ฒจ ๋ถˆ๋ณ€์œผ๋กœ ์ „ ํด๋ž˜์Šค์— ๊ท ์ผ ์ฃผ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. v1์€ ์ค‘๋ฆฝ ์†Œ์Šค๊ฐ€ ์ „๋ถ€ ๋‰ด์Šคยท์ฑ—๋ด‡์ฒด๋ผ "ํ˜ธ๋ช…ยท๊ตฌ์–ด ๊ฐํƒ„ = ์ค‘๋ฆฝ"์ด๋ผ๋Š” ๋„๋ฉ”์ธ ์ง€๋ฆ„๊ธธ์„ ํ•™์Šตํ–ˆ๊ณ , ์บ๋ฆญํ„ฐ ๋Œ€ํ™”์ฒด ๊ฐ์ • ๋ฐœํ™”("๋ฉœ๋ฆฌ์‚ฌ๋‹˜! ์ •๋ง ํ™”๊ฐ€ ๋‚œ๋‹ค!")๊ฐ€ ์ค‘๋ฆฝ ํ™•๋ฅ  ~1.0์œผ๋กœ ํฌํ™”๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์‹ค์ธก๋์Šต๋‹ˆ๋‹ค. ๊ท ์ผ ์ฃผ์ž…์œผ๋กœ ์ด ์ง€๋ฆ„๊ธธ์„ ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šต ์„ค์ •

  • 8 epochs, batch 32, lr 3e-5, max_length 128, fp16, seed 42
  • warmup 10%, weight decay 0.01, f1_macro ๊ธฐ์ค€ best model ์„ ํƒ (early stopping patience 2)

์„ฑ๋Šฅ (val 20,935๋ฌธ์žฅ, ์Šคํƒ€์ผ ์ฆ๊ฐ• ์ ์šฉ ๋ถ„ํฌ)

ONNX ๋ณ€ํ™˜์€ ๋ฌด์†์‹ค์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค(๋กœ์ง“ ์ฐจ์ด 1e-3 ์ด๋‚ด, v2 ์‹ค์ธก ์ตœ๋Œ€ 4e-5). ์•„๋ž˜๋Š” ์›๋ณธ ๋ชจ๋ธ ๊ธฐ์ค€ ์„ฑ๋Šฅ์ด๋ฉฐ, v2์˜ val์€ ์ฆ๊ฐ• ๋ถ„ํฌ๋ผ v1 ์ˆ˜์น˜(acc 0.6790 / f1_macro 0.6744)์™€ ์ง์ ‘ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ง€ํ‘œ ๊ฐ’
accuracy 0.6745
f1_macro 0.6699
f1_weighted 0.6757
ํด๋ž˜์Šค precision recall f1
๊ธฐ์จ 0.8975 0.8610 0.8789
๋ถ„๋…ธ 0.6380 0.6045 0.6208
์ƒ์ฒ˜ 0.5208 0.4969 0.5086
๋ถˆ์•ˆ 0.5749 0.5952 0.5849
๋‹นํ™ฉ 0.5271 0.5979 0.5603
์Šฌํ”” 0.5484 0.5433 0.5458
์ค‘๋ฆฝ 0.9930 0.9864 0.9897

ํ˜ธ๋ช…ยท๊ฐํƒ„ ํšŒ๊ท€ ํ”„๋กœ๋ธŒ(v1์—์„œ ์ „๋ถ€ ์ค‘๋ฆฝ ~1.0 ํฌํ™”)๊ฐ€ v2์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ •์œผ๋กœ ๋ณต๊ท€: "๋ฉœ๋ฆฌ์‚ฌ๋‹˜! ์ •๋ง ํ™”๊ฐ€ ๋‚œ๋‹ค!" โ†’ ๋ถ„๋…ธ 0.79, "...์•„์ด๊ณ , ์ง„์งœ! โ—‹โ—‹๋‹˜๋Š” ๋‚˜ํ•œํ…Œ ๋งจ๋‚  ์ผ๋งŒ ์‹œํ‚ค์ง€!" โ†’ ๋ถ„๋…ธ 0.98. ํ˜ธ๋ช… ์„ž์ธ ์ค‘๋ฆฝ("โ—‹โ—‹๋‹˜, ์˜ค๋Š˜ ํšŒ์˜๋Š” 3์‹œ์— ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค")์€ ์ค‘๋ฆฝ ์œ ์ง€.

ํ•œ๊ณ„

  • ์ƒ์ฒ˜/์Šฌํ””/๋ถˆ์•ˆ ๊ฒฝ๊ณ„๊ฐ€ ํ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์„ฑ๋Œ€ํ™”๋ง๋ญ‰์น˜ ํŠน์„ฑ์ƒ ๋ผ๋ฒจ๋Ÿฌ ๊ฐ„์—๋„ ๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ฅ˜๋ผ f1์ด 0.5 ์•ˆํŒŽ์ž…๋‹ˆ๋‹ค. ํ™•์‹  ์ž„๊ณ„๊ฐ’(์ตœ์ƒ์œ„ ํ™•๋ฅ  0.5 ๋ฏธ๋งŒ์ด๋ฉด ํŒ๋‹จ ๋ณด๋ฅ˜) ๋ณ‘ํ–‰์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ง ๊ตฌ์–ด ํ‰์„œ๋ฌธ ์ค‘๋ฆฝ("๋ถ€์‚ฐ๊นŒ์ง€ ์„ธ ์‹œ๊ฐ„ ๊ฑธ๋ ค")์€ ๊ฐ์ •(์ฃผ๋กœ ๊ธฐ์จ)์œผ๋กœ ์˜ค๋ถ„๋ฅ˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ • ํ•™์Šต ๋ฐ์ดํ„ฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ๋ฐ˜๋ง ๊ตฌ์–ด์ฒด ๋ฐœํ™”๋ผ์„œ ์ƒ๊ธด ํŽธํ–ฅ์ž…๋‹ˆ๋‹ค. ๋‰ด์Šคํ˜• ๋ฌธ์žฅ, ์ผ์ƒ ์งˆ๋ฌธ, ๊ฒฝ์–ด์ฒด/๋ฌธ์–ด์ฒด ํ‰์„œ๋ฌธ ์ค‘๋ฆฝ์€ ์ž˜ ์žกํž™๋‹ˆ๋‹ค.
  • ๋‹จ๋ฌธ(๋ฐœํ™” 1๊ฐœ) ๊ธฐ์ค€์œผ๋กœ ํ•™์Šต๋˜์–ด, ๊ธด ๋ฌธ๋‹จ๋ณด๋‹ค ๋ฌธ์žฅ ๋‹จ์œ„ ์ž…๋ ฅ์ด ํ•™์Šต ๋ถ„ํฌ์™€ ๋งž์Šต๋‹ˆ๋‹ค.
Downloads last month
20
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for MelissaJ/koelectra-emotion-7-emotion-base-onnx

Quantized
(5)
this model