accept.py 1.5 KB

123456789101112131415161718192021222324252627
  1. #!/usr/bin/env python3
  2. """Join head-log 'Decode batch' lines to benchmark phase windows (UTC).
  3. step_ms = 1000 * accept_len * running_req / gen_throughput, per logged interval."""
  4. import json, re, statistics, subprocess, sys
  5. from datetime import datetime
  6. summ = json.load(open(sys.argv[1]))
  7. ctn = sys.argv[2] if len(sys.argv) > 2 else "dsv41-head"
  8. log = subprocess.run(["docker", "logs", "--since", "3h", ctn], capture_output=True, text=True)
  9. lines = (log.stdout + log.stderr).splitlines()
  10. pat = re.compile(r"^\[(\S+ \S+) TP0.*Decode batch, #running-req: (\d+).*accept len: ([\d.]+).*gen throughput \(token/s\): ([\d.]+)")
  11. recs = []
  12. for ln in lines:
  13. m = pat.search(ln)
  14. if m:
  15. recs.append((datetime.strptime(m.group(1), "%Y-%m-%d %H:%M:%S"), int(m.group(2)), float(m.group(3)), float(m.group(4))))
  16. out = {}
  17. for name, ph in summ["phases"].items():
  18. a = datetime.strptime(ph["start"][:19], "%Y-%m-%dT%H:%M:%S"); b = datetime.strptime(ph["end"][:19], "%Y-%m-%dT%H:%M:%S")
  19. sel = [r for r in recs if a <= r[0] <= b and r[3] > 1.0]
  20. if not sel:
  21. print(f"{name:16s} no decode log lines"); continue
  22. acc = statistics.median(r[2] for r in sel)
  23. step = statistics.median(1000 * r[2] * r[1] / r[3] for r in sel)
  24. print(f"{name:16s} accept_len {acc:.2f} step {step:.1f} ms (n={len(sel)} intervals, bs={statistics.median(r[1] for r in sel)})")
  25. out[name] = {"accept_len": acc, "step_ms": step, "n": len(sel)}
  26. json.dump(out, open(sys.argv[1].replace(".summary.json", ".accept.json"), "w"), indent=1)