code: def predict(
      ctx,
      role: Role,
      test_data: cpn.dataframe_input(roles=[GUEST, HOST])
      | cpn.data_directory_input(),
      predict_model_input: cpn.model_directory_input(
          roles=[GUEST, HOST]
      ),
      predict_data_output: cpn.dataframe_output(
          roles=[GUEST, HOST], optional=True
      ),
  ):
      if role.is_guest or role.is_host:  # is client
          predict_procedure(
              ctx,
              role,
              test_data,
              predict_model_input,
              predict_data_output,
          )
  
      elif role.is_arbiter:  # is server
          logger.info("arbiter skip predict")
  
file_path: FATE/python/fate/components/components/homo_nn.py
imports: import logging
  import os
  from fate.arch import Context
  from fate.components.components.nn.nn_runner import NNRunner
  from fate.components.components.nn.component_utils import prepare_runner_class, prepare_context_and_role, train_procedure, predict_procedure
  from fate.components.components.utils import consts
  from fate.components.core import ARBITER, GUEST, HOST, Role, cpn
label_desc: Use image node_id 4 for calling a global function with example usage: predict(ctx, role, test_data, predict_model_input, predict_data_output) without return types