THX-01 / train /soup.py
doofz's picture
THX-01: number, excerpt and citation; ticket benchmark; thx01 library
6e6da1f verified
Raw History Blame Contribute Delete
2.72 kB
"""Average v3 and v4 weights, refit temperatures on synthetic + spatial + MASSIVE validation."""
import json, shutil, sys, os
import numpy as np, torch
sys.path.insert(0, "./train")
import train_v2 as T
sys.path.insert(0, ".") # repo root, so `import thx01` works
import thx01
from safetensors.torch import load_file, save_file
alpha = float(sys.argv[1]); OUT = sys.argv[2]
A_PATH = sys.argv[3] if len(sys.argv) > 3 else "."
B_PATH = sys.argv[4] if len(sys.argv) > 4 else "./ckpt/system1_v4"
a = load_file(f"{A_PATH}/model.safetensors"); b = load_file(f"{B_PATH}/model.safetensors")
os.makedirs(OUT, exist_ok=True)
save_file({k: ((1 - alpha) * a[k].float() + alpha * b[k].float()).to(torch.float16).contiguous() for k in a}, f"{OUT}/model.safetensors")
for sub in ("encoder", "tokenizer"):
shutil.copytree(f"{A_PATH}/{sub}", f"{OUT}/{sub}", dirs_exist_ok=True)
cfg = json.load(open(f"{B_PATH}/rl_agent_config.json"))
cfg["temperature_by_options"] = {}; cfg["temperature"] = [1.0, 1.0, 1.0]
json.dump(cfg, open(f"{OUT}/rl_agent_config.json", "w"), indent=2)
ag = thx01.load(OUT, device="cuda")
val = T.synth_items("val")
for l in open(f"{T.SYN}/spatial_val.jsonl"):
r = json.loads(l)
for qid, g in r["gold"].items():
val.append((r["state"], {qid: r["questions"][qid]}, {qid: g}))
for lg in ("az", "en"):
val += [T.reshuffle(*x) for x in T.tasks.massive_scenario(lg, "validation", 400, seed=77)]
val += [T.reshuffle(*x, min_k=5, max_k=24) for x in T.tasks.massive_intent(lg, "validation", 400, k=60, seed=78)]
val += list(T.tasks.intent_noul(lg, "validation", 300, seed=79))
vit = [e for e in (T.encode(ag, *x) for x in val) if e]
buckets = {}
with torch.no_grad():
for bi in T.batches(vit):
chunk = [vit[i] for i in bi]
bt = T.collate_items([chunk], ag.tok.pad_token_id)
lg_, _ = T.forward(ag.model, bt); lg_ = lg_.float().cpu()
for j, it in enumerate(chunk):
k = len(it["markers"]); buckets.setdefault(T.temp_bucket(it["qtype"], k), []).append((lg_[j, :k], it["label"]))
temps = {}
for bk, xs in buckets.items():
if len(xs) < 40:
continue
L = torch.nn.utils.rnn.pad_sequence([x for x, _ in xs], batch_first=True, padding_value=-1e4); y = torch.tensor([t for _, t in xs])
temps[bk] = round(float(min(np.arange(0.5, 5.01, 0.05), key=lambda t: torch.nn.functional.cross_entropy(L / t, y).item())), 3)
cfg["temperature_by_options"] = temps
for qt, name in ((0, "choice"), (1, "score"), (2, "noul")):
v = [x for k, x in temps.items() if k.startswith(name)]
if v:
cfg["temperature"][qt] = round(float(np.median(v)), 3)
json.dump(cfg, open(f"{OUT}/rl_agent_config.json", "w"), indent=2)
print(alpha, temps)