class_docstr: Implementation of a multiprocess parallel GPU Updater.
  
  This is an implementation of :class:`Updater` that uses multiple GPUs
  with multi-process data parallelism. It uses Nvidia NCCL for communication
  between multiple GPUs.
  
  It behaves similarly to
  :class:`~chainer.training.updaters.StandardUpdater`.
  The update routine is modified to support data-parallel
  computation on multiple GPUs in one machine.
  It is based on synchronous parallel SGD: it
  parallelizes the gradient computation over a mini-batch, and updates the
  parameters only in the main device.
  
  It does not transfer the values collected by :class:`Reporter` in the sub
  devices to the main device. So you can only see the reported values in
  the main device.
  
  Args:
      iterators: List of dataset iterator for the training dataset. The
          number of the iterators must be same to the number of GPUs you use.
      optimizer: Optimizer to update parameters. The model should be attached
          to the optimizer.
      converter: Converter function to build input arrays. Each batch
          extracted by the iterator is split equally between the devices and
          then passed with corresponding ``device`` option to this function.
          :func:`~chainer.dataset.concat_examples` is used by default.
      devices: Dictionary or list of devices to which the training data is
          sent. The master device will be the first one in the list or the
          value attached to the key ``'main'``.
      auto_new_epoch (bool): If ``True``,
          :meth:`~chainer.Optimizer.new_epoch` of the main optimizer is
          automatically called when the ``is_new_epoch`` attribute of the
          main iterator is ``True``.
class_docstr_tok: ["Implementation","of","a","multiprocess","parallel","GPU","Updater",".","This","is","an","implementation","of",":","class",":","`","Updater","`","that","uses","multiple","GPUs","with","multi-process","data","parallelism",".","It","uses","Nvidia","NCCL","for","communication","between","multiple","GPUs",".","It","behaves","similarly","to",":","class",":","`","~chainer.training.updaters.StandardUpdater","`",".","The","update","routine","is","modified","to","support","data-parallel","computation","on","multiple","GPUs","in","one","machine",".","It","is","based","on","synchronous","parallel","SGD",":","it","parallelizes","the","gradient","computation","over","a","mini-batch",",","and","updates","the","parameters","only","in","the","main","device",".","It","does","not","transfer","the","values","collected","by",":","class",":","`","Reporter","`","in","the","sub","devices","to","the","main","device",".","So","you","can","only","see","the","reported","values","in","the","main","device",".","Args",":","iterators",":","List","of","dataset","iterator","for","the","training","dataset",".","The","number","of","the","iterators","must","be","same","to","the","number","of","GPUs","you","use",".","optimizer",":","Optimizer","to","update","parameters",".","The","model","should","be","attached","to","the","optimizer",".","converter",":","Converter","function","to","build","input","arrays",".","Each","batch","extracted","by","the","iterator","is","split","equally","between","the","devices","and","then","passed","with","corresponding","``","device","``","option","to","this","function",".",":","func",":","`","~chainer.dataset.concat_examples","`","is","used","by","default",".","devices",":","Dictionary","or","list","of","devices","to","which","the","training","data","is","sent",".","The","master","device","will","be","the","first","one","in","the","list","or","the","value","attached","to","the","key","``","'main","'","``",".","auto_new_epoch","(","bool",")",":","If","``","True","``",",",":","meth",":","`","~chainer.Optimizer.new_epoch","`","of","the","main","optimizer","is","automatically","called","when","the","``","is_new_epoch","``","attribute","of","the","main","iterator","is","``","True","``","."]
code: def finalize(self):
      self._send_message(("finalize", None))
  
      for worker in self._workers:
          worker.join()
  
      super(MultiprocessParallelUpdater, self).finalize()
  
imports: import multiprocessing
  import warnings
  import numpy
  import six
  import chainer
  from chainer.backends import cuda
  from chainer.dataset import convert
  from chainer import reporter
  from chainer.training.updaters import standard_updater
label_desc: Use image node_id 6 for calling the MultiprocessParallelUpdater obj's underlying member method code with example usage: obj.finalize() without return types