You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

profiler.py 2.5 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #! /usr/bin/env python3
  2. import argparse
  3. import getopt
  4. import os
  5. import runpy
  6. import sys
  7. from megengine.logger import get_logger
  8. from megengine.utils.profiler import Profiler, merge_trace_events
  9. def main():
  10. parser = argparse.ArgumentParser(
  11. prog="megengine.tools.profiler", description="Profiling megengine program"
  12. )
  13. parser.add_argument(
  14. "-m", "--module", action="store_true", help="whether launch program as module"
  15. )
  16. parser.add_argument("-o", "--output", type=str, help="output file location")
  17. parser.add_argument(
  18. "-f",
  19. "--format",
  20. action="append",
  21. type=str,
  22. help="output file format",
  23. choices=Profiler.valid_formats,
  24. )
  25. parser.add_argument(
  26. "--merge_trace_events", action="store_true",
  27. )
  28. parser.add_argument(
  29. "--clean", action="store_true",
  30. )
  31. for opt in Profiler.valid_options:
  32. parser.add_argument("--" + opt, type=int, default=None)
  33. args, extras = parser.parse_known_args(sys.argv[1:])
  34. prof_args = {}
  35. for opt in Profiler.valid_options:
  36. optval = getattr(args, opt, None)
  37. if optval is not None:
  38. prof_args[opt] = optval
  39. if args.output is not None:
  40. prof_args["path"] = args.output
  41. if args.format:
  42. prof_args["formats"] = args.format
  43. if len(extras) == 0:
  44. if not args.merge_trace_events:
  45. parser.print_usage()
  46. exit(1)
  47. else:
  48. filename = extras[0]
  49. if not args.module:
  50. if not os.path.exists(filename):
  51. get_logger().fatal("cannot find file {}".format(filename))
  52. exit(1)
  53. filename = os.path.realpath(filename)
  54. # Replace profiler's dir with script's dir in front of module search path.
  55. sys.path[0] = os.path.dirname(filename)
  56. sys.argv[:] = [filename, *extras[1:]]
  57. profiler = Profiler(**prof_args)
  58. if args.clean:
  59. for file in os.listdir(profiler.directory):
  60. os.remove(os.path.join(profiler.directory, file))
  61. with profiler:
  62. if args.module:
  63. run_module(filename)
  64. else:
  65. run_script(filename)
  66. profiler.dump()
  67. if args.merge_trace_events:
  68. merge_trace_events(profiler.directory)
  69. def run_module(modulename):
  70. runpy.run_module(modulename, None, "__main__", True)
  71. def run_script(filename):
  72. runpy.run_path(filename, None, "__main__")
  73. if __name__ == "__main__":
  74. main()