mirror of
https://github.com/powdr-labs/powdr.git
synced 2026-01-13 03:57:54 -05:00
81 lines
3.8 KiB
Python
81 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
from collections import OrderedDict
|
|
import pandas as pd
|
|
from metrics_utils import load_metrics_dataframes, is_normal_instruction_air
|
|
|
|
def extract_metrics(filename):
|
|
app, leaf, internal = load_metrics_dataframes(filename)
|
|
metrics = OrderedDict()
|
|
|
|
powdr_air = app[app["air_name"].fillna('').str.startswith("PowdrAir")]
|
|
non_powdr_air = app[~app["air_name"].fillna('').str.startswith("PowdrAir")]
|
|
|
|
# Split non_powdr_air into normal instructions and openvm precompiles
|
|
is_normal_instruction = non_powdr_air["air_name"].fillna('').apply(is_normal_instruction_air)
|
|
normal_instruction_air = non_powdr_air[is_normal_instruction]
|
|
openvm_precompile_air = non_powdr_air[~is_normal_instruction]
|
|
|
|
# Compute total proof times
|
|
app_proof_time_ms = pd.to_numeric(app[app["metric"] == "stark_prove_excluding_trace_time_ms"]["value"]).sum()
|
|
leaf_proof_time_ms = pd.to_numeric(leaf[leaf["metric"] == "stark_prove_excluding_trace_time_ms"]["value"]).sum()
|
|
internal_proof_time_ms = pd.to_numeric(internal[internal["metric"] == "stark_prove_excluding_trace_time_ms"]["value"]).sum()
|
|
total_proof_time_ms = app_proof_time_ms + leaf_proof_time_ms + internal_proof_time_ms
|
|
|
|
# Compute total column counts
|
|
# Note that this sums the columns over *all* segments.
|
|
# This metric should roughly correlate with leaf proof time.
|
|
main_cols = pd.to_numeric(app[app["metric"] == "main_cols"]["value"]).sum()
|
|
prep_cols = pd.to_numeric(app[app["metric"] == "prep_cols"]["value"]).sum()
|
|
perm_cols = pd.to_numeric(app[app["metric"] == "perm_cols"]["value"]).sum()
|
|
app_proof_cols = main_cols + prep_cols + perm_cols
|
|
|
|
metrics["filename"] = filename
|
|
|
|
metrics["num_segments"] = pd.to_numeric(app[app["metric"] == "num_segments"]["value"]).sum()
|
|
|
|
metrics["app_proof_cells"] = pd.to_numeric(app[app["metric"] == "total_cells"]["value"]).sum()
|
|
|
|
metrics["app_proof_cols"] = app_proof_cols
|
|
|
|
metrics["total_proof_time_ms"] = total_proof_time_ms
|
|
|
|
metrics["app_proof_time_ms"] = app_proof_time_ms
|
|
|
|
metrics["app_execute_time_ms"] = pd.to_numeric(app[app["metric"] == "execute_time_ms"]["value"]).sum()
|
|
|
|
metrics["app_trace_gen_time_ms"] = pd.to_numeric(app[app["metric"] == "trace_gen_time_ms"]["value"]).sum()
|
|
|
|
metrics["leaf_proof_time_ms"] = leaf_proof_time_ms
|
|
metrics["inner_recursion_proof_time_ms"] = internal_proof_time_ms
|
|
|
|
normal_instruction_cells = pd.to_numeric(normal_instruction_air[normal_instruction_air["metric"] == "cells"]["value"]).sum()
|
|
openvm_precompile_cells = pd.to_numeric(openvm_precompile_air[openvm_precompile_air["metric"] == "cells"]["value"]).sum()
|
|
powdr_cells = pd.to_numeric(powdr_air[powdr_air["metric"] == "cells"]["value"]).sum()
|
|
assert(metrics["app_proof_cells"] == powdr_cells + normal_instruction_cells + openvm_precompile_cells)
|
|
|
|
metrics["normal_instruction_ratio"] = normal_instruction_cells / metrics["app_proof_cells"]
|
|
metrics["openvm_precompile_ratio"] = openvm_precompile_cells / metrics["app_proof_cells"]
|
|
metrics["powdr_ratio"] = powdr_cells / metrics["app_proof_cells"]
|
|
|
|
metrics["powdr_rows"] = pd.to_numeric(powdr_air[powdr_air["metric"] == "rows"]["value"]).sum()
|
|
|
|
return metrics
|
|
|
|
def main(metrics_files, csv):
|
|
file_metrics = [ extract_metrics(filename) for filename in metrics_files ]
|
|
|
|
df = pd.DataFrame(file_metrics)
|
|
if csv:
|
|
print(df.to_csv(index=False))
|
|
else:
|
|
print(df.to_string(index=False))
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(description="Print basic metrics from a set of metrics JSON files.")
|
|
parser.add_argument('metrics_files', nargs=argparse.REMAINDER, help='Paths to the metrics JSON files')
|
|
parser.add_argument('--csv', action='store_true', help='Output in CSV format')
|
|
args = parser.parse_args()
|
|
main(args.metrics_files, args.csv)
|