From 809e45a5e01ecbe21ecbd91d6f8c0da1fe206306 Mon Sep 17 00:00:00 2001 From: Giorgio Gilestro Date: Sun, 5 Jul 2026 15:48:02 +0100 Subject: [PATCH] =?UTF-8?q?llm:=20first=20real-LLM=20prototype=20=E2=80=94?= =?UTF-8?q?=20recombining=20specialist=20LLMs=20(C2/C4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First step from toy models toward real language models, on one 16 GB GPU. New src/llm/ package: procedural task families + exact-match verifier (tasks.py), batched eval (evaluate.py), LoRA specialisation (specialise.py, manual answer-only SFT), weight-space merge via peft add_weighted_adapter (merge.py: soup = averaged deltas, ties = sign-reconciled union), runner (experiment.py, kind llm_merge). Base Qwen2.5-0.5B-Instruct (Apache-2.0); three disjoint hard families (lists/strings/arith); one LoRA specialist each (~90s total). Result (seed 1), reported honestly: - STRONG/robust: the merges are the ONLY models competent across ALL families -- worst-family ~0.25 vs <0.16 for every single specialist (the Fisher-Muller "generalist assembled from specialists" signature, in real LoRA weights). - MARGINAL: "exceeds every parent overall" is only marginal at this scale (soup 0.64 vs best specialist 0.63; ties 0.61 below it). - CAVEAT VISIBLE: averaging dilutes peaks (lists specialist 0.43 -> merge 0.26) -- Layer-1's "merge, don't average" (E4) appearing in real weights. The pipeline works end-to-end; the balance/retention half reproduces; the strict overall-exceeds and soup-vs-ties distinction need scale (bigger base, more/cleaner families, seeds, a dilution-resistant / offspring-selected merge) -- the HPC step. Env: Python 3.14 + transformers 5.13 works; note transformers-5.x apply_chat_template returns a dict. make env-llm / make llm; adapters under gitignored models/llm/, base in the HF cache. figures/plot_llm_merge.py, README, tests/test_llm.py (+3, 125 green). Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 2 + Makefile | 8 +- configs/llm/merge.yaml | 22 ++++ figures/plot_llm_merge.py | 81 ++++++++++++++ pyproject.toml | 5 +- results/llm_merge/README.md | 48 +++++++++ results/llm_merge/llm_merge.pdf | Bin 0 -> 21926 bytes results/llm_merge/llm_merge.png | Bin 0 -> 127175 bytes results/llm_merge/manifest.json | 20 ++++ results/llm_merge/resolved_config.yaml | 24 +++++ src/llm/__init__.py | 0 src/llm/evaluate.py | 61 +++++++++++ src/llm/experiment.py | 109 +++++++++++++++++++ src/llm/merge.py | 55 ++++++++++ src/llm/specialise.py | 76 +++++++++++++ src/llm/tasks.py | 142 +++++++++++++++++++++++++ tasks/todo.md | 12 +++ tests/test_llm.py | 39 +++++++ 18 files changed, 702 insertions(+), 2 deletions(-) create mode 100644 configs/llm/merge.yaml create mode 100644 figures/plot_llm_merge.py create mode 100644 results/llm_merge/README.md create mode 100644 results/llm_merge/llm_merge.pdf create mode 100644 results/llm_merge/llm_merge.png create mode 100644 results/llm_merge/manifest.json create mode 100644 results/llm_merge/resolved_config.yaml create mode 100644 src/llm/__init__.py create mode 100644 src/llm/evaluate.py create mode 100644 src/llm/experiment.py create mode 100644 src/llm/merge.py create mode 100644 src/llm/specialise.py create mode 100644 src/llm/tasks.py create mode 100644 tests/test_llm.py diff --git a/CLAUDE.md b/CLAUDE.md index 9c6e037..28ade21 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -87,6 +87,8 @@ E4's whole purpose is to isolate the effect of teacher **decorrelation ρ**, so **Finding (2026-07-05, E11 — the dynamic Lamarckian society: the vertical claim / C3, realized).** The culmination: a finite population of `N` agents (genotypes, `L` loci) evolves on a rugged NK landscape that *is* reality (`knowledge/dynamic_society.py`), composing the four operators the whole study built toward — grounding, directed recombination (sex), quality-diversity selection, mutation. Grounding is made load-bearing via the **consensus-conformity (self-consumption)** mechanism (GG decision): selection acts on `g·true_fitness + (1−g)·conformity` (conformity = agreement with the population's own consensus), so `g=0` optimises fitting-the-crowd rather than reality. **4-arm ablation (12 reps), each breaking distinctly, only the full society climbing (global_opt≈0.79):** `full` 0.78 (climbs to the optimum, diversity maintained longest) · `no_sex` 0.77 (can't recombine to escape local optima) · `no_diversity`/greedy 0.74 (collapses diversity fastest, stuck at a worse local optimum) · **`no_grounding` 0.48 (self-consumption collapse to an unfit consensus** — trains on the crowd, regresses to a confident-but-wrong mean; conformity−true gap ≈0.5). This integrates E1–E6 + the kernel + E7–E10 into one system and shows the society needs **all** of grounding + directed sex + diversity: on a rugged landscape you need diversity to explore basins, sex to recombine them, grounding to select on reality — remove any and you fail differently. `configs/layer1/E11.yaml`, `plot_E11.py`, README, +5 tests (122 green). **This closes the C3 vertical claim analytically** (the LLM rung remains the eventual empirical instantiation). +**Finding (2026-07-05, LLM prototype `llm_merge` — the first real-LLM step; honest/partial).** First move from toy models toward real LLMs (blueprint C2/C4, the real-LLM image of E8), on one 16 GB GPU. New `src/llm/` package: procedural task families + exact-match verifier (`tasks.py`), batched eval (`evaluate.py`), LoRA specialisation (`specialise.py`, manual answer-only SFT), weight-space merge via peft `add_weighted_adapter` (`merge.py`: soup=averaged deltas, ties=sign-reconciled union), runner (`experiment.py`, kind `llm_merge`). Base = **Qwen2.5-0.5B-Instruct** (Apache-2.0). Three *disjoint*, deliberately-hard families (lists/strings/arith); one LoRA specialist each (~90 s total). **Result (seed 1):** each specialist spikes on its own family; the **merges are the only models competent across ALL families — worst-family ≈0.25 vs <0.16 for every single specialist** (the Fisher-Muller "generalist from specialists" signature, robust). **But** the stronger "exceeds every parent *overall*" claim is only marginal at this scale (soup 0.64 vs best specialist 0.63; ties 0.61 below it), and averaging visibly *dilutes* peaks (lists: specialist 0.43 → merge 0.26 — the E4 "merge, don't average" caveat in real weights). Honest scope: pipeline works end-to-end; the balance/retention half reproduces; the strict overall-exceeds and the soup-vs-ties distinction need scale (bigger base, more/cleaner families, seeds, dilution-resistant/offspring-selected merge). **Env notes:** Python 3.14 + transformers 5.13 works (cp314 wheels exist); `transformers 5.x` changed `apply_chat_template` (returns a dict; render to text then tokenize; pass `**inputs` to `generate`). `make env-llm` / `make llm`; adapters cached under gitignored `models/llm/`, base in the HF cache (outside the repo). 125 tests green (+3 pure task/verifier). The full grounded sexual *society* on LLMs (C1 collapse, directed sex, the dynamic society) is the HPC-scale next step. + ## Build order (blueprint §7) — respect the gate 1. Scaffold: repo layout (§5), container, pytest skeleton, config system, seeding utils. `make test` green. diff --git a/Makefile b/Makefile index 02034e7..8ca946b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Layer 1 + Layer 1.5 automation. The uv venv (built from the committed uv.lock) is the # reproducibility source of truth; every target runs inside it via `uv run`. -.PHONY: env env-neural env-mnist test layer1 layer2 neural mnist figures clean +.PHONY: env env-neural env-mnist env-llm test layer1 layer2 neural mnist llm figures clean env: ## build .venv from the committed lockfile uv sync --extra dev @@ -25,6 +25,12 @@ neural: ## run Layer 1.5 synthetic neural experiments (excludes the h mnist: ## run the real-MNIST confirmation tier (needs env-mnist; downloads MNIST) uv run python -m neural.experiment configs/neural/mnist_collapse.yaml +env-llm: ## add the LLM stack for the Layer-2 prototype (GPU; transformers/peft) + uv sync --extra dev --extra neural --extra llm + +llm: ## run the LLM merge prototype (needs env-llm; downloads a small base model) + uv run python -m llm.experiment configs/llm/merge.yaml + layer2: neural ## alias: Layer 1.5 is the current Layer-2 deliverable (LLM rung deferred) figures: ## regenerate figures from committed results diff --git a/configs/llm/merge.yaml b/configs/llm/merge.yaml new file mode 100644 index 0000000..845a142 --- /dev/null +++ b/configs/llm/merge.yaml @@ -0,0 +1,22 @@ +experiment: llm_merge +kind: llm_merge +seed: 1 +n_replicates: 1 + +# (Layer 2 / LLM prototype — blueprint C2/C4, the real-LLM image of E8): recombine specialist LLMs. +# Train one LoRA specialist per DISJOINT task family on a small open-weight base, then compare the +# base, each specialist, and their weight-space MERGES (soup = averaged deltas; ties = sign-reconciled +# union) on a held-out mixed test set. Tasks are procedurally generated and exactly verified (the +# "reality that says no"), and deliberately hard so specialists are decorrelated. Expect (per E8): the +# recombined model beats any single specialist overall AND is competent across ALL families +# (worst-family accuracy), which no single parent is. Falsifier: a single specialist matches the merge. + +base_model: Qwen/Qwen2.5-0.5B-Instruct # Apache-2.0; ~1 GB, fits 16 GB with room to spare +families: [lists, strings, arith] +n_train: 700 +n_test: 100 +epochs: 3 +lora: {r: 16, alpha: 32} +merges: [soup, ties] + +output: {dir: results/llm_merge} diff --git a/figures/plot_llm_merge.py b/figures/plot_llm_merge.py new file mode 100644 index 0000000..a875eea --- /dev/null +++ b/figures/plot_llm_merge.py @@ -0,0 +1,81 @@ +"""llm_merge figure — recombining specialist LLMs (blueprint C2/C4, the real-LLM image of E8). + +LoRA specialists on disjoint task families are merged (weight-space) into one deployable model. The +recombined model beats any single specialist overall and — the sharper signature — is competent +across *all* families, which no single parent is. Two panels: (A) per-family accuracy for the base, +each specialist, and the merges (each specialist spikes on its own family; the merges are high +everywhere); (B) overall vs worst-family accuracy (the merges dominate both, especially worst-family). +Reads only the committed bundle. + +Usage: python figures/plot_llm_merge.py [results/llm_merge] +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np + +sys.path.insert(0, str(Path(__file__).parent)) +from _figlib import load_bundle, savefig # noqa: E402 + +_FAMS = ["lists", "strings", "arith"] + + +def _acc(df, model, metric): + r = df[(df["model"] == model) & (df["metric"] == metric)]["accuracy"] + return float(r.iloc[0]) if len(r) else float("nan") + + +def main(results_dir: str = "results/llm_merge") -> None: + df, cfg = load_bundle(results_dir) + specialists = sorted(m for m in df["model"].unique() if m.startswith("spec_")) + merges = sorted(m for m in df["model"].unique() if m.startswith("merge_")) + models = ["base"] + specialists + merges + labels = {"base": "base", **{s: s.replace("spec_", "spec:") for s in specialists}, + **{m: m.replace("merge_", "merge:") for m in merges}} + colors = {"base": "#7f7f7f"} + for s in specialists: + colors[s] = "#1f77b4" + for m in merges: + colors[m] = "#2ca02c" + + fig, axes = plt.subplots(1, 2, figsize=(13, 5)) + + # Panel A: per-family accuracy, grouped by model. + ax = axes[0] + x = np.arange(len(_FAMS)) + w = 0.8 / len(models) + for i, mdl in enumerate(models): + vals = [_acc(df, mdl, f) for f in _FAMS] + ax.bar(x + (i - (len(models) - 1) / 2) * w, vals, w, label=labels[mdl], + color=colors[mdl], alpha=0.9 if mdl.startswith("merge_") else 0.7) + ax.set_xticks(x); ax.set_xticklabels(_FAMS) + ax.set(ylabel="accuracy", title="Per-family: each specialist spikes on its own family; the merges\n" + "(green) are competent everywhere (but averaging dilutes some peaks)") + ax.legend(frameon=False, fontsize=8, ncol=2) + + # Panel B: overall vs worst-family, per model. + ax = axes[1] + x2 = np.arange(len(models)) + for off, metric, hatch, lab in [(-0.2, "overall", "", "overall"), + (0.2, "worst_family", "//", "worst family")]: + ax.bar(x2 + off, [_acc(df, m, metric) for m in models], 0.38, + color=[colors[m] for m in models], hatch=hatch, alpha=0.85, label=lab, + edgecolor="white") + ax.set_xticks(x2); ax.set_xticklabels([labels[m] for m in models], rotation=25, ha="right", + fontsize=8) + ax.set(ylabel="accuracy", title="Overall (solid) vs worst-family (hatched): the merge " + "clearly wins\nworst-family (balance); overall it matches the best specialist") + ax.legend(frameon=False, fontsize=9) + + fig.suptitle("llm_merge — recombining decorrelated specialist LLMs gives the only model competent " + f"across all families (balance); overall parity ({cfg['base_model']})", y=1.0, fontsize=12) + fig.tight_layout() + savefig(fig, results_dir, "llm_merge") + + +if __name__ == "__main__": + main(*sys.argv[1:]) diff --git a/pyproject.toml b/pyproject.toml index e446765..58e07b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,9 @@ dev = ["pytest>=8.0"] neural = ["torch>=2.2"] # The real-MNIST secondary-confirmation tier only. Install with `uv sync --extra mnist`. mnist = ["torchvision>=0.17"] +# Layer 2 / LLM prototype (blueprint C2/C4): LoRA specialists + weight-space merging on a small +# open-weight base. GPU; models download to the HF cache (outside the repo). `uv sync --extra llm`. +llm = ["transformers>=4.44", "peft>=0.11", "datasets", "accelerate"] [build-system] requires = ["hatchling"] @@ -31,7 +34,7 @@ build-backend = "hatchling.build" # src-layout: src/knowledge/ is importable as `knowledge` (the normative package # name the scientific-validation conformance tests import). src/neural/ is Layer 1.5. [tool.hatch.build.targets.wheel] -packages = ["src/knowledge", "src/neural"] +packages = ["src/knowledge", "src/neural", "src/llm"] [tool.pytest.ini_options] testpaths = ["tests"] diff --git a/results/llm_merge/README.md b/results/llm_merge/README.md new file mode 100644 index 0000000..4c3a3f2 --- /dev/null +++ b/results/llm_merge/README.md @@ -0,0 +1,48 @@ +# llm_merge — recombining specialist LLMs (the first real-LLM prototype; blueprint C2/C4) + +**Claim tested.** The first step from toy models toward real language models: does the sexual- +reproduction result — recombining decorrelated specialists yields a model that exceeds/retains what +any single parent has (E8) — appear in real LoRA-adapted LLM weights? This is a **prototype**, run +on a single 16 GB consumer GPU, not the full society. + +**Setup.** Base model **Qwen2.5-0.5B-Instruct** (Apache-2.0). Three *disjoint*, procedurally-generated +task families with an **exact-match verifier** (the "reality that says no"): `lists` (list ops), +`strings` (string ops), `arith` (integer arithmetic), deliberately made hard so specialists +decorrelate. One **LoRA specialist** is fine-tuned per family (~90 s for all three), then the base, +each specialist, and two weight-space **merges** — `soup` (averaged LoRA deltas) and `ties` +(sign-reconciled union) — are evaluated on a held-out mixed test set. Seed 1, 100 test tasks/family. + +### Results (accuracy) +| model | lists | strings | arith | overall | **worst family** | +|---|---|---|---|---|---| +| base | 0.15 | 0.15 | 0.53 | 0.28 | 0.15 | +| spec: lists | 0.43 | 0.16 | 0.71 | 0.43 | 0.16 | +| spec: strings | 0.08 | **1.00** | 0.80 | 0.63 | 0.08 | +| spec: arith | 0.11 | 0.22 | 0.78 | 0.37 | 0.11 | +| **merge: soup** | 0.26 | 0.74 | 0.91 | 0.64 | **0.26** | +| **merge: ties** | 0.23 | 0.71 | 0.90 | 0.61 | **0.23** | + +### What holds, and what doesn't (honest) +- **Strong and robust — balance / "retains all specialties".** The merges are the *only* models + competent across **all** families: worst-family ≈ **0.25**, versus **< 0.16** for every single + specialist (the best specialist, strings, is at 0.08 on its worst family). Each specialist spikes on + its own family and is weak elsewhere; the merge is decent everywhere. This is the Fisher-Muller + "a generalist assembled from specialists" signature, in real LLM weights. +- **Marginal / noisy — "exceeds any parent overall".** On *overall* accuracy the merge only *matches* + the best specialist (soup 0.64 vs strings-specialist 0.63; ties 0.61 is slightly below). At this + scale (a 0.5 B model, 3 families, one seed) the strict "offspring exceed every parent" claim is not + cleanly established. +- **The dilution caveat, visible in the flesh.** On `lists`, the lists-specialist alone scores 0.43 + but the merge only 0.23–0.26 — weight-averaging *diluted* that specialist's contribution. This is + exactly Layer-1's "merge, don't average" concern (E4) appearing in real weights; the finer + soup-vs-ties advantage is not resolved at K=3. + +### Takeaway +The pipeline runs end-to-end on real LLMs on a 16 GB GPU (specialise → verify → merge → evaluate), and +the **balance/retention** half of the sexual-reproduction claim reproduces clearly. The stronger +"exceeds every parent" claim is marginal at this toy scale and is the thing a larger run should firm +up — more, cleaner-decorrelated families; a bigger base; multiple seeds; and a merge that resists +dilution (e.g. per-task-family weighting, or the offspring-selection of "directed sex"). That scaling +is the natural HPC step; this prototype de-risks the machinery and shows the first sign in real +weights. **Falsifier (partially triggered — reported honestly):** a single specialist matches the +merge on *overall* here; the merge's advantage is currently specific to cross-family *balance*. diff --git a/results/llm_merge/llm_merge.pdf b/results/llm_merge/llm_merge.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9763e9771bfac144417a9c8ac1df4751e0fbaf9 GIT binary patch literal 21926 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

Tl5PLJbq#OTr2`Ef~a zml$br&QE+nERF_9ns~9OOYyeJAU;L+lBQrXQn22;w;n|SH>YarZQf}9^570dw1OyI zPVmJkt(!JgLnR&C880Ak;zLzSo`Ff)Ap0YfOs z16ISKNfvF)k~dawam*Ka;G6NG0aDTURn1(>qmy0>@g1-mYe1dNo;_Qjs@=qBiEmgy z18~7jyLNrM{Taw3ZhQz3MgGy1D^|SXt<#=2oH%UxW7@ZX-`>EOa`aTW@rEZ7(=NuA z)zK@D71g)m34}O}L?TIJ76GEnvIpCvo4ZCCHRDTa+Z#X_is^|?HHD@WV@KmAO~iUR z`$3cz0H_!^WkMr>syOT*hbBgA&nV~A6Q)HLxf1u`X^pVYE!&SIZ&)fRh^`ROHjJ4P z2?Y-tcj|-P340YNqG+}H3Q%I7nWVY%$fU;OW9*8n&(^Q8g*ON{T0$f32rCN9!3z^;}#?RK-=X#CUe8f2FDc%S=H!UT|xcd>5&8N|&2d zuU=g;eWgA{jUgDR%p$-TpGx;)(90MyfMvC)@Tz#;-n{XV-^IrQLD5@wyRjCknhl}O z3jyY(orFW|PL!mW5=mtT1WKce726dL^{8WvLG0hD+7h7vj-e{#>pB*^>BNaGB&S|* z4KDR-_wF^~LSjEPda?jo5?M|ih|8?~eH&3I45#Ff^#nRNotW!%?6Lf636Z86V*kFP z2^5S&HUtJesFTenujmxd8vNGx;YHunqoY^r%o{}Hn+PbA0H0aYW<=k_muCd_W-CfU zzQBiU|2cj7glgh5B2{emo}B&2xJ}85P5-%d>gD6dkEj29%G#3W0Y|!f_wK1|(%Fwr zw-fjQv?7m>>e#@HuM@1DLx&SUJr2@~ElFbb;3G}B5;VwMXPb%zn^Fm{DiaY@fx)Sz z{b|>U9TzGNMqDB}1yQ2uk_bbH?f#O<7Vz#y5kani1M)BF+MQUoLdMGlS)M#);U#); zcwy~6i`o)SCW+*%U2zY|95cE=>ALZc*oVz(I1QD-P!3@U5X1p=Eh$OiCG_DEl+902 zp_onvtY|E0{#2D$wTIHIAmQ+X?3v0&GCDLZeIAS8+v|M`B|7xPgmbkyIGyH9PF#NV z=}NlaNXOzURl_#0^MILj`|DE37A&7K^=uPq?J&*~zerPhgk`$?)4u`s4Z275>9!-n z=@QlWaHhA(sg5%ui9T6+J9(@D0at$x3tsbO7ncI<_u@-;gUp!S&%yAyN~(6bIF)IzNH=(2c$}5>e?>-OA=+`mIq(M;E z20;hxJj)9AcL{`Me~_l6(=GhM$A~l;q$Sq%*pfL;L?n420v0JLQFd>UmllE ziF`X{;hZ_0Kl=?z)t(qTqt@>s<-Pp7#7@W&!Dd~(a$o4fzl#QHlh8fsHp0-jpJ<80 zAN^nxxD|JP-*lwcsSp{|%l6YfimT8GxI%M}XyDG3`uX@Ytoo4W@{PN9p9;sN^RdR1 z_Nr4Ub{ai-#*lBb3HMv|S!CM9pBq#)36l8w>sqI-P)|A)7@L^v-?MMuU#5#K+?>mv zJbAKDW$N?QUk^N59QAlpY2{5u6S@4uA+z}7dM~f*uQOXrcWC_7n|;6NUij)aalpvY zB~}lXHfwbA;=;@2!<;Tj0x#D$(|Wl5d_L5=+~w{4$ern*Kmrzboi&K)=rM&K%cX4^ zZEd}CUXPVj*8$Gnb(niQxOMMwRis7 zZ+Z4@t+hU@VV-=7Z)IdSaXAOXub$=`{g za(qA;vj{-7xCivQi+RpFxb^zyu6o(}lJ@aO-yQy0VYf#Rk`A9+%EL}r@+R4HN9#-q z@NThN^fR7tuModRl6vGE_0HR1%oY_|zNz@Z67Jr5TiWN@wh6g>EtJqS>P_}MqtmSE zNywfzsU*H+z-LaU+IV&AP4?%Y7sq=lE<_ugh>NrDGV^M12Ir{L*ImgKw%`4%uJ-!d z)YS9s=m5dknptL_@#%>+ZYD*BW?}fTV{YXf_B~_Dlgrz_nLLmEt8?Yajunp^-9JF8 zhf~fo-&G&@ZYiJd=$t%u9h9?&>5n~rCe$8u6@1;y(Vh19#<}H`R?b(@=Q-aKGzqV`}64mc)XmM}nGTUdXZ9eU{{^DqN)=~faMTaIHA1x+TbZy|g z)>^+}cf>0bnhRHXl9kwaS@9j}!UU$6-Vbusv1IdQ_*P00;LTRh*c z{siLV!Xd50KsI$X*1C2|Y{2l*o!6Z=w)xR=;41qfV^)2t(j9m$K95qM;RWi+Wto?9 zd7SYD8!kF(HEGcz^Xxe??<616H>*+Nq9y3%mtPYP?t-6Q-6AcB>)d-^&B^OC!!l1( z5?DA^LQNEAt54aWx9@pb;&QvCExdlZEnT{6#Wnre-~J*X3PJDemLYEko?ZC-pvsPm zL!7s`4s`*)8xj6QEB^pf)$jN7?vVsJSqq`lKBB{M36f1-M17D`I4i+1JEbTKR=f6V46! zGG>umr`&>tbFfzCy|O&(YWk*T|7wy~`Q_3lKL_XO1{RzKgaeZA=ku|A)xc%`+ao3fcx4GYS>#Yn^H_z$ZXIOX(zgjK0xm1%71M8Mqj*0s*^5XcWB|B`bR1H(L z-IgsQ}_59zN~4EBG0j};nO=K+S2|K@;%bzSd9h; zWkC2EgBsP_^r_q0B+jwI;U9n144v8b#c$tsF&?|U0ghj%HUqnl&n_Lg{WcDx?QxZ& zTbVOz&^60XDWM_L&Y=2wlt_zI5-#5Uu#yWsy*8ywD*wG&Wy9EBPLndVr_)XpY#sZi zLEQ|U;yAsJ*|rDs<|EVo+7(C|M3+6Cdmfj2*Q1??vz06*srN zV;&op>QAxl0!1PJqjURZ{$ZEZ*@OYq^kjD1_*b!B?aVED@3%8vm>-#ze|WaTiEjR? z`cZ2P{7$S2n$<>YK%usEiKE@osy(<1O>M;6pS!$`u5>Qy(=n<~1Ffg$6Us*Iaf^n< z)QVhxJo&RhxrxtLf3wZ|Q3Wh9^is)x4p&lA^##Qo6wV+D6r3@J7Z3g*PIod3+z|JbVcitEb6);VRcMp-v&2Y zve1RmIv7_TKTf7%Px_V6yvs=nIL(VbXU?9@PcSVKFwlA9#o(Z&E_5j=o9b$i&eXwk zM@bnpZTuUpJRyyllY~WS$tFp3UVdKV)H)maRFK$8+sst`E zh{$+Xn@~E7lWv~B+>d#Dd0RC_Bdb5bzZCq_P(e{o`)1{RSnjy&YVxE6$d6{GBlk4k z-!$C28Qk?cs5P4IF1=otwSMn=>r`^`kOhNCr0LdcAe}jJ)$4m~qS&9% zjiI&SpN81k1@DW_n6CG3+2}p1GnwbNsdRgRdxuaAB`HW70+%C9SK zM@})dwwD|~E;ot%7}d`?;~*FQvU-WL@9Ie0=9}e>9cE#&(%-RQ?_G{!IK zS2XX*liA-b?wRYNMK3lj4%js;?$(KazdP7_6i>2EAyKXKTYhZz^UDK7qf5Cf@+GII zv#UjQUg)*bpG@Dtl@3F~-e5WOESu!U}eIdoqim zD zp2ZHfYkC_xrcUO!sDuwD6&5z)4_0*2y+BMx|~R_>?1 z{rg+|Y^dhR1-H0?ad?37FfuFZBkEG5smhJJ;FV$b?Fxm6l5}ad^~`^=!+JStw4Q$K zQ=JjhlFN6a??b^FIY(EtQm{iH82W!5IN|M+UG@#sOHtTI0PZzB^G!7K{m+{0Fe|Ng z9`O3k!-u<8#v@QvBwjFV;GG(yQvaq6FbTfgb52@4y}lh00$SZuZ}ZojwDSOJRyoXM z86(N^^f>t{Bh6o5h`P|u;8%6$DdXeqHpNzuA>&8M+ZGmDB2zqEyDsbf{R>J;wxa%*rj)TtJ@bDKf79Ysx{lVWkssiWq!cHrg{S z&y_n$y=X&r1M}lM=!B;dZ=8GC!utDHdPX(kZ3JwiC+uW2*#$}USErMohW4~=H5BZi zDrcdBa>5VrLfP)&LLQ8s+X3euj1=GxUiZk3*46KK{4wxU7tCqp_5ja|qdW;wm_CDAVehdum#mn==r~n4%RM3(bcQ_Y11!P%w7UCF_U1 z8nvA~&>(hA6U(q?w&pIr4}+?4nIO|{FS1jdkS#G|74=X84HtS%4`hHAHjaErkEfMhbm zs*cv<5B&U)H$1$=E%P``OMBPqSn3UV@yf zQ_qk>qjhnzU5aZ!Sm?G3XDfOR_F#hM;jCfB;k8QMgYL_G3uVXJK{eV$Fa~qf&!-LF z`h~VhA92KGwGoaI;3yH9Q`>0FIjggL{2k1qG4rO{7L0MYT^qc5d{ZskE4E86>#w*~ z%lh@6Ejk6UI%|7p9{EG9MMkHY{WITg>Ey^)`*()L7QcvE+`wASn4Q-N8G9R;7S*^^I_5e(`yyC#qnw}v2Tp#94gat_(I_~`yiXhFNuNe6#yq*D z^?>GEdOUjaM6&nA)F3XWRZoNg9=J;HOv(fYkNrfz(UH|(7Aslzs9GLZnsX~d@V|y=~T2ZO4VesFJHcV(Hs<1 zGWTqYb`P(L42#nzI{3EazB7Ee!tq&?v)M(eBdcF=XDO0WWbknlca+`hc)d6KPmK~F ziD#qe4yX_~U3M&l%7rPQn?q;J2)q7#C+EgA`gTD~q+l}qi(w6QLc(HX1h4t7aSwVh z_$YGw>PD3lMvOnu?e@7XU3~XX(P}l(`Q60?y@_AwpXwuCX0(S)*t~`pIbN;0NK0k( zCX){X9gH^yEj!><+|KlitH$M9JC;=1T>oroo^!jJ@BNDzsYhKV)e6i%7IN2N@nR!D zOlRZzmgf^|mGlC9h@7U3Yj)K=k2+EA93rN%R@MM(cN{yOvuHVOjHvt&<3;A|k4m_* z)7}3hDqFO5qSHkgHwa9uVdKU!)lrcEiPL0R2ehu2@6J3v=+faXEBG%n9*7@H)`5DR zI_r-f?I;sj=usv93)i!}9wZ=ZzQ5_DYNK!siXRgs^`Fdh!B6Q=*jJ!Wg;aN=+M&^5=mtg`*IztPdGznYn6IGa~4*frew z{W1@|kGU5TS~YUMFzFwUa9_9Rp6>Ur+7_5}IMfEQXXB2u3k-8F&7XrdT=As)+*7PS z?{XJj(TmDo(DXxDjyOo}SdH1^Y&&NAHh!$2GTR0J)YL79Idl4Wl!aaQ7B7fhALGFT z`E%+-7VVnX%%e@e+6iwek*~x%X$GE*T`@`{tLeapK_j2V8n&Eb{(717f+L}kPHiC6 z{4u-=cLR&C9)z5uRwf*g_BQJ6(TheOZ!uGm-#Ls^UIx3s0J%{@9p8V?{N6QMFXLdND7}>uNc8dJ zP_O{f>xK7_>6V+fY`KmQjP;wcdRoU*Whbn^Y2WBqKl!76@!p8oTl39}COJ>HJ|A6u zRO>QX-K=X7Pcytu1TuSuKGL&(R{d-9sU z|Gt_qnaF+F1}tfQU5EN#-AUdnIqc?+$Ynj^8=Y?5>WlD=3Qx{26wV@i15K%Y((d3a z>*S1tZaZvJ^^4*nJ}x)--euT!LtF|vm!90vdDqO&{HJkb=s+2XE^8fy+p2G+61hqm z)G(A$XV0GPP=8KXMqz_a7yIK-;C2>lm z_w)urbA7eEBtFB;>CUeY(1FOL8(0}9DlEy7L6f2y^44&kM6#l|X-8fMW-lelze4}V zFW!ns%=u2$Q74HyGQ7g_ZaJX-E*q`X+f19LQ|EERJTIImI8Uvuy4iS&u1{~9Q6+~n%Z zO%7g9Rnb~qSEb;~O|*vJzke6=6daZe;_`W-(eg=#&E1%Po;-nJ@NAJY`SJHmAmxTZ zu75|wzQrw{gszPs)#}shBG^b}CsdIM4rh*LwKHry=@`n{ueR60iNcLbH7oa?i;ect z&&zG1hbU{bOH`CWjUJO2aw+T`+fgW8M~TjNJ)_lmVMgve4IRHl>#eUgosgWfpPy0P zmUfMf=)FHbzh4|*Pp8L2uH2xe}&)SJbK9{k?2nI zqQ)L;tf8om+n7}IT3G=dV6o~&T?Lnj)s6G|`v|F(^Grfj39s`c;f5Qwp6Q3ls!BN> z&QABInt)ur$~3x7*K&8f?~z#JwiAcRwM##CdB3Rah9sFvUf-_4reylt_`-HkmGiC4 zSHGh5f{zgu8$;g}#B_8Mlu6_9?vohiVx6;CtOb8w0O><=9c!ZiAinQdSJH zu&4vC|LEMj;Ojk6^Cr_H2l*BdmR3zcaO4oS@`3N<@j=vwDtccYM2Gn8fjYD>d)c&G#_J0&Hu^4Fb|>6cwvP#1vQ|Y1R_f37k)R9=J9_jL zT6E=lnz>!U(#)ZyAy9MEMNbcbJ{4Q^gGt%yMLW117P#2GR69q_D$2nbGdg^=jAmOf z(s%rvA6f^dzzYd;ro0eHF?G0I5d4#CgO)WuFQIK;I)@|eTD)7K^5azfMo_smER9kx zo*jQP_VU0ctxHVre)PRv==RI--PajZOU_#dRFDa_J}vJhHwLqS3N|$^EiLs#hid=b zci<+^#T6p;Ixv<+vi(t4M<9iqMaPV6m$>jDgzi(Og74{+>tO`F=05A#DE5nu%|GBA z96W`UlUAHqVH<62Vc~cD31T484ftd(%#CYkdgGdwNAtdsL!9?Nsa9}uS&$DJ?r=|9 zDkAl3!v~rWhRPLE@IAr&S=rI7OEufYs%PA1Q|L~1!+R%rtdO{cw;n);__()!24yTn zd_;sgmq<|DNy*TKd{AuGuAPM$lmkc67_`mC^}Wui*phd|E0E~3tM;}dq3R{`MGc79 zMTbt0sz9UJy-SJJZyyDV(9iknfczr1nPy?Fj0k*K>6Z4t_XAu<4cc8U4oXI=k^+&b z^3UwoagpIcWJ>78lS%sJHP)^O99=Z)Q4?)1Io=8-YfxzN^pznkqzI{chd zVJkvYRm>y>@x_GaqgGCH;;Rz8t;n2bPwu4vk%QUY$oUR2)k;or94Ab$o;Y{95YSU0 z+H@NH9po_HmP#$|)ZWG(Q;`6>DM^UVQkts>n@+&1t^Pn9KBM;;*HcPw_I}=0Pj7^i z-DP@WX8grHa_u(nDRf9p%WQMN@Je5htAL)=Cyy>HY$Kr!a}eu`BtUtAhADsYzqJ!r zmG4-YM5wu8%*t;Wuju4Sl@FLBM>ViSRhGZb)1jUBJqKu2MlCq6dntWfigBRs*e%ZE z9t>1p@D?`6M?!@8PXv_#dh$t!p9IG!r&<*7BI%9OvW0%=>Lm*LMqeX!oFh@ci z@#K!Pw3M-4KC8ovUcS8AD{yaLx1;G6;VkQ{y}kTe9I?~9+P8*j(arG=5P33dPLUk! zlm$!4PTM9;M7+diM4u}I7hZ(IOWEPwSR>-!=@D-)*Gg^DpiZ4@_<_vU90T2#ZUEtY zbgpaU5c4z{uA}I7%@>cRl`%H4?%Z%##`F`{%+W6v!i-~3(g8KwtYS%)yp*^+(S@%b zzELmX7DA?j^S0-qhBF#A9oZ?HW+QZ9H3dMdyleWefi{ znQM|;e-jCaBfjQm?7D!kzNED`9tzt=j&7GZpGa-*BOQ#*I{`CvW zIj07}%ya_e$^1OosugK68XUI6_}ta1RZ{|ccIi5=rIUkX5w~j93PbUYr~3j3@Me}k zSEF}))z?K891lL%ZN{aUA4q$GFc=4IG;e&HKy%yAJ|Q2Ta+ixp2#;qd zj)&Yc5!p6Dy<=_C`h^-5Tbg&?cdG2|k+#v>xNk z4;~LSv6(s9_IlrATl>ZJgXWrxzIFp29?dMGG^=|I6z!p=rdHEaWvU1yWoQre!E{bQ z;ea` zPpon}6Dp7%9>3;i!u6i0G+^$}o$H0(J23vxj{PPcJDzMpI8=<5tp&;-n&Z5q3!X9};RIK1 z7S@t;kX#5-k-YLVI+^4l9OMDJW=fioKiB{`lM$z9O;51M7)W&A`DbXooKq(N@-mW$ zD@(JG$=$9`>es2WGp-WhQunGM+MoZuyI%f$|8BpBTrqy+Q9{s-_nd_b`U;vrvINpq zQ6l>J`B~pE&cAU5SfQq8J#6_d2NSunZ3`qSE4RFXCys%W$>$BmJ_|Yz%(h^n@`zoL zKLI)C)`_W^nHDaUfcj<+CA7nJKt}8L8R@4u35}pv5xt_IW#PmEK%U{JVnyG}DH=Vn z%PAyye<>26rFq*fRl9;qoERfwXC7SOs1%*?2{wbH3-1{I-&!+AaH($FP>TNp^7aq* zmEB+}s!5V|bTc>%2&}Gh@7}%XqVz;>HnXy_(uKox@q3AFjGGT=8w15|g#3KLA&8mX ztf<}y-r z+*gt`lpdRWyh!CD=EIX%N&Hjx0UXEnHUc(+d;=epV{^_b}nk<;L)1Kl$ZkeduTvZH|g5e zmlJD6w}KS!icXK|A8 zNON*#p~Y-6@jS%aZ}s*4K0kl_&{k%;xMaz$f_b?OMRN<@CX1Gje?cG-cei)wLf5Ib~EcdonttC|auS+Im^T4TcY(>tg?s1PXU8#8=c4Me5 zrXp+6!>KxR5}Gv~duHZM`=v|Ir^jZrZaT-qx>?#vGAQaQAHRHQvd_-aG6{Sr{&UU= zhn@5c+mP$aB0WtT#;#=9>SSsW(!%-e(_Xxk|OEq+PxRag+n|x1Rk`EO+MaalCar@5mZx0gZSMbKt~is;9Sb zI+_>k9Q;)oAe06C8P`2P9-X2XfM zva+@iW9G|yigDII!Yk9Vt~wMt8Y4=HEi+-6{B~Ku%gmsNvrBMcYRE>FsW^}s(OIkW z6(s$O3&v#+n2(OnE*Ld$x=Z)n`}b#YKBo+L+qhEV=O`c#UN6Y^SXauK(SzxW9M=Zt z7w{5+w;q8*>2|wFI7G?D(9$VyDw1LYL1KHPihlNI!%8_wutproTKTQ$P9KI_ADWl+ z2sy@{IR(0LO(IEGG0@lFv3ppbg*2h*n0-?+l2BPaV(07rmf!c*TAk>8sn7Hi`FkGt zY8hNV=%DTdK(}*uC!ih~M)&I6t{2M|ux#IQN;+i@B+g4k_qJyE0Pj&FM!a}*#PIg4CtRqxDbz`+dxwRb6in)L(on@|B}q zn4|tj5$KftN1)T#f6Rd#Bi{uRCwb_Gr2p301JS)|;t)dM< zt?xxW!o?T=VV>*`Sjo>TzSl@=1%dtcyVR?m%%&GcuCGIvmb_WvN55io}FEe z(Zzm-ep5GZMASr7QZllCRu9IifUE-OF<1HxT6vk2%O6=!7|s1pz{}=rL&Ab?x!1CJ z%qsCmealKSf7Rz7j*49EA|6N6X1(uSyQWI#b)5{i7>3Y`>Xq$Hs?2(rVp4az+Icj# z>~O`}%1WZ*X(j`TXReSr?!9{1u4qw~|C}c!N$V?Dt_*M;9^@0##dnv*%a16PFJ>i- z-t#VF=dy5)?W=rdn$>S~WcjUkeuT^b3neJq!((I@H?PH$@%bWdv46D!HCPS(epf^; z&ff>iJ=D&wDR(&bJ2MtZ!Gy^>zy+qiy6%IeA^3X9Yox36QaV;^APPQ+<8#(5vF`G- zFb*^KJQ;;WfzK#`J1BMqoDzpEhhp!g=g+qDAaP2B=Cq;I%w9cea!tmRtj;XM+?bo- zUI&buSge|Rjpt`Ph@>JN#yh9qs)0f|vbYbaIKA(Wp|%-Eh*kWBDF>(Pb$)NK_<8kA zCQv5-_Wy0fp=URY*+?k~0ga-kvx{}D>gW3mLcoBIvZk_%AWH#K99#+l5KOQ*|5%yL zILn}r>IMA7qN0Y=8b9aFM&tJsZqWIhMxn&KhxI4`!1|M!Fo0wq-egtv-YAzIJqMB! z!yXTvR2{2R@AEsa^?JU8120r?(tGmFWG*za*xp~xbci}}hzew@h?$wY0Q0RhKDA8C ze@wu4vx6qvP^M#mP!x<;L+SS7JPNwDz)dOC-rV~U>sXVKpViuBEJx7P`-c^mk=drD z4UvNDG3s&Zj2YM6zjn3YI2N}me@il&W{KZ8a^%SUPiPP@8+-2C*MeuN>-H1{_VUj~ zTG0Oz9nBt?J{4qhI4U5s|$|eZOQ$(lQ(C;wV zs7P0?VjEJ~{QO$x&IVr7@p`DpJ1ytv7X(20FiV>`AH%`1c_(+F=mQF7+-#JJa~+bG zF9Y>7QFrK=YPyqt4rE{e-*^aZW6JB`Tl+#ob%>O2N1sS!38sditXb;Sd|Nj4C_5Uu z^(*^H@KG_6Vu!c-dK~u%xSlDz!g7<=U%L!D_}riR?Un3qW(cxXCC>=nWpQ4s;4dJg z(^<3XL<@v(0lBR`bn2u2W%u(CzP_!hV*OZsYGFpbiY0QuJ)0gU#oCp|f3z62+c` z&_rfGW*z9?lvD4-r$kM?+f|2X#{J)BB{P53&Dj)b>jl`Q^ukm=C%(;w%aH8CAK^t~ z3YubQc&fJV*|~cMtsThp(ygRLNlcFIvOZ?!L}auzYsN~)LuANZ(hzG8O|rZ9rEmOdM~J(v zkDlIUS)UCWUf8!9Ai>&zWCk)tcWduco3TuWa0Ut&j|2bY4tLE52up_1s*(@m!+|GB zJWdHRu#FDfo~$xv(oecEPIHL*xS(u_X0cuW>d+aDvR{wS&-WuxK?iYlg>S-H2v0J7 zHjlw0o<{dGj;y#&osJn@G5(n={#OtqqKlImMfIRn{dQrsGYF;es!>N#py^>k=7xrc zZv;72@w9KyJ3mv1D5g93jk(Q_(OS7;_)~NZU+GV@-RiFqIuPbG1%8R}8(+Gr$o?&d zs1HUS19YwylAmB^TTfMywf66m3x*)du9!!HP6kIj#0DtGo%ki^Yb%Q63sIA3kVWcq zx1of{tZJ5DJZS%RBXKk#%(c4Mqx_|J8wuu+oH6X#lK93EBfgyOsgkb*+@b&A=Un$d zqR^=wROSBRJWser-cdv7abaNu#Q6E$oh*j zN}fZj2?6e}W?KWF*6640GIn_c(m%CfwtU(lmq(kVYFjVU$j`Kd z1fV=<3sHzk3jWYXLVqb3k=#oVvdRg-aIF+c5Rk=Y$&bDRC zmiw)mw5x79dUW0Y7KwxijCRu-k72^lX?uhm{R#@Ft(MVN)`M`O6Q3=+-uaq#fT}Z{WKfgD!%aTEk z1Mj;jk==PYm;`K=Y5)1yW&cP30c~u;wYI;um3aU8K4FXR{9IISd0QncS^e^M8Je-T z{hx2T{q{r_?Sod;8V>n-?ayzq>ih4SxK$B_%Kya|`M=MG`v37S*H1?nK`>ibNq6;j zR=|!Dxg|U3e|)DftJ#tLl_3M|_?O*s+?z?8HgY1*~8Rkfh4@ zRrmWp{`jcFsVZR^Ob-i57%IuEyrjq>scIV|`&WP4^4_qg?QHteqSjDo<&QXKJ|L!$ z<)GD&6uzn@SI5@IraIZ$Fg@w}hy7X4MW+6$QG0;kiEqhn(#$noTeTJ6G$&@o;~82TpxY}GI-5Ows~%zJDP$x+nv&vzf!bZ$$_ zF`{()Yi3pwB~Sol*O=Z$MpkjIvb8UNFEYrzxNPi<1m+hpzGjQ@{D12>+kPiLloMbo zu^-0oIdvtqPT`}AO$@1wm1w&B`P`^`GjnHBYjEZfTw0^`wqv>Vx8L4$qU@t&sKIJs z1yyDQPn=e^>m2+grKaC}&Y>2l;~4qpiN`m$M_NisyFr86D5WJ&`zxN5EO?bVl#C_G zQG2?uB=kY_Ml?8G-G4#ukwv0#P(@Y*k^;l;T<{!!(PnyOa6E ze=+JpQtRjX8Q!B4?Y|^Ry6h0jf1!VHp3u0utmVZ(LMj8loQ z5-wAu2b9`gX?X;y?wy#!e4QSopF@e&Vf*6TPUGJ10a^(}7i0DHkWH(yU2RM&7aJ^e zn3%AnGvNIO9B?)1gruEdf5kWbrc7lLHOxoAWYv71a>`+etD-@^d0=RAvDVw$G*^p2 zi^9Ugr@^8debi?SNQDJezQa8k}xvxQMZRZ6&5rMm~_sx-r>f zY}F|;V$Q~m8!@hruQ=4NxnB2F?*8gXUVDupW(vim*0W7vpAF6o{Bs^eW<2Yn(rRk$aa5Uo(icCkOLuo{}QxTT`^ z<}QjDF@f$jp5I)$aBNme5_FYF5X3ZZaXjo^1E?2Kv(U<@S!O$bM|>hX2SKVS`iDPm zYB5TX@95QI{K%DKqclA-wt1QqjDHp@qcMJzWg3d1y~oNgE+qyYfCny*POp11^H=51 z54`1X<>j3lpXoyHCJAv6VyNMLfF&|V{~}GDs&&_sUz5p|rI3_TEVv^rnS}F^sD79H z2SxWazt`@nZag`$;m5_t4@L-0w@7qC8U?m_Hkp5>01f23?1($a zs~L*Zn%%5(4|$3&g=G@p3jBwJGJurCx4Tgt!$d6zAz4%S0c0YR9IeF8gwwcQ!!PsV z?OTbFmV6>C>_SbCD)aht{pe#J`&JEH#FfXuFa_f)kV%pO!14I(^6H8Iyj(q=F+Rdc z8=a)WS3C(+S#9$SyqFS+>#xBNlE|o2B3wOpKthH6UBS7b$iYuTM7?K*^O>_r4CZW4FQCqRc5X?-8s+hf!+-97tsl19>92#ItS`JD9J!69SeP+DV#3f1fL-~r zI2gY+`I0Ya=T)kGe$`O9-)q+{#f}IH2Pj^LvE|$CM+?ZsqL;3mwLnkn_L1)-6A)QG zB4+^-6X1*KT=;6Tt+7uOZMM}T0vl5Yb$ zae6!5t1@_S3)EDkMxtzZba9y>i6!w%0DKxwJdf-#ce{pI*P#qgyZmFsl6L}zkO!{3 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

61( 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�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 list[str]: + """Greedy chat-formatted batched generation; returns the decoded completions.""" + import torch + + outs: list[str] = [] + for i in range(0, len(prompts), batch_size): + chunk = prompts[i:i + batch_size] + msgs = [[{"role": "user", "content": p}] for p in chunk] + enc = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt", + return_dict=True, padding=True).to(device) + with torch.no_grad(): + gen = model.generate(**enc, max_new_tokens=max_new_tokens, do_sample=False, + pad_token_id=tok.pad_token_id) + for j in range(len(chunk)): + outs.append(tok.decode(gen[j, enc["input_ids"].shape[1]:], + skip_special_tokens=True).strip()) + return outs + + +def evaluate(model, tok, tasks: list[Task], **gen_kw) -> dict: + """Per-family and overall exact-match accuracy over ``tasks``.""" + outs = generate(model, tok, [t.prompt for t in tasks], **gen_kw) + correct = np.array([verify(o, t) for o, t in zip(outs, tasks)]) + fam = np.array([t.family for t in tasks]) + row = {"overall": float(correct.mean())} + for f in FAMILIES: + mask = fam == f + row[f] = float(correct[mask].mean()) if mask.any() else float("nan") + return row diff --git a/src/llm/experiment.py b/src/llm/experiment.py new file mode 100644 index 0000000..a39114d --- /dev/null +++ b/src/llm/experiment.py @@ -0,0 +1,109 @@ +"""The LLM merge experiment (blueprint C2/C4) — recombining specialist LLMs. + +Trains one LoRA specialist per task family on a small open-weight base, then evaluates the base, +each specialist, and their weight-space **merges** (soup vs ties) on a held-out mixed test set. +Produces a tidy long-form results frame and the standard artifact triple (via +``knowledge.experiment.save_artifacts``), recording model/adapter provenance in the manifest. + +The claim under test (the real-LLM image of E8): a model recombined from decorrelated specialists is +better than any single specialist overall, and — the sharper signature — competent across *all* +families, which no single parent is (worst-family accuracy). ``python -m llm.experiment +configs/llm/merge.yaml``. +""" + +from __future__ import annotations + +import argparse +from pathlib import Path + +import numpy as np +import pandas as pd +import yaml + +from knowledge.experiment import save_artifacts + +from .evaluate import evaluate, generate, load_model +from .merge import load_specialists, make_merge +from .specialise import train_specialist +from .tasks import FAMILIES, make_tasks, verify + + +def _rows(experiment: str, model: str, kind: str, acc: dict) -> list[dict]: + worst = min(acc[f] for f in FAMILIES) + out = [{"experiment": experiment, "model": model, "kind": kind, "metric": k, "accuracy": v} + for k, v in acc.items()] + out.append({"experiment": experiment, "model": model, "kind": kind, + "metric": "worst_family", "accuracy": worst}) + return out + + +def run_merge_experiment(cfg: dict) -> pd.DataFrame: + """Train specialists, evaluate base/specialists/merges, return long-form accuracies.""" + import torch + + name = cfg["experiment"] + base = cfg["base_model"] + fams = cfg.get("families", list(FAMILIES)) + n_train, n_test = int(cfg.get("n_train", 700)), int(cfg.get("n_test", 100)) + epochs = int(cfg.get("epochs", 3)) + lora = cfg.get("lora", {}) + merges = cfg.get("merges", ["soup", "ties"]) + seed = int(cfg["seed"]) + adapters_root = Path(cfg.get("adapters_dir", "models/llm")) + + test = sum([make_tasks(f, n_test, seed=1000 + i) for i, f in enumerate(fams)], []) + rows: list[dict] = [] + + # base + m, tok = load_model(base) + rows += _rows(name, "base", "base", evaluate(m, tok, test)) + del m; torch.cuda.empty_cache() + + # one specialist per family + dirs = [] + for i, f in enumerate(fams): + d = str(adapters_root / f"spec_{f}") + train_specialist(base, f, d, n_train=n_train, epochs=epochs, seed=seed + i, + r=int(lora.get("r", 16)), alpha=int(lora.get("alpha", 32))) + dirs.append(d) + m, tok = load_model(base, adapter_dir=d) + rows += _rows(name, f"spec_{f}", "specialist", evaluate(m, tok, test)) + del m; torch.cuda.empty_cache() + + # weight-space merges (deployable single models) + model, tok = load_specialists(base, dirs) + prompts = [t.prompt for t in test] + fam = np.array([t.family for t in test]) + for method in merges: + make_merge(model, len(dirs), method, method) + outs = generate(model, tok, prompts) + corr = np.array([verify(o, t) for o, t in zip(outs, test)]) + acc = {"overall": float(corr.mean())} + acc.update({f: float(corr[fam == f].mean()) for f in fams}) + rows += _rows(name, f"merge_{method}", "merge", acc) + + return pd.DataFrame(rows) + + +def run_and_save(config_path: str | Path) -> Path: + """Load an LLM experiment YAML, run it, and write the artifact triple.""" + config_path = Path(config_path) + cfg = yaml.safe_load(config_path.read_text()) + out_dir = Path(cfg.get("output", {}).get("dir", f"results/{cfg['experiment']}")) + cfg.setdefault("n_replicates", 1) + df = run_merge_experiment(cfg) + save_artifacts(cfg, df, out_dir, extra_libs=("torch", "transformers", "peft"), + extra_manifest={"layer": "2", "tier": "llm", "base_model": cfg["base_model"]}, + grid=None) + return out_dir + + +def main(argv: list[str] | None = None) -> None: + ap = argparse.ArgumentParser(description="Run an LLM merge experiment from a YAML config.") + ap.add_argument("config") + args = ap.parse_args(argv) + print(f"wrote artifacts to {run_and_save(args.config)}/") + + +if __name__ == "__main__": + main() diff --git a/src/llm/merge.py b/src/llm/merge.py new file mode 100644 index 0000000..b92855c --- /dev/null +++ b/src/llm/merge.py @@ -0,0 +1,55 @@ +"""Combine specialist LoRA adapters into one deployable model — the recombination operator. + +The point of the prototype: several *specialist* parents (each a LoRA adapter) are combined into a +single child model, and *how* you combine them decides whether the child inherits every specialty or +a diluted average. Two deployable weight-space combinations, mirroring Layer 1's "merge, don't +average": + +* **soup** — the averaging baseline (model soups): the child is ``base + mean_k(Δ_k)``. Each + specialist's contribution is diluted by ``1/K`` — the conservation law that cancels the benefit. +* **merge** — union-preserving: ``ties`` (sign-reconciled, magnitude-pruned task arithmetic) or plain + ``task_arith`` (``base + Σ_k Δ_k``), which keeps each specialist's contribution rather than + averaging it away. + +Both produce a single model you can ship; the comparison is against that same single-model bar (the +best individual specialist). +""" + +from __future__ import annotations + + +def load_specialists(base_name: str, adapter_dirs: list[str], device: str = "cuda"): + """Load the base model with every specialist adapter attached (named ``a0..a{K-1}``).""" + import torch + from peft import PeftModel + from transformers import AutoModelForCausalLM, AutoTokenizer + + tok = AutoTokenizer.from_pretrained(base_name) + if tok.pad_token_id is None: + tok.pad_token = tok.eos_token + tok.padding_side = "left" + base = AutoModelForCausalLM.from_pretrained(base_name, dtype=torch.bfloat16).to(device) + model = PeftModel.from_pretrained(base, adapter_dirs[0], adapter_name="a0") + for i, d in enumerate(adapter_dirs[1:], 1): + model.load_adapter(d, adapter_name=f"a{i}") + model.eval() + return model, tok + + +def make_merge(model, k: int, method: str, name: str): + """Add a combined adapter ``name`` over ``a0..a{k-1}`` and make it active. Returns the model. + + method ∈ {``soup`` (linear, 1/K weights), ``task_arith`` (linear, unit weights), + ``ties`` (sign-reconciled, pruned)}. + """ + adapters = [f"a{i}" for i in range(k)] + if method == "soup": + model.add_weighted_adapter(adapters, [1.0 / k] * k, name, combination_type="linear") + elif method == "task_arith": + model.add_weighted_adapter(adapters, [1.0] * k, name, combination_type="linear") + elif method == "ties": + model.add_weighted_adapter(adapters, [1.0] * k, name, combination_type="ties", density=0.5) + else: + raise ValueError(f"unknown merge method {method!r} (expected soup|task_arith|ties)") + model.set_adapter(name) + return model diff --git a/src/llm/specialise.py b/src/llm/specialise.py new file mode 100644 index 0000000..89625fa --- /dev/null +++ b/src/llm/specialise.py @@ -0,0 +1,76 @@ +"""LoRA specialisation — train one adapter ("specialist parent") on one task family. + +A LoRA adapter is a small trainable patch on a frozen base model. Training one on a single family +gives a *specialist*: better on its family, ~unchanged on the others (the decorrelated parent that +recombination will later combine). Deliberately minimal: a manual supervised-fine-tuning loop with +answer-only loss (the prompt tokens are masked), so it runs in minutes on a 16 GB GPU and has no +dependence on the churning high-level trainer APIs. +""" + +from __future__ import annotations + +from pathlib import Path + +import numpy as np + +from .tasks import make_tasks + + +def _encode(tok, task, device): + """Return (input_ids, labels) for one example with the prompt tokens masked out of the loss.""" + text = tok.apply_chat_template([{"role": "user", "content": task.prompt}], + add_generation_prompt=True, tokenize=False) + prompt_ids = tok(text, add_special_tokens=False).input_ids + answer_ids = tok(task.answer + tok.eos_token, add_special_tokens=False).input_ids + ids = prompt_ids + answer_ids + labels = [-100] * len(prompt_ids) + answer_ids + return ids, labels + + +def train_specialist(base_name: str, family: str, out_dir: str, *, n_train: int = 600, + epochs: int = 3, lr: float = 2e-4, batch_size: int = 8, r: int = 16, + alpha: int = 32, seed: int = 0, device: str = "cuda") -> str: + """Fine-tune a LoRA specialist on ``family`` and save the adapter to ``out_dir``. + + Returns the adapter directory path. + """ + import torch + from peft import LoraConfig, get_peft_model + from transformers import AutoModelForCausalLM, AutoTokenizer + + tok = AutoTokenizer.from_pretrained(base_name) + if tok.pad_token_id is None: + tok.pad_token = tok.eos_token + model = AutoModelForCausalLM.from_pretrained(base_name, dtype=torch.bfloat16).to(device) + lora = LoraConfig(r=r, lora_alpha=alpha, lora_dropout=0.0, bias="none", + task_type="CAUSAL_LM", + target_modules=["q_proj", "k_proj", "v_proj", "o_proj", + "gate_proj", "up_proj", "down_proj"]) + model = get_peft_model(model, lora) + model.train() + + tasks = make_tasks(family, n_train, seed=seed) + encoded = [_encode(tok, t, device) for t in tasks] + opt = torch.optim.AdamW([p for p in model.parameters() if p.requires_grad], lr=lr) + rng = np.random.default_rng(seed) + pad = tok.pad_token_id + + for _ in range(epochs): + order = rng.permutation(len(encoded)) + for i in range(0, len(order), batch_size): + batch = [encoded[j] for j in order[i:i + batch_size]] + L = max(len(ids) for ids, _ in batch) + input_ids = torch.full((len(batch), L), pad, dtype=torch.long) + labels = torch.full((len(batch), L), -100, dtype=torch.long) + attn = torch.zeros((len(batch), L), dtype=torch.long) + for b, (ids, lab) in enumerate(batch): # right-pad for training + input_ids[b, :len(ids)] = torch.tensor(ids) + labels[b, :len(lab)] = torch.tensor(lab) + attn[b, :len(ids)] = 1 + out = model(input_ids=input_ids.to(device), attention_mask=attn.to(device), + labels=labels.to(device)) + opt.zero_grad(); out.loss.backward(); opt.step() + + Path(out_dir).mkdir(parents=True, exist_ok=True) + model.save_pretrained(out_dir) + return out_dir diff --git a/src/llm/tasks.py b/src/llm/tasks.py new file mode 100644 index 0000000..2294ac6 --- /dev/null +++ b/src/llm/tasks.py @@ -0,0 +1,142 @@ +"""Procedural task families with an exact-match verifier — the LLM prototype's "reality". + +Three *disjoint* skill families so that a LoRA specialist trained on one is genuinely +decorrelated from the others (the precondition for recombination to have anything to combine): + +* ``lists`` — operations on a short list of small integers (sort, reverse, sum, max, unique…); +* ``strings`` — operations on a short lowercase word (reverse, uppercase, count a char, drop vowels…); +* ``arith`` — small-integer arithmetic and sequences (a+b, a*b, next-in-sequence…). + +Each task is a natural-language instruction + input with a single canonical answer; the verifier +normalises the model's output and checks exact equality. This is the LLM analogue of the synthetic +sandbox's exact oracle — correctness is the "reality that can say no" (grounding / fitness). +""" + +from __future__ import annotations + +import re +from dataclasses import dataclass + +import numpy as np + +FAMILIES = ("lists", "strings", "arith") +_WORDS = ("apple", "table", "river", "cloud", "stone", "plant", "music", "green", "light", "brave", + "ocean", "tiger", "happy", "quiet", "smart", "brick", "chair", "dance", "eagle", "flame") + + +@dataclass(frozen=True) +class Task: + """One verifiable task: a prompt, its canonical answer, and its family.""" + + family: str + prompt: str + answer: str + + +def _fmt_list(xs) -> str: + return "[" + ", ".join(str(int(x)) for x in xs) + "]" + + +def _list_task(rng) -> Task: + n = int(rng.integers(6, 9)) # longer lists (harder) + xs = rng.integers(0, 20, size=n).tolist() + op = rng.choice(["sort ascending", "sort descending", "reverse", + "second largest value", "sum of the two largest values", + "sorted then reversed", "unique values preserving order"]) + if op == "sort ascending": + ans = _fmt_list(sorted(xs)) + elif op == "sort descending": + ans = _fmt_list(sorted(xs, reverse=True)) + elif op == "reverse": + ans = _fmt_list(list(reversed(xs))) + elif op == "second largest value": + ans = str(sorted(xs, reverse=True)[1]) + elif op == "sum of the two largest values": + ans = str(sum(sorted(xs, reverse=True)[:2])) + elif op == "sorted then reversed": + ans = _fmt_list(sorted(xs, reverse=True)) + else: + seen, out = set(), [] + for x in xs: + if x not in seen: + seen.add(x); out.append(x) + ans = _fmt_list(out) + want = "the resulting list" if ans.startswith("[") else "the single number" + return Task("lists", f"Given the list {_fmt_list(xs)}, compute its {op}. " + f"Output only {want} and nothing else.", ans) + + +def _string_task(rng) -> Task: + w = str(rng.choice(_WORDS)) + op = rng.choice(["reverse", "uppercase", "count of the letter 'a'", "count of vowels", + "remove all vowels", "first three characters", "last three characters"]) + if op == "reverse": + ans = w[::-1] + elif op == "uppercase": + ans = w.upper() + elif op == "count of the letter 'a'": + ans = str(w.count("a")) + elif op == "count of vowels": + ans = str(sum(c in "aeiou" for c in w)) + elif op == "remove all vowels": + ans = "".join(c for c in w if c not in "aeiou") + elif op == "first three characters": + ans = w[:3] + else: + ans = w[-3:] + return Task("strings", f"Given the word \"{w}\", compute its {op}. " + f"Output only the answer and nothing else.", ans) + + +def _arith_task(rng) -> Task: + kind = rng.choice(["mul", "sub", "mul2", "seq"]) # multiplication-heavy (harder) + if kind == "mul": + a, b = rng.integers(11, 40, size=2).tolist(); ans = str(a * b) + q = f"What is {a} * {b}?" + elif kind == "sub": + a, b = sorted(rng.integers(100, 1000, size=2).tolist(), reverse=True); ans = str(a - b) + q = f"What is {a} - {b}?" + elif kind == "mul2": + a = int(rng.integers(11, 100)); b = int(rng.integers(3, 10)); ans = str(a * b) + q = f"What is {a} * {b}?" + else: + start = int(rng.integers(2, 12)); step = int(rng.integers(3, 12)) + seq = [start + i * step for i in range(4)]; ans = str(seq[-1] + step) + q = f"What comes next in the sequence {', '.join(map(str, seq))}?" + return Task("arith", q + " Output only the number and nothing else.", ans) + + +_GEN = {"lists": _list_task, "strings": _string_task, "arith": _arith_task} + + +def make_tasks(family: str, n: int, seed: int) -> list[Task]: + """Generate ``n`` unique-ish tasks for a family (deterministic in ``seed``).""" + rng = np.random.default_rng(seed) + return [_GEN[family](rng) for _ in range(n)] + + +def _normalise(s: str) -> str: + """Canonicalise an answer or a model output for exact comparison.""" + s = s.strip() + m_list = re.findall(r"\[[^\[\]]*\]", s) # prefer the last bracketed list + if m_list: + nums = re.findall(r"-?\d+", m_list[-1]) + return "[" + ", ".join(nums) + "]" + m_num = re.findall(r"-?\d+", s) # else the last integer + if m_num and re.fullmatch(r"[^A-Za-z]*-?\d[\d\s,.\-]*", s): + return m_num[-1] + # else a word answer: last alphabetic token, lowercased + toks = re.findall(r"[A-Za-z]+", s) + return toks[-1].lower() if toks else s.lower() + + +def verify(output: str, task: Task) -> bool: + """True iff the model output matches the task's canonical answer after normalisation.""" + want = _normalise(task.answer) + got = _normalise(output) + if got == want: + return True + # numeric answers: also accept a bare-int match anywhere in the output + if re.fullmatch(r"-?\d+", want): + return want in re.findall(r"-?\d+", output) + return False diff --git a/tasks/todo.md b/tasks/todo.md index d99526f..204bdc4 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -332,3 +332,15 @@ C3 vertical claim deferred.* ## Potential agents *(none proposed yet)* + +**2026-07-05 — LLM prototype (`llm_merge`): first real-LLM step, honest/partial.** + +- `src/llm/` package: tasks+exact-match verifier, batched eval, LoRA specialise (manual SFT), peft + weight-merge (soup/ties), runner (`kind: llm_merge`). Base Qwen2.5-0.5B-Instruct on one 16GB GPU. +- **Result (seed 1):** merges are the ONLY models competent across all 3 disjoint families + (worst-family ~0.25 vs <0.16 for any single specialist) — the Fisher-Muller signature, robust. + Overall-exceeds is marginal (soup 0.64 vs best spec 0.63; ties below), and averaging dilutes peaks + (lists 0.43->0.26 = "merge don't average" in real weights). Pipeline works end-to-end; strict + overall-exceeds needs scale (bigger base/more families/seeds/dilution-resistant merge) = HPC step. +- Python 3.14 + transformers 5.13 OK; note transformers-5.x apply_chat_template returns a dict. + `make env-llm`/`make llm`; `figures/plot_llm_merge.py`, README, `tests/test_llm.py` (+3, 125 green). diff --git a/tests/test_llm.py b/tests/test_llm.py new file mode 100644 index 0000000..f6443a6 --- /dev/null +++ b/tests/test_llm.py @@ -0,0 +1,39 @@ +"""LLM-prototype tests — the pure, always-runnable parts (task generation + verifier). + +The model/LoRA/merge path is heavy (downloads a base model, trains on a GPU) and is validated by the +experiment run itself, not in CI. What *is* unit-testable — and worth locking, since it is the +prototype's "reality that says no" — is that tasks are well-formed and the exact-match verifier +accepts correct answers (including verbose model phrasings) and rejects wrong ones. +""" + +from __future__ import annotations + +from llm.tasks import FAMILIES, make_tasks, verify + + +def test_make_tasks_wellformed_and_deterministic(): + for fam in FAMILIES: + tasks = make_tasks(fam, 20, seed=0) + assert len(tasks) == 20 and all(t.family == fam for t in tasks) + assert all(t.prompt and t.answer for t in tasks) + a = make_tasks("arith", 10, seed=3) + b = make_tasks("arith", 10, seed=3) + assert [t.answer for t in a] == [t.answer for t in b] # deterministic in the seed + + +def test_verifier_accepts_correct_including_verbose(): + tasks = make_tasks("lists", 40, seed=1) + make_tasks("arith", 40, seed=2) + assert all(verify(t.answer, t) for t in tasks) # the canonical answer verifies + # a verbose but correct model phrasing still verifies (the verifier extracts the answer) + num_task = next(t for t in tasks if t.family == "arith") + assert verify(f"The answer is {num_task.answer}.", num_task) + list_task = next(t for t in tasks if t.family == "lists" and t.answer.startswith("[")) + assert verify(f"Here you go: {list_task.answer}", list_task) + + +def test_verifier_rejects_wrong(): + t = make_tasks("arith", 1, seed=5)[0] + wrong = str(int(t.answer) + 1) if t.answer.lstrip("-").isdigit() else "zzz" + assert not verify(wrong, t) + lt = next(x for x in make_tasks("lists", 30, seed=6) if x.answer.startswith("[")) + assert not verify("[9, 9, 9]", lt) or lt.answer == "[9, 9, 9]"