                                              name=name,
                                              should_backup=should_backup))
          save_threads.append(MultiThread(self.state.save,
                                          name="save_state",
                                          should_backup=should_backup,
                                          snapshot=snapshot_iteration))
          for thread in save_threads:
              thread.start()
          for thread in save_threads:
              if thread.has_error:
                  logger.error(thread.errors[0])
 
</s> remove         # Put in a line break to avoid jumbled console
 </s> add  </s> remove     def snapshot_model(self):
        """ Take a snapshot of the model at current state and back up """
        logger.info("Saving snapshot")
        src = os.path.dirname(self.filename)
        dst = get_folder("{}_{}".format(src, self.iterations))
        for filename in os.listdir(src):
            if filename.endswith(".bk"):
                continue
            srcfile = os.path.join(src, filename)
            dstfile = os.path.join(dst, filename)
            copyfunc = copytree if os.path.isdir(srcfile) else copyfile
            logger.debug("Saving snapshot: '%s' > '%s'", srcfile, dstfile)
            copyfunc(srcfile, dstfile)
        logger.info("Saved snapshot")

 </s> add  </s> remove     def save(self, should_backup=False, snapshot=False):
 </s> add     def save(self, should_backup=False): </s> remove         if snapshot:
            self.snapshot_model()
 </s> add 
                                        should_backup=should_backup))
                                              name=name,
                                              should_backup=should_backup))
          save_threads.append(MultiThread(self.state.save,
                                          name="save_state",
                                        should_backup=should_backup))
                                        should_backup=should_backup))
          for thread in save_threads:
              thread.start()
          for thread in save_threads:
              if thread.has_error:
                  logger.error(thread.errors[0])
keep keep keep keep replace replace keep keep keep keep keep
 Minor changes

Convert - Force prediction batchsize to 1 when converting on CPU
Training: Move snapshot saving to outside of the save threads to avoid race condition
GUI Summary stats. Show iteration count for current training session (fixed to last save amount). 
plugins/train/model/_base.py