code: def __call__(
      self,
      global_step,
      loss: AverageMeter,
      epoch: int,
      lr_value,
      avg_reader_cost,
      avg_batch_cost,
      avg_samples,
      ips,
  ):
      if (
          self.rank is 0
          and global_step > 0
          and global_step % self.frequent == 0
      ):
          time_now = (time.time() - self.time_start) / 3600
          time_total = time_now / ((global_step + 1) / self.total_step)
          time_for_end = time_total - time_now
          if self.writer is not None:
              self.writer.add_scalar(
                  "time_for_end", time_for_end, global_step
              )
              self.writer.add_scalar("loss", loss.avg, global_step)
          # ips is throughput
          msg = (
              "loss %.4f, lr: %f, epoch: %d, step: %d, eta: %1.2f hours, avg_reader_cost: %.5f sec, avg_batch_cost: %.5f sec, avg_samples: %.5f, ips: %.5f images/sec"
              % (
                  loss.avg,
                  lr_value,
                  epoch,
                  global_step,
                  time_for_end,
                  avg_reader_cost,
                  avg_batch_cost,
                  avg_samples,
                  ips * self.world_size,
              )
          )
          logging.info(msg)
          loss.reset()
          self.tic = time.time()
  
file_path: insightface/recognition/arcface_paddle/utils/logging.py
imports: import logging
  import os
  import sys
  import time
label_desc: Use image node_id 2 for calling the CallBackLogging obj's underlying member method code with example usage: obj.__call__(global_step, loss, epoch, lr_value, avg_reader_cost, avg_batch_cost, avg_samples, ips) without return types