code: def update(self, lossfun=None, *args, **kwds):
      target = self.target
      if lossfun is not None:
          use_cleargrads = getattr(self, "_use_cleargrads", True)
          loss = lossfun(*args, **kwds)
          if use_cleargrads:
              target.cleargrads()
          else:
              target.zerograds()
          loss.backward(loss_scale=self.actual_optimizer._loss_scale)
          del loss
  
      if self.is_changed(target):
          self.communicator.bcast_data(target)
      else:
          self.communicator.multi_node_mean_grad(target, self.zero_fill)
          self.actual_optimizer.update(None, *args, **kwds)
  
imports: import chainer
  import copy
label_desc: Use image node_id 2 for calling the _MultiNodeOptimizer obj's underlying member method code with example usage: obj.update(lossfun) without return types