decision-2.0-eos-coreml / conversion /parity_chunked_torch.py
alexwengg's picture
Decision-2.0-Eos-0.8B Core ML: shared prefix + chunked packed questions, fp16 package, runtime, parity reports
7bf8323 verified
Raw History Blame Contribute Delete
1.47 kB
import sys, torch
from transformers import AutoModel, AutoTokenizer
from cases import CASES
import pack, q64ctx
from eos_graph import load_chunked, eos_inputs, with_slots, chunk_inputs
S, P = int(sys.argv[1]), int(sys.argv[2])
ref = AutoModel.from_pretrained("eos", trust_remote_code=True, device="mps")
tok = AutoTokenizer.from_pretrained("eos"); pad = tok.pad_token_id if tok.pad_token_id is not None else tok.eos_token_id
g = load_chunked("eos", S, P); worst = 0
cases = CASES + [(q64ctx.state, dict(list(q64ctx.Q.items())[:9]))]
for state, qs in cases:
r = ref.system_one(state=state, questions=qs)["answers"]
jobs = pack.rows(tok, state, qs)
x, cand, qry, owner, used = eos_inputs(g.cfg, [e for _, _, e in jobs], S, P, pad)
x = with_slots(x, cand, qry, 64)
x["seg_chunks"], x["cont"], x["last_seg"] = chunk_inputs(x["segment"])
names = ("input_ids", "cos", "sin", "valid", "tail_onehot", "segment", "lag_keep", "lag_tail", "seg_chunks", "cont", "last_seg", "cand_idx", "query_idx")
with torch.no_grad():
lg = g(*[torch.from_numpy(x[k]) for k in names])
a = pack.answers(jobs, lg.tolist(), owner, None)
d = 0
for q in qs:
pr = r[q].get("probabilities", {"true": r[q].get("noul")}); pa = a[q].get("probabilities", {"true": a[q].get("noul")})
d = max(d, max(abs(pr[k] - pa[k]) for k in pr))
worst = max(worst, d); print(f"{len(qs)} questions, packed {used}, max dp {d:.2e}")
print("WORST", worst)