@@ -104,8 +104,6 @@ def get_min_time_bytes(df, device_info):
104104
105105def derive_metrics (gf , metrics , raw_metrics , device_info ):
106106 derived_metrics = []
107- original_metrics = []
108- exclusive_metrics = ["util" ] + list (derivable_metrics .keys ()) + list (avg_time_factor_dict .factor .keys ())
109107 internal_frame_indices = gf .dataframe ["device_id" ].isna ()
110108
111109 def get_time_seconds (df ):
@@ -121,10 +119,10 @@ def get_time_seconds(df):
121119 gf .dataframe ["util (inc)" ] = min_time_flops ["min_time" ].combine (min_time_bytes ["min_time" ], max ) / time_sec
122120 gf .dataframe .loc [internal_frame_indices , "util (inc)" ] = np .nan
123121 derived_metrics .append ("util (inc)" )
124- elif metric in derivable_metrics :
125- deriveable_metric = derivable_metrics [metric ]
126- metric_name = deriveable_metric .name
127- metric_factor_dict = deriveable_metric .factor
122+ elif metric in derivable_metrics : # flop<width>/s, <t/g>byte/s
123+ derivable_metric = derivable_metrics [metric ]
124+ metric_name = derivable_metric .name
125+ metric_factor_dict = derivable_metric .factor
128126 matched_metric_name = match_available_metrics ([metric_name ], raw_metrics )[0 ]
129127 gf .dataframe [f"{ metric } (inc)" ] = (gf .dataframe [matched_metric_name ] / (get_time_seconds (gf .dataframe )) /
130128 metric_factor_dict [metric ])
@@ -134,24 +132,28 @@ def get_time_seconds(df):
134132 gf .dataframe [f"{ metric } (inc)" ] = (get_time_seconds (gf .dataframe ) /
135133 time_factor_dict .factor [metric_time_unit ])
136134 derived_metrics .append (f"{ metric } (inc)" )
137- metric_name = match_available_metrics ([time_factor_dict .name ], raw_metrics )[0 ]
138135 elif metric in avg_time_factor_dict .factor :
139136 metric_time_unit = avg_time_factor_dict .name + "/" + metric .split ("/" )[1 ]
140137 gf .dataframe [f"{ metric } (inc)" ] = (get_time_seconds (gf .dataframe ) / gf .dataframe ['count' ] /
141138 avg_time_factor_dict .factor [metric_time_unit ])
142139 gf .dataframe .loc [internal_frame_indices , f"{ metric } (inc)" ] = np .nan
143140 derived_metrics .append (f"{ metric } (inc)" )
144141 else :
145- original_metrics .append (metric )
146- if metric not in exclusive_metrics :
147- single_frame = gf .dataframe [metric_name ]
148- total = gf .dataframe [metric_name ].iloc [0 ]
149- metric = metric .split ("/" )[0 ]
150- gf .dataframe [f"{ metric } /% (inc)" ] = (single_frame / total ) * 100.0
151- derived_metrics .append (f"{ metric } /% (inc)" )
152- if original_metrics :
153- original_metrics = match_available_metrics (original_metrics , raw_metrics )
154- return derived_metrics + original_metrics
142+ metric_name_and_unit = metric .split ("/" )
143+ metric_name = metric_name_and_unit [0 ]
144+ if len (metric_name_and_unit ) > 1 :
145+ metric_unit = metric_name_and_unit [1 ]
146+ if metric_unit != "%" :
147+ raise ValueError (f"Unsupported unit { metric_unit } " )
148+ matched_metric_name = match_available_metrics ([metric_name ], raw_metrics )[0 ]
149+ single_frame = gf .dataframe [matched_metric_name ]
150+ total = gf .dataframe [matched_metric_name ].iloc [0 ]
151+ gf .dataframe [f"{ metric_name } /% (inc)" ] = (single_frame / total ) * 100.0
152+ derived_metrics .append (f"{ metric_name } /% (inc)" )
153+ else :
154+ matched_metric_name = match_available_metrics ([metric_name ], raw_metrics )[0 ]
155+ derived_metrics .append (matched_metric_name )
156+ return derived_metrics
155157
156158
157159def format_frames (gf , format ):
@@ -234,10 +236,7 @@ def main():
234236- flop[<8/16/32/64>]/s, gflop[<8/16/32/64>]/s, tflop[<8/16/32/64>]/s: flops / time
235237- byte/s, gbyte/s, tbyte/s: bytes / time
236238- util: max(sum(flops<width>) / peak_flops<width>_time, sum(bytes) / peak_bandwidth_time)
237-
238- For inclusive metrics (e.g. time) an additional column is printed showing the percentage
239- each frame is of the full model.
240-
239+ - <metric>/%%: frame(metric) / sum(metric). Only availble for inclusive metrics (e.g. time)
241240""" ,
242241 )
243242 argparser .add_argument (
0 commit comments