1#!/usr/bin/env python3 2 3# program: tfprof 4 5import logging as logger 6import time 7import sys 8import json 9import argparse 10import os 11import subprocess 12import requests 13 14# run_tfprof (default) 15# generate profiler data in taskflow profiler format 16def run_tfprof(args): 17 18 args.output = os.path.abspath(args.output); 19 20 logger.info("profiling program \"" + ' '.join(args.program) + "\"") 21 22 ## open the output file 23 with open(args.output, "w") as ofs: 24 25 ofs.write('['); 26 27 os.environ["TF_ENABLE_PROFILER"] = args.output; 28 29 ## launch the program 30 prob = time.perf_counter(); 31 subprocess.call(args.program); 32 proe = time.perf_counter(); 33 logger.info(f"finished with {(proe - prob)*1000:0.2f} milliseconds"); 34 logger.info(f"saved result to {args.output:s}"); 35 36 if(args.port == None): 37 return; 38 39 logger.info(f"sending the result to localhost:{args.port:d}"); 40 41# run_chrome (TODO) 42# generate the profiler data in chrome tracing format 43 44# main function 45def main(): 46 47 # configure logger 48 logger.basicConfig( 49 #format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 50 format='%(asctime)s %(levelname)s: %(message)s', 51 datefmt='%m/%d/%Y %I:%M:%S', 52 level=logger.DEBUG 53 ) 54 55 # parse the input arguments 56 parser = argparse.ArgumentParser(); 57 58 parser.add_argument( 59 '-o', '--output', 60 type=str, 61 help='file to save the result (default: output.tfp)', 62 default="output.tfp" 63 ) 64 65 parser.add_argument( 66 '-p', '--port', 67 type=int, 68 help='port number of the profiler server (default: None)', 69 default=None 70 ) 71 72 parser.add_argument( 73 'program', 74 nargs=argparse.REMAINDER, 75 help='program to profile (e.g., path/to/binary args)' 76 ) 77 78 args = parser.parse_args(); 79 80 if(len(args.program) == 0) : 81 logger.error("no program specified"); 82 sys.exit(1); 83 84 run_tfprof(args); 85 86 87# main entry 88if __name__ == "__main__": 89 main(); 90 91 92