Browse Source

feat(profiler): add launch script for profiler

GitOrigin-RevId: fdfb60b149
release-1.5
Megvii Engine Team huangxinda 4 years ago
parent
commit
4286bb9f51
1 changed files with 89 additions and 0 deletions
  1. +89
    -0
      imperative/python/megengine/tools/profiler.py

+ 89
- 0
imperative/python/megengine/tools/profiler.py View File

@@ -0,0 +1,89 @@
import argparse
import getopt
import os
import runpy
import sys

from megengine.logger import get_logger
from megengine.utils.profiler import Profiler, merge_trace_events


def main():
parser = argparse.ArgumentParser(
prog="megengine.tools.profiler", description="Profiling megengine program"
)
parser.add_argument(
"-m", "--module", action="store_true", help="whether launch program as module"
)
parser.add_argument("-o", "--output", type=str, help="output file location")
parser.add_argument(
"-f",
"--format",
action="append",
type=str,
help="output file format",
choices=Profiler.valid_formats,
)
parser.add_argument(
"--merge_trace_events", action="store_true",
)
parser.add_argument(
"--clean", action="store_true",
)
for opt in Profiler.valid_options:
parser.add_argument("--" + opt, type=int, default=None)
args, extras = parser.parse_known_args(sys.argv[1:])
prof_args = {}
for opt in Profiler.valid_options:
optval = getattr(args, opt, None)
if optval is not None:
prof_args[opt] = optval

if args.output is not None:
prof_args["path"] = args.output

if args.format:
prof_args["formats"] = args.format

if args.clean:
for file in os.listdir(profiler.directory):
os.remove(os.path.join(profiler.directory, file))

if len(extras) == 0:
if not args.merge_trace_events:
parser.print_usage()
exit(1)
else:
filename = extras[0]
if not args.module:
if not os.path.exists(filename):
get_logger().fatal("cannot find file {}".format(filename))
exit(1)
filename = os.path.realpath(filename)
# Replace profiler's dir with script's dir in front of module search path.
sys.path[0] = os.path.dirname(filename)

sys.argv[:] = [filename, *extras[1:]]

profiler = Profiler(**prof_args)
with profiler:
if args.module:
runpy.run_module(filename)
else:
run_script(filename)
profiler.dump()

if args.merge_trace_events:
merge_trace_events(profiler.directory)


def run_module(modulename):
runpy.run_module(modulename, None, "__main__", True)


def run_script(filename):
runpy.run_path(filename, None, "__main__")


if __name__ == "__main__":
main()

Loading…
Cancel
Save