code: def __call__(self, param):
      num_update = param.num_update
  
      if num_update in [
          self.max_step - 10,
      ] or (num_update % 10000 == 0 and num_update > 0):
          # params
          arg, aux = self.model.get_export_params()
          # symbol
          _sym = self.symbol
          # save
  
          # average all aux
          new_arg, new_aux = {}, {}
          for key, tensor in aux.items():
              new_aux[key] = hvd.allreduce(tensor, average=True)
          for key, tensor in arg.items():
              new_arg[key] = hvd.allreduce(tensor, average=True)
  
          if self.rank == 0:
              mx.model.save_checkpoint(
                  prefix=self.prefix + "_average",
                  epoch=0,
                  symbol=_sym,
                  arg_params=new_arg,
                  aux_params=new_aux,
              )
              mx.model.save_checkpoint(
                  prefix=self.prefix,
                  epoch=0,
                  symbol=_sym,
                  arg_params=arg,
                  aux_params=aux,
              )
  
      # training is over
      if num_update > self.max_step > 0:
          logging.info("Training is over!")
          sys.exit(0)
  
imports: import logging
  import os
  import sys
  import time
  import horovod.mxnet
  import mxnet
  from mxboard import SummaryWriter
  from mxnet import nd
  from default import config
  from evaluation import verification
label_desc: Use image node_id 2 for calling the CallBackModelSave obj's underlying member method code with example usage: obj.__call__(param) without return types