code: @Override protected void postGlobal(){
      DeepLearningParameters dlp = _localmodel.get_params();
      if (H2O.CLOUD.size() > 1 && !dlp._replicate_training_data) {
        long now = System.currentTimeMillis();
        if (_chunk_node_count < H2O.CLOUD.size() && (now - _lastWarn > 5000) && _warnCount < 3) {
  //        Log.info("Synchronizing across " + _chunk_node_count + " H2O node(s).");
          Log.warn(H2O.CLOUD.size() - _chunk_node_count + " node(s) (out of " + H2O.CLOUD.size()
              + ") are not contributing to model updates. Consider setting replicate_training_data to true or using a larger training dataset (or fewer H2O nodes).");
          _lastWarn = now;
          _warnCount++;
        }
      }
      // Check that we're not inside a DeepLearningTask2
      assert ((!dlp._replicate_training_data || H2O.CLOUD.size() == 1) == !_run_local);
      if (!_run_local) {
        _localmodel.add_processed_global(_localmodel.get_processed_local()); //move local sample counts to global ones
        _localmodel.set_processed_local(0l);
        // model averaging
        if (_chunk_node_count > 1)
          _localmodel.div(_chunk_node_count);
        if (_localmodel.get_params()._elastic_averaging)
          _sharedmodel = DeepLearningModelInfo.timeAverage(_localmodel);
      } else {
        //Get ready for reduction in DeepLearningTask2
        //Just swap the local and global models
        _sharedmodel = _localmodel;
      }
      if (_sharedmodel == null)
        _sharedmodel = _localmodel;
      _localmodel = null;
    }
docs: After all reduces are done, the driver node calls this method to clean up
  This is only needed if we're not inside a DeepLearningTask2 (which will do the reduction between replicated data workers).
  So if replication is disabled, and every node works on partial data, then we have work to do here (model averaging).