min-spark / record_deltas.py
Eclipse-Senpai's picture
scrub internal project references from record_deltas.py
db0e600 verified
Raw
History Blame Contribute Delete
2.33 kB
"""Measure the stock lm-eval HFLM delta vs run_lmeval on a SHARED subset.
Paired measurement: both paths run at the same --limit N; the reported delta
is hflm_subset - run_lmeval_subset (the pure EOS-prefix methodology delta).
The full-N published value is recorded as reference only. This is what the
model card's lm-eval honesty note is written from — measured, not asserted.
"""
import argparse
import json
import subprocess
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
PY = sys.executable
def run_lmeval(tasks: list[str], limit: int) -> dict:
out = subprocess.run(
[str(PY), str(HERE / "run_lmeval.py"), "--effort", "medium",
"--tasks", ",".join(tasks), "--json", "--limit", str(limit)],
capture_output=True, text=True, cwd=str(HERE), timeout=3600,
)
if out.returncode != 0:
raise RuntimeError(out.stderr[-2000:])
return json.loads(out.stdout)
def run_hflm(tasks: list[str], limit: int) -> dict:
from lm_eval import simple_evaluate
out = simple_evaluate(
model="hf",
model_args=f"pretrained={HERE},trust_remote_code=True,dtype=float32,device=cpu",
tasks=tasks,
limit=limit,
)
return out["results"]
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--tasks", default="arc_easy,wikitext")
ap.add_argument("--limit", type=int, default=200)
args = ap.parse_args()
tasks = args.tasks.split(",")
repro = run_lmeval(tasks, args.limit)
hflm = run_hflm(tasks, args.limit)
deltas = {}
for task in tasks:
if task not in repro or task not in hflm:
continue
# Same metric key family per task (acc_norm for acc tasks, byte_ppl for wikitext)
keys = [k for k in hflm[task] if k.endswith(("acc_norm,none", "acc,none", "byte_perplexity,none"))]
if not keys:
continue
key = keys[0]
deltas[task] = {
"metric": key,
"hflm_subset": hflm[task][key],
"repro_subset": repro[task][key],
"delta": hflm[task][key] - repro[task][key], # the methodology delta
"limit": args.limit,
}
(HERE / "deltas.json").write_text(json.dumps(deltas, indent=2))
print(json.dumps(deltas, indent=2))
if __name__ == "__main__":
main()