code: def run(self):
      TimeInspector.set_time_mark()
      for tuner_index, tuner_config in enumerate(self.pipeline_config):
          tuner = self.init_tuner(tuner_index, tuner_config)
          tuner.tune()
          if (
              self.global_best_res is None
              or self.global_best_res > tuner.best_res
          ):
              self.global_best_res = tuner.best_res
              self.global_best_params = tuner.best_params
              self.best_tuner_index = tuner_index
      TimeInspector.log_cost_time("Finished tuner pipeline.")
  
      self.save_tuner_exp_info()
  
file_path: qlib/qlib/contrib/tuner/pipeline.py
imports: import os
  import json
  import logging
  import importlib
  from abc import abstractmethod
  from ...log import get_module_logger, TimeInspector
  from ...utils import get_module_by_module_path
label_desc: Use image node_id 2 for calling the Pipeline obj's underlying member method code with example usage: obj.run() without return types