Files
powdr/openvm/scripts/basic_metrics.py
Georg Wiese f4345b5304 Improve basic metrics summary (#3203)
Adds `app_proof_cols` and `total_proof_time_ms` columns to the result
CSV.
2025-08-21 14:09:12 +00:00

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)