| #!/usr/bin/env python3 |
| import argparse |
| import logging |
| |
| import os |
| |
| import pandas as pd |
| |
| from torch._functorch.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("%s, ERROR", filename) |
| print(f"{filename}, ERROR") |
| |
| |
| if __name__ == "__main__": |
| main() |