GradientMachine.cpp 2.9 KB
Newer Older
1
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
Z
zhangjinchao01 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

#include "GradientMachine.h"

#include <fstream>
Y
Yu Yang 已提交
18
#include "paddle/utils/Logging.h"
Z
zhangjinchao01 已提交
19

20 21 22 23
#include "NeuralNetwork.h"
#include "hl_gpu.h"

#ifndef PADDLE_MOBILE_INFERENCE
Y
Yu Yang 已提交
24
#include "GradientMachineMode.h"
Z
zhangjinchao01 已提交
25 26
#include "MultiGradientMachine.h"
#include "MultiNetwork.h"
Y
Yu Yang 已提交
27
#include "ParallelNeuralNetwork.h"
28
#endif
Z
zhangjinchao01 已提交
29 30 31 32

namespace paddle {

GradientMachine* GradientMachine::create(
33 34
    const ModelConfig& config,
    int mode,
Z
zhangjinchao01 已提交
35
    const std::vector<ParameterType>& parameterTypes) {
36
#ifndef PADDLE_MOBILE_INFERENCE
Z
zhangjinchao01 已提交
37 38 39 40 41 42
  if (auto gm = IGradientMachineMode::tryCreateGradientMachine(mode, config)) {
    return gm;
  }
  if (FLAGS_trainer_count > 1) {
    return new MultiGradientMachine(config, FLAGS_use_gpu);
  }
43
#endif
Z
zhangjinchao01 已提交
44
  if (FLAGS_trainer_count == 1) {  // single
45
#ifndef PADDLE_MOBILE_INFERENCE
Z
zhangjinchao01 已提交
46 47 48 49 50 51 52 53 54 55 56
    NeuralNetwork* nn;
    if (config.type() == "multi_nn") {
      /* multi submodel calculate, thread(s) will be initialized inside */
      nn = new MultiNetwork("root");
    } else if (FLAGS_parallel_nn) {
      /* multi threads calculate */
      nn = new ParallelNeuralNetwork();
    } else {
      /* single thread calculate */
      nn = NeuralNetwork::create(config);
    }
57 58 59
#else
    NeuralNetwork* nn = NeuralNetwork::create(config);
#endif
60 61 62 63 64
    ParamInitCallback testParamInitCb = [](int paramId, Parameter* para) {
      para->enableType(PARAMETER_VALUE);
    };
    nn->init(
        config, mode == kTesting ? testParamInitCb : nullptr, parameterTypes);
Z
zhangjinchao01 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    return nn;
  }
  LOG(FATAL) << "Unknown model type: " << config.type();
  return nullptr;
}

void GradientMachine::saveParameters(const std::string& dir) const {
  LOG(INFO) << "Saving parameters to " << dir;

  for (auto& para : parameters_) {
    std::string filename = dir + "/" + para->getName();
    if (para->isFullSize()) {
      para->save(filename);
    }
  }
}

void GradientMachine::loadParameters(const std::string& dir) {
  LOG(INFO) << "Loading parameters from " << dir;

  for (auto& para : parameters_) {
    std::string filename = dir + "/" + para->getName();
    if (para->isFullSize()) {
      para->load(filename);
    }
  }
}

void GradientMachine::randParameters() {
  LOG(INFO) << "Initing parameters..";

  for (auto& para : parameters_) {
    if (para->isFullSize()) {
      para->randomize();
    }
  }
  LOG(INFO) << "Init parameters done.";
}

}  // namespace paddle