code: def run_api_experiment(
      input_features, output_features, dataset, **kwargs
  ):
      config = {
          "input_features": input_features,
          "output_features": output_features,
          "combiner": {"type": "concat", "output_size": 14},
          TRAINER: {"epochs": 2, BATCH_SIZE: 128},
      }
  
      model = LudwigModel(config)
      output_dir = None
  
      try:
          # Training with csv
          _, _, output_dir = model.train(dataset=dataset, **kwargs)
  
          model.predict(dataset=dataset)
  
          # Attempt loading saved model, should broadcast successfully
          model_dir = (
              os.path.join(output_dir, "model") if output_dir else None
          )
          loaded_model = LudwigModel.load(model_dir)
  
          # Model loading should broadcast weights from coordinator
          loaded_state = loaded_model.model.state_dict()
          bcast_state = hvd.broadcast_object(loaded_state)
          for loaded, bcast in zip(
              loaded_state.values(), bcast_state.values()
          ):
              assert torch.allclose(loaded, bcast)
      finally:
          if output_dir:
              shutil.rmtree(output_dir, ignore_errors=True)
  
file_path: ludwig/tests/integration_tests/scripts/run_train_horovod.py
imports: import argparse
  import json
  import os
  import shutil
  import sys
  import horovod.torch
  import torch
  import ludwig.utils.horovod_utils
  from ludwig.api import LudwigModel
  from ludwig.constants import BATCH_SIZE, TRAINER
label_desc: Use image node_id 1 for calling a global function with example usage: run_api_experiment(input_features, output_features, dataset) without return types