AUBIN-31B / code /loop_bench.py
emrevrg's picture
AUBIN release card, calibration, code (measured numbers only)
ac90ad7 verified
Raw History Blame Contribute Delete
5.07 kB
"""AUBIN Loop ölçümü (GSM8K test): üretici = Gemma tabanı (adaptör kapalı), karar = AUBIN (aynı ağırlıklar).
Aynı sorular, aynı adaylar üzerinde:
greedy : üreticinin tek (açgözlü) cevabı
majority@n : n örnekte çoğunluk oyu (self-consistency)
aubin@n : AUBIN adaylar arasından seçer (kalibre olasılık)
aubin+vote@n : AUBIN olasılığı × oy payı
loop : aubin+vote; güven < hedef ise 2. tur (n yeni örnek, önceki adaylar geri bildirim) — ort. örnek sayısı raporlanır
oracle@n : adaylardan biri doğru mu (üst sınır)
python loop_bench.py --adapter emrevrg/AUBIN-12B --n_problems 200 --n 5 --out loop.json
"""
import argparse, json, os, random, sys, time
import torch
HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--adapter", default="emrevrg/AUBIN-12B"); ap.add_argument("--n_problems", type=int, default=200)
ap.add_argument("--n", type=int, default=5); ap.add_argument("--target", type=float, default=0.7)
ap.add_argument("--gen_bs", type=int, default=16); ap.add_argument("--max_new", type=int, default=320)
ap.add_argument("--work", default=""); ap.add_argument("--out", default="loop.json")
ap.add_argument("--offset", type=int, default=0) # ikinci GPU aynı karışık sıradan sonraki soruları çözer
a = ap.parse_args()
from datasets import load_dataset
from aubin.core import Aubin
from aubin.loop import AubinLoop, GemmaGenerator, last_number, SOLVE
from kev_llm import resolve_adapter
a.adapter = resolve_adapter(a.adapter) # gizli Kaggle veri seti / kernel çıktısı adıyla da bulunur
ds = list(load_dataset("openai/gsm8k", "main", split="test"))
random.Random(0).shuffle(ds); ds = ds[a.offset: a.offset + a.n_problems]
gold = [last_number(x["answer"].split("####")[-1]) for x in ds]
A = Aubin(a.adapter, four_bit=True, think_margin=0.0)
G = GemmaGenerator(A, max_new=a.max_new, temperature=0.7)
prompts = [SOLVE.format(task=x["question"], context="") for x in ds]
t0 = time.time(); greedy, samples = [], [[] for _ in ds]
for i in range(0, len(ds), a.gen_bs):
greedy += G.batch(prompts[i:i + a.gen_bs], greedy=True)
print({"greedy": len(greedy), "min": round((time.time() - t0) / 60, 1)}, flush=True)
flat = [(j, p) for j, p in enumerate(prompts) for _ in range(a.n)]
for i in range(0, len(flat), a.gen_bs):
chunk = flat[i:i + a.gen_bs]
for (j, _), o in zip(chunk, G.batch([p for _, p in chunk])):
samples[j].append(o)
if (i // a.gen_bs) % 10 == 0:
print({"sampled": i + len(chunk), "of": len(flat), "min": round((time.time() - t0) / 60, 1)}, flush=True)
gen_min = (time.time() - t0) / 60
R = {"adapter": a.adapter, "n_problems": len(ds), "offset": a.offset, "n": a.n, "target": a.target, "gen_minutes": round(gen_min, 1),
"rows": {}}
ok = lambda k, v: v is not None and v == gold[k]
acc = {"greedy": [ok(k, last_number(g)) for k, g in enumerate(greedy)]}
maj, orc = [], []
for k, ss in enumerate(samples):
vs = [last_number(s) for s in ss]; vs = [v for v in vs if v is not None]
top = max(set(vs), key=vs.count) if vs else None
maj.append(ok(k, top)); orc.append(any(ok(k, v) for v in vs))
acc[f"majority@{a.n}"], acc[f"oracle@{a.n}"] = maj, orc
for mode in ("aubin", "aubin+vote"):
L1 = AubinLoop(A, G, extract=last_number, target=a.target, max_rounds=1, n=a.n, mode=mode)
res = [L1.solve(x["question"], prior=samples[k]) for k, x in enumerate(ds)]
acc[f"{mode}@{a.n}"] = [ok(k, r["answer"]) for k, r in enumerate(res)]
conf = [r["confidence"] for r in res]
hi = [c >= 0.9 for c in conf]
R["rows"][f"{mode}@{a.n}_confident"] = {"share_conf_ge_0.9": round(sum(hi) / len(hi), 3),
"acc_when_conf_ge_0.9": round(sum(x for x, h in zip(acc[f"{mode}@{a.n}"], hi) if h) / max(1, sum(hi)), 4)}
if mode == "aubin+vote":
first = res
# döngü: güven hedefin altındaysa ikinci tur
L2 = AubinLoop(A, G, extract=last_number, target=a.target, max_rounds=2, n=a.n, mode="aubin+vote")
loop_ok, used = [], []
for k, x in enumerate(ds):
if first[k]["confidence"] >= a.target and first[k]["answer"] is not None:
loop_ok.append(ok(k, first[k]["answer"])); used.append(a.n); continue
r = L2.solve(x["question"], prior=samples[k])
loop_ok.append(ok(k, r["answer"])); used.append(a.n * r["rounds"])
acc["loop(aubin+vote)"] = loop_ok
for k, v in acc.items():
R["rows"][k] = {"accuracy": round(sum(v) / len(v), 4)}
R["rows"]["loop(aubin+vote)"]["avg_samples"] = round(sum(used) / len(used), 2)
R["minutes"] = round((time.time() - t0) / 60, 1)
json.dump(R, open(a.out, "w"), indent=1)
print("SONUC", json.dumps(R), flush=True)
if __name__ == "__main__":
main()