Reza2kn commited on
Commit
cb074c8
·
verified ·
1 Parent(s): 6f683f1

Add training-kit/monitor_ppocr_eval.py

Browse files
Files changed (1) hide show
  1. training-kit/monitor_ppocr_eval.py +64 -0
training-kit/monitor_ppocr_eval.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Stop PP-OCR training when held-out normalized edit similarity stalls or diverges."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import os
8
+ import re
9
+ import signal
10
+ import time
11
+ from pathlib import Path
12
+
13
+
14
+ PATTERN = re.compile(r"cur metric,.*norm_edit_dis: ([0-9.eE+-]+)")
15
+
16
+
17
+ def main() -> None:
18
+ parser = argparse.ArgumentParser()
19
+ parser.add_argument("--log", type=Path, required=True)
20
+ parser.add_argument("--pid-file", type=Path, required=True)
21
+ parser.add_argument("--min-evals", type=int, default=5)
22
+ parser.add_argument("--patience", type=int, default=5)
23
+ parser.add_argument("--min-delta", type=float, default=0.002)
24
+ parser.add_argument("--divergence-delta", type=float, default=0.03)
25
+ parser.add_argument("--divergence-patience", type=int, default=2)
26
+ parser.add_argument("--initial-best", type=float, default=-1.0)
27
+ args = parser.parse_args()
28
+
29
+ best = args.initial_best
30
+ stale = diverged = seen = 0
31
+ while True:
32
+ if not args.pid_file.exists():
33
+ time.sleep(2)
34
+ continue
35
+ pid = int(args.pid_file.read_text())
36
+ try:
37
+ os.kill(pid, 0)
38
+ except ProcessLookupError:
39
+ return
40
+
41
+ scores = [float(value) for value in PATTERN.findall(args.log.read_text(errors="ignore"))]
42
+ for score in scores[seen:]:
43
+ seen += 1
44
+ if score > best + args.min_delta:
45
+ best, stale = score, 0
46
+ else:
47
+ stale += 1
48
+ diverged = diverged + 1 if score < best - args.divergence_delta else 0
49
+ print(
50
+ f"eval={seen} score={score:.6f} best={best:.6f} "
51
+ f"stale={stale} diverged={diverged}",
52
+ flush=True,
53
+ )
54
+ if seen >= args.min_evals and (
55
+ stale >= args.patience or diverged >= args.divergence_patience
56
+ ):
57
+ os.kill(pid, signal.SIGTERM)
58
+ print("EARLY_STOP", flush=True)
59
+ return
60
+ time.sleep(3)
61
+
62
+
63
+ if __name__ == "__main__":
64
+ main()