code: def on_eval_end(self, trainer, progress_tracker, save_path):
      if progress_tracker.steps not in self.logged_steps:
          self.logged_steps.add(progress_tracker.steps)
          # Adds a tuple to the logging queue.
          # True is passed to indicate that the background saving loop should continue.
          self.save_fn(
              (
                  progress_tracker.log_metrics(),
                  progress_tracker.steps,
                  save_path,
                  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 11 for calling the MlflowCallback obj's underlying member method code with example usage: obj.on_eval_end(trainer, progress_tracker, save_path) without return types