-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbenchmark.py
More file actions
66 lines (51 loc) · 1.8 KB
/
benchmark.py
File metadata and controls
66 lines (51 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import argparse
import statistics
import subprocess
import sys
from pathlib import Path
from mlps_shared import affinity, sysinfo
from mlps_shared import results as rpt
def run_once(workload: Path, flags: list[str]) -> float:
result = subprocess.run(
[sys.executable, *flags, str(workload)],
capture_output=True,
text=True,
check=True,
)
return float(result.stdout.strip())
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("--runs", type=int, default=15, metavar="N")
parser.add_argument("--warmup", type=int, default=1, metavar="N")
return parser.parse_args()
def main() -> None:
args = parse_args()
workload_dir = Path(__file__).parent / "workloads"
workloads = [
workload_dir / "docstring_heavy.py",
workload_dir / "matrix_compute.py",
workload_dir / "ppo_atari.py",
]
print(sysinfo.report())
print(f"\nRuns : {args.runs}\n")
for path in workloads:
rpt.section(path.stem)
baseline: float | None = None
for flag in ("", "-O", "-OO"):
flag_args = [flag] if flag else []
for _ in range(args.warmup):
run_once(path, flag_args)
times = [run_once(path, flag_args) for _ in range(args.runs)]
med = statistics.median(times)
std = statistics.stdev(times) if len(times) >= 2 else float("nan")
if baseline is None:
baseline = med
note = ""
else:
note = f" ({baseline / med:.3f}x vs baseline)"
print(f" {flag or 'none':<6} median={med:.4f}s stdev={std:.4f}s{note}")
print()
if __name__ == "__main__":
affinity.pin_to_allocated_cpus()
affinity.set_localalloc()
main()