Download train/soup.py from doofz/THX-01: direct link, hf CLI and curl.
- Browser
- Download file 2.72 kB
-
https://huggingface.co/doofz/THX-01/resolve/main/train/soup.py
- Command line
-
hf download hf://doofz/THX-01/train/soup.py
-
curl -L -o soup.py https://huggingface.co/doofz/THX-01/resolve/main/train/soup.py
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) | |