code: def on_train_end(self, trainer):
      if self.best_monitor_epoch != -1:
          msg = (
              f"The best performance for monitor {self._real_monitor}:{self.monitor_value} was achieved in"
              f" Epoch:{self.best_monitor_epoch}, Global Batch:{self.best_monitor_step}."
          )
          if self.best_results is not None:
              msg = (
                  msg
                  + " The evaluation result: \n"
                  + str(self.best_results)
              )
          logger.info(msg)
  
imports: import json
  from typing import Union
  from .has_monitor_callback import HasMonitorCallback
  from fastNLP.core.utils import f_rich_progress, f_tqdm_progress
  from fastNLP.core.log import logger
label_desc: Use image node_id 3 for calling the ProgressCallback obj's underlying member method code with example usage: obj.on_train_end(trainer) without return types