add reproducible eval script
Browse files- run_random_baseline.py +69 -0
run_random_baseline.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""MTEB(por, v2) random baseline encoder — the FLOOR reference.
|
| 3 |
+
|
| 4 |
+
Design: each text -> a deterministic L2-normalized random vector, seeded by
|
| 5 |
+
sha256(SEED|text). Deterministic-per-text => reproducible + zero semantic signal
|
| 6 |
+
(textually-different but semantically-similar sentences get unrelated vectors).
|
| 7 |
+
Gives chance-level performance across STS / retrieval / classification / clustering.
|
| 8 |
+
No GPU. Runs locally with the same pinned-SHA mteb_pt tasks as the real models.
|
| 9 |
+
"""
|
| 10 |
+
import os
|
| 11 |
+
import hashlib
|
| 12 |
+
import numpy as np
|
| 13 |
+
import mteb
|
| 14 |
+
import mteb_pt # noqa: F401 (registers task modules)
|
| 15 |
+
import mteb_pt.register as register
|
| 16 |
+
from mteb.models.abs_encoder import AbsEncoder
|
| 17 |
+
from mteb.models.model_meta import ModelMeta
|
| 18 |
+
|
| 19 |
+
DIM = 768
|
| 20 |
+
SEED = 42
|
| 21 |
+
_EXCLUDED = {"OffComBR", "CSTNewsClustering", "BBCNewsPTClustering", "TweetSentBR"}
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
class RandomEncoder(AbsEncoder):
|
| 25 |
+
def __init__(self):
|
| 26 |
+
self.mteb_model_meta = ModelMeta(
|
| 27 |
+
loader=None,
|
| 28 |
+
name="mteb-pt/baseline-random-encoder",
|
| 29 |
+
revision="1.0",
|
| 30 |
+
release_date="2026-06-28",
|
| 31 |
+
languages=["por-Latn"],
|
| 32 |
+
n_parameters=0,
|
| 33 |
+
memory_usage_mb=None,
|
| 34 |
+
max_tokens=None,
|
| 35 |
+
embed_dim=DIM,
|
| 36 |
+
license=None,
|
| 37 |
+
open_weights=True,
|
| 38 |
+
public_training_code=None,
|
| 39 |
+
public_training_data=None,
|
| 40 |
+
framework=[],
|
| 41 |
+
similarity_fn_name="cosine",
|
| 42 |
+
use_instructions=False,
|
| 43 |
+
training_datasets=None,
|
| 44 |
+
)
|
| 45 |
+
|
| 46 |
+
def encode(self, inputs, *, task_metadata, hf_split, hf_subset, prompt_type=None, **kwargs):
|
| 47 |
+
texts = [t for batch in inputs for t in batch["text"]]
|
| 48 |
+
out = np.empty((len(texts), DIM), dtype=np.float32)
|
| 49 |
+
for i, t in enumerate(texts):
|
| 50 |
+
h = int(hashlib.sha256((str(SEED) + "|" + (t or "")).encode("utf-8")).hexdigest(), 16) % (2**32)
|
| 51 |
+
v = np.random.default_rng(h).standard_normal(DIM).astype(np.float32)
|
| 52 |
+
out[i] = v / (np.linalg.norm(v) + 1e-9)
|
| 53 |
+
return out
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
def load_tasks(only=None):
|
| 57 |
+
tasks = [cls() for cls in register._TASKS_TO_REGISTER if cls.metadata.name not in _EXCLUDED]
|
| 58 |
+
tasks.append(mteb.get_task("Assin2STS"))
|
| 59 |
+
if only:
|
| 60 |
+
keep = {x.strip() for x in only.split(",")}
|
| 61 |
+
tasks = [t for t in tasks if t.metadata.name in keep]
|
| 62 |
+
return tasks
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
if __name__ == "__main__":
|
| 66 |
+
tasks = load_tasks(os.environ.get("RB_TASKS"))
|
| 67 |
+
print(f"[random-baseline] {len(tasks)} tasks: {sorted(t.metadata.name for t in tasks)}", flush=True)
|
| 68 |
+
mteb.evaluate(RandomEncoder(), tasks=tasks, overwrite_strategy="always", raise_error=False, show_progress_bar=False)
|
| 69 |
+
print("[random-baseline] DONE", flush=True)
|