import argparse import torch import benchmark_core import benchmark_utils """Performance microbenchmarks's main binary. This is the main function for running performance microbenchmark tests. It also registers existing benchmark tests via Python module imports. """ parser = argparse.ArgumentParser( description="Run microbenchmarks.", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) def parse_args(): parser.add_argument( '--tag-filter', '--tag_filter', help='tag_filter can be used to run the shapes which matches the tag. (all is used to run all the shapes)', default='short') # This option is used to filter test cases to run. parser.add_argument( '--operators', help='Filter tests based on comma-delimited list of operators to test', default=None) parser.add_argument( '--operator-range', '--operator_range', help='Filter tests based on operator_range(e.g. a-c or b,c-d)', default=None) parser.add_argument( '--test-name', '--test_name', help='Run tests that have the provided test_name', default=None) parser.add_argument( '--list-ops', '--list_ops', help='List operators without running them', action='store_true') parser.add_argument( '--list-tests', '--list_tests', help='List all test cases without running them', action='store_true') parser.add_argument( "--iterations", help="Repeat each operator for the number of iterations", type=int ) parser.add_argument( "--num-runs", "--num_runs", help="Run each test for num_runs. Each run executes an operator for number of <--iterations>", type=int, default=1, ) parser.add_argument( "--min-time-per-test", "--min_time_per_test", help="Set the minimum time (unit: seconds) to run each test", type=int, default=0, ) parser.add_argument( "--warmup-iterations", "--warmup_iterations", help="Number of iterations to ignore before measuring performance", default=100, type=int ) parser.add_argument( "--omp-num-threads", "--omp_num_threads", help="Number of OpenMP threads used in PyTorch/Caffe2 runtime", default=None, type=int ) parser.add_argument( "--mkl-num-threads", "--mkl_num_threads", help="Number of MKL threads used in PyTorch/Caffe2 runtime", default=None, type=int ) parser.add_argument( "--report-aibench", "--report_aibench", type=benchmark_utils.str2bool, nargs='?', const=True, default=False, help="Print result when running on AIBench" ) parser.add_argument( "--use-jit", "--use_jit", type=benchmark_utils.str2bool, nargs='?', const=True, default=False, help="Run operators with PyTorch JIT mode" ) parser.add_argument( "--forward-only", "--forward_only", type=benchmark_utils.str2bool, nargs='?', const=True, default=False, help="Only run the forward path of operators" ) parser.add_argument( '--framework', help='Comma-delimited list of frameworks to test (Caffe2, PyTorch)', default="Caffe2,PyTorch") parser.add_argument( '--device', help='Run tests on the provided architecture (cpu, cuda)', default='None') args, _ = parser.parse_known_args() if args.omp_num_threads: # benchmark_utils.set_omp_threads sets the env variable OMP_NUM_THREADS # which doesn't have any impact as C2 init logic has already been called # before setting the env var. # In general, OMP_NUM_THREADS (and other OMP env variables) needs to be set # before the program is started. # From Chapter 4 in OMP standard: https://www.openmp.org/wp-content/uploads/openmp-4.5.pdf # "Modifications to the environment variables after the program has started, # even if modified by the program itself, are ignored by the OpenMP implementation" benchmark_utils.set_omp_threads(args.omp_num_threads) if benchmark_utils.is_pytorch_enabled(args.framework): torch.set_num_threads(args.omp_num_threads) if args.mkl_num_threads: benchmark_utils.set_mkl_threads(args.mkl_num_threads) return args def main(): args = parse_args() benchmark_core.BenchmarkRunner(args).run() if __name__ == "__main__": main()