hoin1218 commited on
Commit
70c7f40
·
1 Parent(s): 29e8187

feat: add Korean benchmark models

Browse files
Files changed (4) hide show
  1. app.py +43 -1
  2. benchmarking.py +26 -0
  3. requirements.txt +1 -0
  4. test_benchmarking.py +17 -0
app.py CHANGED
@@ -6,6 +6,7 @@ import gradio as gr
6
  import torch
7
  from huggingface_hub import hf_hub_download
8
  from sentence_transformers import SentenceTransformer, models
 
9
 
10
  from benchmarking import (
11
  BENCHMARK_TABLE_HEADERS,
@@ -49,14 +50,55 @@ def load_model():
49
  return model
50
 
51
 
52
- @lru_cache(maxsize=4)
53
  def load_sentence_transformer(model_id):
54
  return SentenceTransformer(model_id, device=get_device())
55
 
56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  def load_benchmark_model(spec):
58
  if spec.kind == "current_adapter":
59
  return load_model()
 
 
60
  return load_sentence_transformer(spec.model_id)
61
 
62
 
 
6
  import torch
7
  from huggingface_hub import hf_hub_download
8
  from sentence_transformers import SentenceTransformer, models
9
+ from transformers import AutoModel, AutoTokenizer
10
 
11
  from benchmarking import (
12
  BENCHMARK_TABLE_HEADERS,
 
50
  return model
51
 
52
 
53
+ @lru_cache(maxsize=8)
54
  def load_sentence_transformer(model_id):
55
  return SentenceTransformer(model_id, device=get_device())
56
 
57
 
58
+ class TransformersClsEncoder:
59
+ def __init__(self, model_id):
60
+ self.device = get_device()
61
+ self.tokenizer = AutoTokenizer.from_pretrained(model_id)
62
+ self.model = AutoModel.from_pretrained(model_id).to(self.device)
63
+ self.model.eval()
64
+
65
+ def encode(
66
+ self,
67
+ texts,
68
+ normalize_embeddings=True,
69
+ convert_to_numpy=True,
70
+ show_progress_bar=False,
71
+ ):
72
+ del show_progress_bar
73
+ inputs = self.tokenizer(
74
+ list(texts),
75
+ padding=True,
76
+ truncation=True,
77
+ return_tensors="pt",
78
+ )
79
+ inputs = {key: value.to(self.device) for key, value in inputs.items()}
80
+ with torch.no_grad():
81
+ outputs = self.model(**inputs)
82
+ embeddings = getattr(outputs, "pooler_output", None)
83
+ if embeddings is None:
84
+ embeddings = outputs.last_hidden_state[:, 0]
85
+ if normalize_embeddings:
86
+ embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1)
87
+ if convert_to_numpy:
88
+ return embeddings.cpu().numpy()
89
+ return embeddings
90
+
91
+
92
+ @lru_cache(maxsize=3)
93
+ def load_transformers_cls_encoder(model_id):
94
+ return TransformersClsEncoder(model_id)
95
+
96
+
97
  def load_benchmark_model(spec):
98
  if spec.kind == "current_adapter":
99
  return load_model()
100
+ if spec.kind == "transformers_cls":
101
+ return load_transformers_cls_encoder(spec.model_id)
102
  return load_sentence_transformer(spec.model_id)
103
 
104
 
benchmarking.py CHANGED
@@ -51,6 +51,32 @@ BENCHMARK_MODEL_SPECS: Tuple[BenchmarkModelSpec, ...] = (
51
  model_id="jhgan/ko-sroberta-multitask",
52
  note="Korean sentence embedding baseline",
53
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  )
55
 
56
  DEFAULT_BENCHMARK_MODEL_IDS: Tuple[str, ...] = tuple(
 
51
  model_id="jhgan/ko-sroberta-multitask",
52
  note="Korean sentence embedding baseline",
53
  ),
54
+ BenchmarkModelSpec(
55
+ key="kosimcse-roberta-multitask",
56
+ label="BM-K/KoSimCSE-roberta-multitask",
57
+ model_id="BM-K/KoSimCSE-roberta-multitask",
58
+ kind="transformers_cls",
59
+ note="Korean KoSimCSE multitask RoBERTa baseline",
60
+ ),
61
+ BenchmarkModelSpec(
62
+ key="kosimcse-roberta",
63
+ label="BM-K/KoSimCSE-roberta",
64
+ model_id="BM-K/KoSimCSE-roberta",
65
+ kind="transformers_cls",
66
+ note="Korean KoSimCSE RoBERTa baseline",
67
+ ),
68
+ BenchmarkModelSpec(
69
+ key="kr-sbert",
70
+ label="KR-SBERT V40K klueNLI augSTS",
71
+ model_id="snunlp/KR-SBERT-V40K-klueNLI-augSTS",
72
+ note="Korean SBERT sentence-similarity baseline",
73
+ ),
74
+ BenchmarkModelSpec(
75
+ key="kure-v1",
76
+ label="nlpai-lab/KURE-v1",
77
+ model_id="nlpai-lab/KURE-v1",
78
+ note="Korean universal representation embedding baseline",
79
+ ),
80
  )
81
 
82
  DEFAULT_BENCHMARK_MODEL_IDS: Tuple[str, ...] = tuple(
requirements.txt CHANGED
@@ -1,4 +1,5 @@
1
  sentence-transformers
2
  huggingface_hub
3
  torch
 
4
  audioop-lts; python_version>='3.13'
 
1
  sentence-transformers
2
  huggingface_hub
3
  torch
4
+ transformers
5
  audioop-lts; python_version>='3.13'
test_benchmarking.py CHANGED
@@ -15,6 +15,23 @@ class BenchmarkingTest(unittest.TestCase):
15
  self.assertIn("multilingual-e5-small", DEFAULT_BENCHMARK_MODEL_IDS)
16
  self.assertIn("multilingual-minilm", DEFAULT_BENCHMARK_MODEL_IDS)
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  def test_get_benchmark_specs_preserves_catalog_order_and_ignores_unknown(self):
19
  selected = ["unknown", "multilingual-minilm", "current-adapter"]
20
 
 
15
  self.assertIn("multilingual-e5-small", DEFAULT_BENCHMARK_MODEL_IDS)
16
  self.assertIn("multilingual-minilm", DEFAULT_BENCHMARK_MODEL_IDS)
17
 
18
+ def test_korean_focused_models_include_kosimcse_and_kure(self):
19
+ specs_by_key = {spec.key: spec for spec in BENCHMARK_MODEL_SPECS}
20
+
21
+ self.assertEqual(
22
+ specs_by_key["kosimcse-roberta-multitask"].model_id,
23
+ "BM-K/KoSimCSE-roberta-multitask",
24
+ )
25
+ self.assertEqual(
26
+ specs_by_key["kosimcse-roberta-multitask"].kind,
27
+ "transformers_cls",
28
+ )
29
+ self.assertEqual(
30
+ specs_by_key["kr-sbert"].model_id,
31
+ "snunlp/KR-SBERT-V40K-klueNLI-augSTS",
32
+ )
33
+ self.assertEqual(specs_by_key["kure-v1"].model_id, "nlpai-lab/KURE-v1")
34
+
35
  def test_get_benchmark_specs_preserves_catalog_order_and_ignores_unknown(self):
36
  selected = ["unknown", "multilingual-minilm", "current-adapter"]
37