| #!/usr/bin/env python3 | |
| import argparse | |
| import os | |
| import logging | |
| import pandas as pd | |
| from functorch._src.benchmark_utils import compute_utilization | |
| # process the chrome traces output by the pytorch profiler | |
| # require the json input file's name to be in format {model_name}_chrome_trace_*.json | |
| # the runtimes file should have format (model_name, runtime) | |
| def get_model_name(filename): | |
| """ | |
| Get model name from a file in format {model_name}_chrome_trace_*.json | |
| """ | |
| _, tail = os.path.split(filename) | |
| modelname = tail[:tail.find("_chrome_trace")] | |
| return modelname | |
| def get_total_length(run_times_df, modelname): | |
| return float(run_times_df[run_times_df["name"] == modelname]["runtime"]) | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| group = parser.add_mutually_exclusive_group(required=True) | |
| parser.add_argument( | |
| "--runtime", "-runf", help="file name of the runtime file", required=True | |
| ) | |
| group.add_argument( | |
| "--filename", "-f", action="append", help="a filename of the json file to process" | |
| ) | |
| group.add_argument( | |
| "--folder", "-fd", help="a folder of the json files to process" | |
| ) | |
| args = parser.parse_args() | |
| if args.filename: | |
| filenames = args.filename | |
| elif args.folder: | |
| filenames = [] | |
| directory = args.folder | |
| for filename in os.listdir(directory): | |
| f = os.path.join(directory, filename) | |
| if os.path.isfile(f) and f.endswith(".json"): | |
| filenames.append(f) | |
| else: | |
| print("Please provide a filename or a folder name") | |
| print("modelname, GPU Utilization, MM and Conv time") | |
| run_times_df = pd.read_csv(args.runtime) | |
| for filename in filenames: | |
| try: | |
| modelname = get_model_name(filename) | |
| total_length = get_total_length(run_times_df, modelname) * 1e6 | |
| utilization, mm_conv_utilization = compute_utilization(filenames, total_length) | |
| print(f"{modelname}, {utilization}, {mm_conv_utilization}") | |
| except BaseException: | |
| logging.exception(f"{filename}, ERROR") | |
| print(f"{filename}, ERROR") | |
| if __name__ == "__main__": | |
| main() |