nll.py 1.9 KB

12345678910111213141516171819202122232425262728293031
  1. # Mean NLL per token of fixed texts under the served model (prompt logprobs).
  2. # usage: nll.py record OUT.json | nll.py compare [REF.json]
  3. # nll-ref.json was recorded with the dense linears in bf16 (fp8.yaml left out).
  4. import json, math, os, sys, urllib.request
  5. BASE = os.environ.get("GATE_URL", "http://127.0.0.1:8002")
  6. MODEL = os.environ.get("GATE_MODEL", "glm53")
  7. D = os.path.join(os.path.dirname(os.path.abspath(__file__)), "texts") + "/"
  8. TEXTS = {"notes": open(D + "notes.md").read()[:14000],
  9. "arx.cu": open(D + "arx.cu").read()[:14000], "snap.py": open(D + "snap.py").read()[:14000]}
  10. def nll(text):
  11. body = json.dumps({"model": MODEL, "prompt": text, "max_tokens": 1, "temperature": 0,
  12. "prompt_logprobs": 0, "cache_salt": os.urandom(8).hex()}).encode()
  13. r = json.loads(urllib.request.urlopen(urllib.request.Request(BASE + "/v1/completions", data=body,
  14. headers={"Content-Type": "application/json"}), timeout=600).read())
  15. lps = []
  16. for entry in r["choices"][0]["prompt_logprobs"][1:]:
  17. if entry:
  18. lps.append(max(v["logprob"] for v in entry.values()) if len(entry) == 1 else
  19. next(v["logprob"] for v in entry.values() if v.get("rank") is not None and v["rank"] >= 1))
  20. return lps
  21. res = {k: nll(t) for k, t in TEXTS.items()}
  22. if sys.argv[1] == "record":
  23. json.dump(res, open(sys.argv[2], "w"))
  24. for k, v in res.items(): print(f"{k:10} tokens {len(v):5d} mean NLL {-sum(v)/len(v):.4f}")
  25. else:
  26. ref = json.load(open(sys.argv[2] if len(sys.argv) > 2 else os.path.join(os.path.dirname(os.path.abspath(__file__)), "nll-ref.json")))
  27. for k, v in res.items():
  28. r = ref[k]; n = min(len(r), len(v))
  29. d = [abs(a - b) for a, b in zip(v[:n], r[:n])]
  30. print(f"{k:10} tokens {n:5d} mean NLL {-sum(v)/len(v):.4f} (ref {-sum(r)/len(r):.4f}, "
  31. f"delta {(-sum(v)/len(v)) - (-sum(r)/len(r)):+.4f}) mean |dlogprob| {sum(d)/n:.4f} max {max(d):.3f}")