code: def prepare_runner_class(
      runner_module, runner_class, runner_conf, source
  ):
      logger.info("runner conf is {}".format(runner_conf))
      logger.info("source is {}".format(source))
      if source is None:
          # load from default folder
          runner = Loader(
              "fate.components.components.nn.runner." + runner_module,
              runner_class,
              **runner_conf,
          )()
      else:
          runner = Loader(
              runner_module, runner_class, source=source, **runner_conf
          )()
      assert isinstance(
          runner, NNRunner
      ), "loaded class must be a subclass of NNRunner class, but got {}".format(
          type(runner)
      )
      return runner
  
file_path: FATE/python/fate/components/components/nn/component_utils.py
imports: from fate.components.components.nn.loader import Loader
  from fate.components.components.nn.nn_runner import NNRunner
  from fate.components.components.utils import consts
  from fate.arch.dataframe import DataFrame
  from fate.components.components.utils.tools import add_dataset_type
  from fate.arch import Context
  from fate.components.core import ARBITER, GUEST, HOST, Role, cpn
  import logging
  from fate.components.core.component_desc.artifacts.data._dataframe import DataframeReader, DataframeWriter
  from fate.components.core.component_desc.artifacts.data._directory import DataDirectoryReader
  from fate.components.core.component_desc.artifacts.model._directory import ModelDirectoryReader, ModelDirectoryWriter
label_desc: Use image node_id 1 for calling a global function with example usage: prepare_runner_class(runner_module, runner_class, runner_conf, source) and returns: runner