code: def on_train_end(self, output_directory):
      if self.log_artifacts:
          _log_artifacts(output_directory)
      if self.run is not None and not self.external_run:
          # Only end runs managed internally to this callback
          mlflow.end_run()
          self.run_ended = True
  
imports: import logging
  import os
  import queue
  import threading
  from ludwig.api_annotations import DeveloperAPI, PublicAPI
  from ludwig.callbacks import Callback
  from ludwig.constants import TRAINER
  from ludwig.globals import MODEL_HYPERPARAMETERS_FILE_NAME, TRAIN_SET_METADATA_FILE_NAME
  from ludwig.types import TrainingSetMetadataDict
  from ludwig.utils.data_utils import chunk_dict, flatten_dict, save_json, to_json_dict
  from ludwig.utils.package_utils import LazyLoader
label_desc: Use image node_id 9 for calling the MlflowCallback obj's underlying member method code with example usage: obj.on_train_end(output_directory) without return types