xref: /aosp_15_r20/external/pytorch/benchmarks/dynamo/combine_csv.py (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker# This script takes csvs produced by parse_logs.py and combines them
2*da0073e9SAndroid Build Coastguard Worker# into a single CSV file
3*da0073e9SAndroid Build Coastguard Worker
4*da0073e9SAndroid Build Coastguard Workerimport ast
5*da0073e9SAndroid Build Coastguard Workerimport csv
6*da0073e9SAndroid Build Coastguard Workerimport sys
7*da0073e9SAndroid Build Coastguard Workerfrom collections import defaultdict
8*da0073e9SAndroid Build Coastguard Worker
9*da0073e9SAndroid Build Coastguard Worker
10*da0073e9SAndroid Build Coastguard Workerassert len(sys.argv) == 3
11*da0073e9SAndroid Build Coastguard Worker
12*da0073e9SAndroid Build Coastguard WorkerRESULTS = defaultdict(dict)
13*da0073e9SAndroid Build Coastguard Worker
14*da0073e9SAndroid Build Coastguard Workerfor side, f in zip(["static", "dynamic"], sys.argv[1:]):
15*da0073e9SAndroid Build Coastguard Worker    with open(f) as f:
16*da0073e9SAndroid Build Coastguard Worker        reader = csv.DictReader(f)
17*da0073e9SAndroid Build Coastguard Worker        for row in reader:
18*da0073e9SAndroid Build Coastguard Worker            RESULTS[(row["bench"], row["name"])][side] = row
19*da0073e9SAndroid Build Coastguard Worker
20*da0073e9SAndroid Build Coastguard Workerfields = ["frame_time", "graph_breaks"]
21*da0073e9SAndroid Build Coastguard Worker
22*da0073e9SAndroid Build Coastguard Workerout = csv.DictWriter(
23*da0073e9SAndroid Build Coastguard Worker    sys.stdout,
24*da0073e9SAndroid Build Coastguard Worker    ["bench", "name"] + [f"delta_{n}" for n in fields] + ["static_url", "dynamic_url"],
25*da0073e9SAndroid Build Coastguard Worker    dialect="excel",
26*da0073e9SAndroid Build Coastguard Worker)
27*da0073e9SAndroid Build Coastguard Workerout.writeheader()
28*da0073e9SAndroid Build Coastguard Worker
29*da0073e9SAndroid Build Coastguard Workerfor (bench, name), sides in RESULTS.items():
30*da0073e9SAndroid Build Coastguard Worker    if "static" not in sides:
31*da0073e9SAndroid Build Coastguard Worker        continue
32*da0073e9SAndroid Build Coastguard Worker    if "dynamic" not in sides:
33*da0073e9SAndroid Build Coastguard Worker        continue
34*da0073e9SAndroid Build Coastguard Worker    if not name:
35*da0073e9SAndroid Build Coastguard Worker        out.writerow(
36*da0073e9SAndroid Build Coastguard Worker            {
37*da0073e9SAndroid Build Coastguard Worker                "static_url": sides["static"]["explain"],
38*da0073e9SAndroid Build Coastguard Worker                "dynamic_url": sides["dynamic"]["explain"],
39*da0073e9SAndroid Build Coastguard Worker            }
40*da0073e9SAndroid Build Coastguard Worker        )
41*da0073e9SAndroid Build Coastguard Worker        continue
42*da0073e9SAndroid Build Coastguard Worker    row = {"bench": bench, "name": name}
43*da0073e9SAndroid Build Coastguard Worker    for f in fields:
44*da0073e9SAndroid Build Coastguard Worker        try:
45*da0073e9SAndroid Build Coastguard Worker            static = ast.literal_eval(sides["static"][f])
46*da0073e9SAndroid Build Coastguard Worker            dynamic = ast.literal_eval(sides["dynamic"][f])
47*da0073e9SAndroid Build Coastguard Worker        except SyntaxError:
48*da0073e9SAndroid Build Coastguard Worker            continue
49*da0073e9SAndroid Build Coastguard Worker        row[f"delta_{f}"] = dynamic - static
50*da0073e9SAndroid Build Coastguard Worker    out.writerow(row)
51