docstr: Take snapshots of a target (mostly trainer) at each node
  
  This must be called at all nodes synchronously at the same
  timing of same iteration.
docstr_tok: ["Take","snapshots","of","a","target","(","mostly","trainer",")","at","each","node","This","must","be","called","at","all","nodes","synchronously","at","the","same","timing","of","same","iteration","."]
code: def save(self, target, iteration):
      """Take snapshots of a target (mostly trainer) at each node
  
      This must be called at all nodes synchronously at the same
      timing of same iteration.
  
      """
      # TODO(kuenishi): Possibly taking checksum on snapshot file
      # may help model loading more reliable ... snapshot_object is
      # smart that uses temporary files and then moving the file,
      # which prevents partial write by atomic operation. If we
      # assume external hands such as bit rot or file truncate we
      # need this. In current implementation manual removal of
      # latest snapshot files will let recovery happen against
      # next-latest snapshot.
  
      filename = self._filename(iteration)
  
      self.stats.start()
      _save(self.path, filename, target)
      self.stats.end()
  
      self.files.append(filename)
  
      if len(self.files) - self.cp_interval > 5:
          # remove older snapshots, and broadcast latest list
          self._sync_file_list(remove_remainder=True)
  
imports: import errno
  import os
  import shutil
  import tempfile
  import time
  import warnings
  import chainer
  from chainer.training import extension
label_desc: Use image node_id 3 for calling the _MultiNodeCheckpointer obj's underlying member method code with example usage: obj.save(target, iteration) without return types