extra/dashboard/parse_results.py (55 lines of code) (raw):

import argparse import json import os import pandas as pd def build_df(model: str, data_files: dict[str, str]) -> pd.DataFrame: df = pd.DataFrame() # Load the results for key, filename in data_files.items(): with open(filename, 'r') as f: data = json.load(f) if data['config']['meta'] is None: data['config']['meta'] = {} for result in data['results']: entry = pd.json_normalize(result).to_dict(orient='records')[0] if 'engine' in data['config']['meta']: entry['engine'] = data['config']['meta']['engine'] if 'tp' in data['config']['meta']: entry['tp'] = data['config']['meta']['tp'] if 'version' in data['config']['meta']: entry['version'] = data['config']['meta']['version'] if 'device' in data['config']['meta']: entry['device'] = data['config']['meta']['device'] entry['model'] = data['config']['model_name'] entry['run_id'] = data['config']['run_id'] df_tmp = pd.DataFrame(entry, index=[0]) # rename columns that start with 'config.' df_tmp = df_tmp.rename(columns={c: c.split('config.')[-1] for c in df_tmp.columns}) # replace . with _ in column names df_tmp.columns = [c.replace('.', '_') for c in df_tmp.columns] df = pd.concat([df, df_tmp]) return df def build_results_df(results_dir) -> pd.DataFrame: df = pd.DataFrame() # list directories directories = [f'{results_dir}/{d}' for d in os.listdir(results_dir) if os.path.isdir(f'{results_dir}/{d}')] + [results_dir] for directory in directories: # list json files in results directory data_files = {} for filename in os.listdir(directory): if filename.endswith('.json'): data_files[filename.split('.')[-2]] = f'{directory}/{filename}' df = pd.concat([df, build_df(directory.split('/')[-1], data_files)]) return df def build_results(results_dir, results_file, device): df = build_results_df(results_dir) if 'device' not in df.columns: df['device'] = df['model'].apply(lambda x: device) df['error_rate'] = df['failed_requests'] / (df['failed_requests'] + df['successful_requests']) * 100.0 df['prompt_tokens'] = df['total_tokens_sent'] / df['successful_requests'] df['decoded_tokens'] = df['total_tokens'] / df['successful_requests'] df.to_parquet(results_file) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--results-dir', default='results', type=str, required=True, help='Path to the source directory containing the results') parser.add_argument('--results-file', type=str, required=True, help='Path to the results file to write to. Can be a S3 path') parser.add_argument('--device', type=str, required=True, help='GPU name used for benchmarking') args = parser.parse_args() build_results(args.results_dir, args.results_file, args.device)