code: def run(self, *args, **kwargs):
      self.nargs = dict(zip(self.arg_names, args))
      if len(self.configs) > 1:
          key = tuple(args[i] for i in self.key_idx)
  
          # This reduces the amount of autotuning by rounding the keys to the nearest power of two
          # In my testing this gives decent results, and greatly reduces the amount of tuning required
          if self.nearest_power_of_two:
              key = tuple([2 ** int(math.log2(x) + 0.5) for x in key])
  
          if key not in self.cache:
              # prune configs
              pruned_configs = self.prune_configs(kwargs)
              bench_start = time.time()
              timings = {
                  config: self._bench(*args, config=config, **kwargs)
                  for config in pruned_configs
              }
              bench_end = time.time()
              self.bench_time = bench_end - bench_start
              self.cache[key] = builtins.min(timings, key=timings.get)
              self.hook(args)
              self.configs_timings = timings
          config = self.cache[key]
      else:
          config = self.configs[0]
      self.best_config = config
      if config.pre_hook is not None:
          config.pre_hook(self.nargs)
      return self.fn.run(
          *args,
          num_warps=config.num_warps,
          num_stages=config.num_stages,
          **kwargs,
          **config.kwargs,
      )
  
file_path: ColossalAI/colossalai/kernel/triton/custom_autotune.py
imports: import builtins
  import math
  import time
  from typing import Dict
  import triton
label_desc: Use image node_id 3 for calling the CustomizedTritonAutoTuner obj's underlying member method code with example usage: obj.run() and returns: self