Instructions to use emrevrg/AUBIN-E4B-Control with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use emrevrg/AUBIN-E4B-Control with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("google/gemma-4-E4B-it") model = PeftModel.from_pretrained(base_model, "emrevrg/AUBIN-E4B-Control") - Notebooks
- Google Colab
- Kaggle
File size: 10,025 Bytes
5daf54a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | """Kev eğitim kaynaklarından EK eğitim verisi: aynı HF veri setlerinin eğitim bölümünden, Kev'in HİÇBİR kümesiyle çakışmayan satırlar.
Kev decision-v7/train her kaynaktan 1000 satır kullanır (_meta: repo, revision, split, row). Bu betik, her kaynak için
(1) durum metninin orijinal satırdan nasıl kurulduğunu, (2) orijinal etiket -> soru etiketi eşlemesini,
(3) soru metnine giren satıra-özgü alanları (MNLI hipotezi, BoolQ sorusu)
Kev'in kendi satırlarından otomatik öğrenir; sonra yeni satırları rastgele bir Kev şablonuyla aynı biçime çevirir.
Sızıntı yok: Kev train/dev/cal/test/transfer kümelerindeki tüm durum metinleri (normalize hash) ve kullanılan satır numaraları dışlanır.
python kev_augment.py --work /tmp/kev --per_source 4000 --out /content/kev_extra.jsonl
KEV_EXTRA_TRAIN=/content/kev_extra.jsonl python kev_llm.py ... --train N
"""
import argparse, collections, copy, hashlib, json, os, random, re, sys
HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)
import kevdata
# hata oranına göre ağırlık (AUBIN Duo'nun dev'de en zayıf olduğu kaynaklar daha çok örnek alır)
WEIGHT = {"sst5": 2.0, "yelp": 2.0, "amazon": 2.0, "banking77": 1.5, "trec": 1.0, "agnews": 1.0, "mnli": 1.0,
"imdb": 0.75, "dbpedia14": 0.75, "boolq": 1.0}
def clean(s):
return re.sub(r"<br\s*/?>", " ", str(s))
def norm(s):
return re.sub(r"\s+", " ", clean(s)).strip().lower()
def h(s):
return hashlib.sha256(norm(s).encode()).hexdigest()
def state_text(st):
return json.dumps(st, ensure_ascii=False, sort_keys=True) if isinstance(st, (dict, list)) else str(st)
def builders(row):
"""Bir veri seti satırından aday durum kurucular: tek alan ve iki alanlı birleşimler."""
strs = {k: v for k, v in row.items() if isinstance(v, str) and v.strip()}
out = {f"f:{k}": (lambda r, k=k: r[k]) for k in strs}
ks = list(strs)
for a in ks:
for b in ks:
if a != b:
for sep in (" ", "\n", "\n\n", ". ", ": ", " - "):
out[f"j:{a}|{b}|{sep}"] = (lambda r, a=a, b=b, sep=sep: r[a] + sep + r[b])
return out
def learn_builder(recs, ds):
"""Durum = alan (temizlenmiş) ya da onun başı (Kev uzun metinleri kısaltmış olabilir). Dönüş: (ad, eşleşme, azami uzunluk)."""
votes, maxlen = collections.Counter(), 0
for r in recs[:200]:
row = ds[int(r["_meta"]["row"])]
st = r["state"]
if not isinstance(st, str):
continue
maxlen = max(maxlen, len(st))
for name, f in builders(row).items():
try:
full, s = norm(f(row)), norm(st)
if full == s or (len(s) >= 200 and full.startswith(s[: max(1, len(s) - 3)].rstrip(". "))):
votes[name] += 1
except Exception:
pass
if not votes:
return None, 0, 0
name, n = votes.most_common(1)[0]
return name, n, maxlen
def make_builder(name, maxlen=0):
if name.startswith("f:"):
k = name[2:]
raw = lambda r: r[k]
else:
a, b, sep = name[2:].split("|", 2)
raw = lambda r: r[a] + sep + r[b]
def f(r):
s = re.sub(r"[ \t]+", " ", clean(raw(r))).strip()
if maxlen and len(s) > maxlen: # Kev'in en uzun durumu kadar, kelime sınırında kes
s = s[:maxlen].rsplit(" ", 1)[0]
return s
return f
def q_text(q):
ins = q.get("instructions")
return ins.get("question", "") if isinstance(ins, dict) else (ins or "")
def set_q_text(q, old, new):
ins = q.get("instructions")
if isinstance(ins, dict):
ins = dict(ins); ins["question"] = ins.get("question", "").replace(old, new); q["instructions"] = ins
else:
q["instructions"] = (ins or "").replace(old, new)
def learn_maps(recs, ds):
"""Her soru anahtarı için: (orijinal etiket alanı, eşleme sözlüğü) ve soru metnine giren alan."""
maps, qfield = {}, {}
qkeys = collections.Counter(k for r in recs for k in r["questions"])
for qk, _ in qkeys.items():
rows = [(r, ds[int(r["_meta"]["row"])]) for r in recs if qk in r["questions"]][:600]
best = None
n_lab = len({json.dumps(r["questions"][qk]["label"]) for r, _ in rows})
cand = [k for k, v in rows[0][1].items() if isinstance(v, (int, bool)) or (isinstance(v, str) and len(v) < 40)]
for f in cand:
n_val = len({json.dumps(row.get(f)) for _, row in rows})
if n_val > max(30, 3 * n_lab) or n_val > 0.5 * len(rows): # kimlik/metin gibi her satırda farklı alanlar etiket olamaz
continue
m, ok, bad = {}, 0, 0
for r, row in rows:
o, lab = row.get(f), r["questions"][qk]["label"]
key = json.dumps(o)
if key in m and m[key] != lab:
bad += 1
else:
m[key] = lab; ok += 1
score = ok - 5 * bad
if bad <= 0.01 * len(rows) and (best is None or score > best[0]):
best = (score, f, m)
if best:
maps[qk] = (best[1], best[2])
# satıra özgü soru metni (ör. MNLI hipotezi, BoolQ sorusu)
for f, v in rows[0][1].items():
if isinstance(v, str) and len(v) > 8 and all(
norm(row.get(f, "")) and norm(row.get(f, "")) in norm(q_text(r["questions"][qk])) for r, row in rows[:50]):
qfield[qk] = f
break
return maps, qfield
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--work", default="/tmp/kev"); ap.add_argument("--per_source", type=int, default=4000)
ap.add_argument("--out", default="kev_extra.jsonl"); ap.add_argument("--seed", type=int, default=0)
a = ap.parse_args()
from datasets import load_dataset
paths = kevdata.fetch(a.work)
raw = {k: [json.loads(l) for l in open(p, encoding="utf-8")] for k, p in paths.items()}
excl = {h(state_text(r["state"])) for rs in raw.values() for r in rs}
used = collections.defaultdict(set)
for rs in raw.values():
for r in rs:
m = r.get("_meta", {})
if m.get("repo") and m.get("row") is not None:
used[(m["repo"], m.get("split"))].add(int(m["row"]))
by_src = collections.defaultdict(list)
for r in raw["kev_train"]:
m = r["_meta"]
if m.get("repo") and m.get("split") == "train" and m.get("row") is not None and isinstance(r["state"], str):
by_src[m["source"]].append(r)
rng = random.Random(a.seed); out, report = [], {}
for src, recs in sorted(by_src.items()):
m0 = recs[0]["_meta"]
try:
ds = load_dataset(m0["repo"], split="train", revision=m0.get("revision"))
except Exception as e:
report[src] = f"veri seti yüklenemedi: {e}"[:160]; continue
bname, bn, maxlen = learn_builder(recs, ds)
if not bname or bn < 0.85 * min(200, len(recs)):
report[src] = f"durum kurucu bulunamadı ({bname}, {bn})"; continue
build = make_builder(bname, maxlen)
maps, qfield = learn_maps(recs, ds)
# doğrulama: eşleme Kev'in TÜM satırlarında doğru etiketi veriyor mu (≥ %98 değilse o soru kullanılmaz)
verify = {}
for qk, (f, mp) in list(maps.items()):
rs = [r for r in recs if qk in r["questions"]]
hit = sum(mp.get(json.dumps(ds[int(r["_meta"]["row"])].get(f))) == r["questions"][qk]["label"] for r in rs)
verify[qk] = round(hit / max(1, len(rs)), 4)
if verify[qk] < 0.98:
maps.pop(qk)
if not maps:
report[src] = {"etiket eşlemesi doğrulanmadı": verify}; continue
n_want = int(a.per_source * WEIGHT.get(src, 1.0))
idx = [i for i in range(len(ds)) if i not in used[(m0["repo"], "train")]]
rng.shuffle(idx); made = 0
for i in idx:
if made >= n_want:
break
row = ds[i]
try:
st = build(row)
except Exception:
continue
if not isinstance(st, str) or len(st) < 3 or h(st) in excl:
continue
tpl = rng.choice(recs)
qs = {}
for qk, q in tpl["questions"].items():
if qk not in maps:
continue
f, mp = maps[qk]
key = json.dumps(row.get(f))
if key not in mp:
continue
q2 = copy.deepcopy(q); q2["label"] = mp[key]
if qk in qfield:
old = tpl_row_val = None
trow = ds[int(tpl["_meta"]["row"])]
old = trow.get(qfield[qk]); new = row.get(qfield[qk])
if not old or not new or norm(old) not in norm(q_text(q2)):
continue
set_q_text(q2, old, new)
qs[qk] = q2
if not qs:
continue
excl.add(h(st))
out.append({"state": st, "questions": qs,
"_meta": {"source": src, "repo": m0["repo"], "split": "train", "row": i, "id": f"aug/{src}/{i}",
"variant": "aug", "template": tpl["_meta"].get("id")}})
made += 1
report[src] = {"made": made, "builder": bname, "maxlen": maxlen, "verify": verify, "questions": {k: v[0] for k, v in maps.items()},
"qfield": qfield, "pool": len(idx)}
print(src, json.dumps(report[src], ensure_ascii=False)[:300], flush=True)
with open(a.out, "w", encoding="utf-8") as f:
for r in out:
f.write(json.dumps(r, ensure_ascii=False) + "\n")
json.dump(report, open(a.out + ".report.json", "w"), indent=1, ensure_ascii=False)
print("YAZILDI", a.out, len(out), flush=True)
if __name__ == "__main__":
main()
|