parent
f4678331f1
commit
5b1f66fe97
@ -1,174 +0,0 @@
|
||||
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
|
||||
|
||||
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 <paddle/utils/PythonUtil.h>
|
||||
|
||||
#include "paddle/trainer/Trainer.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
DECLARE_string(config);
|
||||
DECLARE_string(config_args);
|
||||
DEFINE_string(merger,
|
||||
"./paddle_merge_model",
|
||||
"path to paddle_merge_model binary");
|
||||
|
||||
using namespace paddle; // NOLINT
|
||||
using namespace std; // NOLINT
|
||||
|
||||
static const string& configFile = "trainer/tests/sample_trainer_config.conf";
|
||||
static const string& mergedModelFile = "./test_model_file";
|
||||
static const string& modelDir = "./test_model_dir";
|
||||
|
||||
void checkBuffer(real* vec1, real* vec2, size_t len) {
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
EXPECT_EQ(vec1[i], vec2[i]) << "vec1:" << vec1[i] << " vec2:" << vec2[i];
|
||||
}
|
||||
}
|
||||
|
||||
void checkParameters(vector<ParameterPtr> A, vector<ParameterPtr> B) {
|
||||
CHECK_EQ(B.size(), A.size()) << "parameter size not equal";
|
||||
for (size_t i = 0; i < A.size(); i++) {
|
||||
auto vec1 = A[i]->getBuf(PARAMETER_VALUE);
|
||||
auto vec2 = B[i]->getBuf(PARAMETER_VALUE);
|
||||
CHECK_EQ(vec1->useGpu_, vec2->useGpu_) << "use gpu not equal";
|
||||
CHECK_EQ(vec1->getSize(), vec2->getSize()) << "size not equal";
|
||||
|
||||
if (vec1->useGpu_ == false) {
|
||||
checkBuffer(vec1->getData(), vec2->getData(), vec1->getSize());
|
||||
} else {
|
||||
VectorPtr cpuVec1 = Vector::create(vec1->getSize(), false);
|
||||
VectorPtr cpuVec2 = Vector::create(vec2->getSize(), false);
|
||||
cpuVec1->copyFrom(*vec1, HPPL_STREAM_DEFAULT);
|
||||
cpuVec2->copyFrom(*vec2, HPPL_STREAM_DEFAULT);
|
||||
hl_stream_synchronize(HPPL_STREAM_DEFAULT);
|
||||
checkBuffer(cpuVec1->getData(), cpuVec2->getData(), cpuVec1->getSize());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(GradientMachine, create) {
|
||||
#ifdef PADDLE_ONLY_CPU
|
||||
FLAGS_use_gpu = false;
|
||||
#endif
|
||||
mkDir(modelDir.c_str());
|
||||
FLAGS_config = configFile;
|
||||
FLAGS_config_args = "with_cost=False";
|
||||
auto config = TrainerConfigHelper::createFromFlagConfig();
|
||||
|
||||
// save model to directory
|
||||
unique_ptr<GradientMachine> gradientMachine1(
|
||||
GradientMachine::create(*config));
|
||||
gradientMachine1->saveParameters(modelDir);
|
||||
Trainer trainer;
|
||||
trainer.init(config);
|
||||
ParameterUtil* paramUtil = trainer.getParameterUtilPtr();
|
||||
if (paramUtil != NULL) {
|
||||
paramUtil->saveConfigWithPath(modelDir);
|
||||
}
|
||||
|
||||
// create a different GradientMachine
|
||||
unique_ptr<GradientMachine> gradientMachine2(
|
||||
GradientMachine::create(*config));
|
||||
gradientMachine2->randParameters();
|
||||
|
||||
// merge config and model to one file
|
||||
string cmd = FLAGS_merger + " --model_dir=" + modelDir +
|
||||
" --config_args=with_cost=False" + " --model_file=" +
|
||||
mergedModelFile;
|
||||
LOG(INFO) << cmd;
|
||||
int ret = system(cmd.c_str());
|
||||
EXPECT_EQ(0, ret);
|
||||
if (ret) {
|
||||
return;
|
||||
}
|
||||
|
||||
// create GradientMachine from the merged model
|
||||
DataConfig dataConfig;
|
||||
unique_ptr<GradientMachine> gradientMachine3(
|
||||
GradientMachine::create(mergedModelFile, &dataConfig));
|
||||
CHECK(gradientMachine3);
|
||||
EXPECT_EQ(dataConfig.type(), "simple");
|
||||
EXPECT_EQ(dataConfig.feat_dim(), 3);
|
||||
|
||||
// compare the parameters of GradientMachine and GradientMachine3
|
||||
std::vector<ParameterPtr> paraMachine1 = gradientMachine1->getParameters();
|
||||
std::vector<ParameterPtr> paraMachine3 = gradientMachine3->getParameters();
|
||||
checkParameters(paraMachine1, paraMachine3);
|
||||
|
||||
// Test that the GradientMachine created from the merged model
|
||||
// is same as the orginnal one.
|
||||
vector<Argument> inArgs(1);
|
||||
vector<Argument> outArgs;
|
||||
|
||||
int inputDim = 3;
|
||||
int numSamples = 2;
|
||||
CpuMatrix cpuInput(numSamples, inputDim);
|
||||
for (int i = 0; i < numSamples; ++i) {
|
||||
for (int j = 0; j < inputDim; ++j) {
|
||||
cpuInput.getData()[i * inputDim + j] =
|
||||
rand() / (real)RAND_MAX; // NOLINT TODO(yuyang): use rand_r
|
||||
}
|
||||
}
|
||||
MatrixPtr input = Matrix::create(numSamples,
|
||||
inputDim,
|
||||
/* trans */ false,
|
||||
FLAGS_use_gpu);
|
||||
input->copyFrom(cpuInput);
|
||||
inArgs[0].value = input;
|
||||
gradientMachine1->forward(inArgs, &outArgs, PASS_TEST);
|
||||
EXPECT_EQ((size_t)1, outArgs.size());
|
||||
|
||||
vector<Argument> outArgs2;
|
||||
gradientMachine2->forward(inArgs, &outArgs2, PASS_TEST);
|
||||
CpuMatrix out1(outArgs[0].value->getHeight(), outArgs[0].value->getWidth());
|
||||
CpuMatrix out2(outArgs2[0].value->getHeight(), outArgs2[0].value->getWidth());
|
||||
out1.copyFrom(*outArgs[0].value);
|
||||
out2.copyFrom(*outArgs2[0].value);
|
||||
for (size_t i = 0; i < out1.getHeight() * out1.getWidth(); i++) {
|
||||
EXPECT_NE(out1.getData()[i], out2.getData()[i]);
|
||||
}
|
||||
|
||||
gradientMachine3->forward(inArgs, &outArgs2, PASS_TEST);
|
||||
out2.copyFrom(*outArgs2[0].value);
|
||||
checkBuffer(
|
||||
out1.getData(), out2.getData(), out2.getHeight() * out2.getWidth());
|
||||
|
||||
cmd = " rm -rf " + modelDir + "/*";
|
||||
LOG(INFO) << "cmd " << cmd;
|
||||
ret = system(cmd.c_str());
|
||||
EXPECT_EQ(0, ret);
|
||||
if (ret) {
|
||||
return;
|
||||
}
|
||||
|
||||
cmd = " rm -rf " + mergedModelFile;
|
||||
LOG(INFO) << "cmd " << cmd;
|
||||
ret = system(cmd.c_str());
|
||||
EXPECT_EQ(0, ret);
|
||||
if (ret) {
|
||||
return;
|
||||
}
|
||||
|
||||
// clean up
|
||||
rmDir(modelDir.c_str());
|
||||
remove(mergedModelFile.c_str());
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
initMain(argc, argv);
|
||||
initPython(argc, argv);
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
Loading…
Reference in new issue