Download code/bench/fewshot.py from nandukmelath/nirnay: direct link, hf CLI and curl.
- Browser
- Download file 2.92 kB
-
https://huggingface.co/nandukmelath/nirnay/resolve/main/code/bench/fewshot.py
- Command line
-
hf download hf://nandukmelath/nirnay/code/bench/fewshot.py
-
curl -L -o fewshot.py https://huggingface.co/nandukmelath/nirnay/resolve/main/code/bench/fewshot.py
2.92 kB
| """Few-shot adaptation without training: Nirnay.learn() with k labelled examples per label. | |
| Banking77 (77 intents, held out of Nirnay's training): examples come from the TRAIN split, the | |
| evaluation is the same 400 TEST cases as the benchmark suite. Also run on DAIR emotion. | |
| Reports accuracy and the wall time `learn()` took (encoding the examples included). | |
| python bench\\fewshot.py [model_dir] | |
| """ | |
| import json | |
| import os | |
| import random | |
| import sys | |
| import time | |
| from collections import defaultdict | |
| HERE = os.path.dirname(os.path.abspath(__file__)) | |
| ROOT = os.path.dirname(HERE) | |
| sys.path.insert(0, ROOT) | |
| import nirnay # noqa: E402 | |
| from datasets import load_dataset # noqa: E402 | |
| def run_task(m, suite, train_rows, label_of, ks=(0, 2, 4, 8, 16)): | |
| cases = [json.loads(l) for l in open(os.path.join(HERE, "data", "suites.jsonl"), encoding="utf-8")] | |
| cases = [c for c in cases if c["suite"] == suite] | |
| qid = next(iter(cases[0]["questions"])) | |
| q = cases[0]["questions"][qid] | |
| keys = list(q["criteria"].keys()) | |
| by_label = defaultdict(list) | |
| for r in train_rows: | |
| by_label[label_of(r)].append(r) | |
| out = {} | |
| rng = random.Random(13) | |
| for k in ks: | |
| m.memory.forget() | |
| t_learn = 0.0 | |
| info = {} | |
| if k: | |
| ex = [] | |
| for lab in keys: | |
| pool = by_label.get(lab, []) | |
| for r in rng.sample(pool, min(k, len(pool))): | |
| ex.append((r["state"], lab)) | |
| t = time.perf_counter() | |
| info = m.learn(qid, q, ex) | |
| t_learn = time.perf_counter() - t | |
| res = m.predict_batch([c["state"] for c in cases], {qid: q}) | |
| acc = sum(int(r["answers"][qid]["choice"] == keys[c["gold"]]) for r, c in zip(res, cases)) / len(cases) | |
| out[str(k)] = {"accuracy": round(acc, 4), "learn_seconds": round(t_learn, 2), **info} | |
| print(" %-20s k=%2d acc %.3f learn %.1fs %s" % (suite, k, acc, t_learn, info), flush=True) | |
| m.memory.forget() | |
| return out | |
| def main(): | |
| model_dir = sys.argv[1] if len(sys.argv) > 1 else os.path.join(ROOT, "models", "nirnay-v1") | |
| m = nirnay.load(model_dir) | |
| res = {"model": m.name} | |
| d = load_dataset("mteb/banking77", split="train") | |
| rows = [{"state": {"message": r["text"]}, "label": r["label_text"].replace("_", " ")} for r in d] | |
| res["banking77"] = run_task(m, "jev.banking77_full", rows, lambda r: r["label"]) | |
| names = ["sadness", "joy", "love", "anger", "fear", "surprise"] | |
| d = load_dataset("dair-ai/emotion", "split", split="train") | |
| rows = [{"state": {"text": r["text"]}, "label": names[int(r["label"])]} for r in d] | |
| res["emotion"] = run_task(m, "jev.emotion", rows, lambda r: r["label"]) | |
| out = os.environ.get("FEWSHOT_OUT", "fewshot.json") | |
| json.dump(res, open(os.path.join(HERE, "results", out), "w"), indent=2) | |
| print("wrote bench/results/" + out) | |
| if __name__ == "__main__": | |
| main() | |