class_docstr: MpiCommunicatorBase
  
  Implementation of communicator interface defined by
  :class:`CommunicatorBase`. This communicator assumes MPI4py and
  all ChainerMN processes are invoked by ``mpirun`` (``mpiexec``)
  command. Although this lacks several important methods such as
  ``multi_node_mean_grad`` to be impelmented with speficic algorithm. See
  hierarchical communicator or pure_nccl communicator for example.
code: def send_obj(self, obj, dest, tag=0):
      if self._check_obj_type_for_chainerx(obj):
          raise ValueError(
              "calling send_obj on chainerx \
                  with cuda is not supported"
          )
      self.mpi_comm.send(obj, dest=dest, tag=tag)
  
imports: import mpi4py
  import numpy
  import chainer
  import chainer.backends
  import chainer.utils
  from chainer.utils import collections_abc
  from chainermn.communicators import _communication_utility
  from chainermn.communicators._communication_utility import chunked_bcast_obj
  from chainermn.communicators import _memory_utility
  from chainermn.communicators import communicator_base
  import chainerx
label_desc: Use image node_id 20 for calling the MpiCommunicatorBase obj's underlying member method code with example usage: obj.send_obj(obj, dest, tag) without return types