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 bcast_data(self, model):
      for _, param in sorted(model.namedparams()):
          if param.data is not None:
              data = param.data
              is_float16 = param.data.dtype == numpy.float16
              if is_float16:
                  data = data.astype(numpy.float32)
              buf = _memory_utility.array_to_buffer_object(data)
              self.mpi_comm.Bcast(buf)
              if is_float16:
                  # update to array as updating to .data directly
                  # is not supported in ChainerX
                  param.array[...] = data.astype(numpy.float16)
  
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 25 for calling the MpiCommunicatorBase obj's underlying member method code with example usage: obj.bcast_data(model) without return types