class_docstr: BenchmarkRunner is responsible for benchmarking all the registered
  benchmark test groups.
  
  Attributes:
      tag_filter (str): control the benchmarks which matches the tag.
      operator (str): only run benchmark test cases that contains
  this filter string in the test case's id.
      test_name (str): only run benchmark test cases that matches this filter,
      this is a case-sensitive substring match and it happens in
      the _keep_test method.
class_docstr_tok: ["BenchmarkRunner","is","responsible","for","benchmarking","all","the","registered","benchmark","test","groups",".","Attributes",":","tag_filter","(","str",")",":","control","the","benchmarks","which","matches","the","tag",".","operator","(","str",")",":","only","run","benchmark","test","cases","that","contains","this","filter","string","in","the","test","case","'s","id",".","test_name","(","str",")",":","only","run","benchmark","test","cases","that","matches","this","filter",",","this","is","a","case-sensitive","substring","match","and","it","happens","in","the","_keep_test","method","."]
code: def run(self):
      self._print_header()
  
      for test_metainfo in BENCHMARK_TESTER:
          for test in _build_test(*test_metainfo):
              full_test_id, test_case = test
              op_test_config = test_case.test_config
  
              if self._print_test_case_info(test_case):
                  continue
  
              if not self._keep_test(test_case):
                  continue
  
              # To reduce variance, fix a numpy randseed to the test case,
              # so that the randomly generated input tensors remain the
              # same for each test case.
              # The random seed is limited to 32-bit because of numpy
              # requirement.
              np.random.seed(seed=hash(full_test_id) & ((1 << 32) - 1))
  
              print(
                  f"# Benchmarking {test_case.framework}: {test_case.op_bench.module_name()}"
              )
  
              if op_test_config.run_backward:
                  launch_func = self._launch_backward
              else:
                  launch_func = self._launch_forward
  
              # Warmup
              launch_func(
                  test_case,
                  self.args.warmup_iterations,
                  print_per_iter=False,
              )
              # Actual Execution
              reported_time = [
                  self._measure_time(
                      launch_func,
                      test_case,
                      self.iters,
                      self.print_per_iter,
                  )
                  for _ in range(self.num_runs)
              ]
  
              self._print_perf_result(reported_time, test_case)
  
imports: import ast
  import copy
  import functools
  import json
  import timeit
  from collections import namedtuple
  import benchmark_utils
  import numpy
  import torch
  import torch.utils.cpp_extension
label_desc: Use image node_id 14 for calling the BenchmarkRunner obj's underlying member method code with example usage: obj.run() without return types