mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08:00
Signed-off-by: Edward Z. Yang <ezyang@meta.com> Pull Request resolved: https://github.com/pytorch/pytorch/pull/105928 Approved by: https://github.com/albanD
84 lines
3.2 KiB
Python
84 lines
3.2 KiB
Python
import statistics
|
|
|
|
import pandas as pd
|
|
from tabulate import tabulate
|
|
|
|
|
|
class ProcessedMetricsPrinter:
|
|
def print_data_frame(self, name, processed_metrics):
|
|
print(f"metrics for {name}")
|
|
data_frame = self.get_data_frame(processed_metrics)
|
|
print(
|
|
tabulate(
|
|
data_frame, showindex=False, headers=data_frame.columns, tablefmt="grid"
|
|
)
|
|
)
|
|
|
|
def combine_processed_metrics(self, processed_metrics_list):
|
|
r"""
|
|
A method that merges the value arrays of the keys in the dictionary
|
|
of processed metrics.
|
|
|
|
Args:
|
|
processed_metrics_list (list): a list containing dictionaries with
|
|
recorded metrics as keys, and the values are lists of elapsed times.
|
|
|
|
Returns::
|
|
A merged dictionary that is created from the list of dictionaries passed
|
|
into the method.
|
|
|
|
Examples::
|
|
>>> instance = ProcessedMetricsPrinter()
|
|
>>> dict_1 = trainer1.get_processed_metrics()
|
|
>>> dict_2 = trainer2.get_processed_metrics()
|
|
>>> print(dict_1)
|
|
{
|
|
"forward_metric_type,forward_pass" : [.0429, .0888]
|
|
}
|
|
>>> print(dict_2)
|
|
{
|
|
"forward_metric_type,forward_pass" : [.0111, .0222]
|
|
}
|
|
>>> processed_metrics_list = [dict_1, dict_2]
|
|
>>> result = instance.combine_processed_metrics(processed_metrics_list)
|
|
>>> print(result)
|
|
{
|
|
"forward_metric_type,forward_pass" : [.0429, .0888, .0111, .0222]
|
|
}
|
|
"""
|
|
processed_metric_totals = {}
|
|
for processed_metrics in processed_metrics_list:
|
|
for metric_name, values in processed_metrics.items():
|
|
if metric_name not in processed_metric_totals:
|
|
processed_metric_totals[metric_name] = []
|
|
processed_metric_totals[metric_name] += values
|
|
return processed_metric_totals
|
|
|
|
def get_data_frame(self, processed_metrics):
|
|
df = pd.DataFrame(columns=["name", "min", "max", "mean", "variance", "stdev"])
|
|
for metric_name in sorted(processed_metrics.keys()):
|
|
values = processed_metrics[metric_name]
|
|
row = {
|
|
"name": metric_name,
|
|
"min": min(values),
|
|
"max": max(values),
|
|
"mean": statistics.mean(values),
|
|
"variance": statistics.variance(values),
|
|
"stdev": statistics.stdev(values),
|
|
}
|
|
df = df.append(row, ignore_index=True)
|
|
return df
|
|
|
|
def print_metrics(self, name, rank_metrics_list):
|
|
if rank_metrics_list:
|
|
metrics_list = []
|
|
for rank, metric in rank_metrics_list:
|
|
self.print_data_frame(f"{name}={rank}", metric)
|
|
metrics_list.append(metric)
|
|
combined_metrics = self.combine_processed_metrics(metrics_list)
|
|
self.print_data_frame(f"all {name}", combined_metrics)
|
|
|
|
def save_to_file(self, data_frame, file_name):
|
|
file_name = f"data_frames/{file_name}.csv"
|
|
data_frame.to_csv(file_name, encoding="utf-8", index=False)
|