docstr: Implement this method to build the tuner by config
  return: tuner
code: def init_tuner(self, tuner_index, tuner_config):
      """
      Implement this method to build the tuner by config
      return: tuner
      """
      # 1. Add experiment config in tuner_config
      tuner_config["experiment"] = {
          "name": "estimator_experiment_{}".format(tuner_index),
          "id": tuner_index,
          "dir": self.pipeline_ex_config.estimator_ex_dir,
          "observer_type": "file_storage",
      }
      tuner_config["qlib_client"] = self.qlib_client_config
      # 2. Add data config in tuner_config
      tuner_config["data"] = self.data_config
      # 3. Add backtest config in tuner_config
      tuner_config["backtest"] = self.backtest_config
      # 4. Update trainer in tuner_config
      tuner_config["trainer"].update({"args": self.time_config})
  
      # 5. Import Tuner class
      tuner_module = get_module_by_module_path(
          self.pipeline_ex_config.tuner_module_path
      )
      tuner_class = getattr(
          tuner_module, self.pipeline_ex_config.tuner_class
      )
      # 6. Return the specific tuner
      return tuner_class(tuner_config, self.optim_config)
  
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 3 for calling the Pipeline obj's underlying member method code with example usage: obj.init_tuner(tuner_index, tuner_config) and returns: tuner_class