Skip to content

Commit 6b9ccd9

Browse files
committed
Merge branch 'develop' into nlp_multi_thread
2 parents 20b40cb + 7622234 commit 6b9ccd9

File tree

6 files changed

+227
-32
lines changed

6 files changed

+227
-32
lines changed
Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,57 @@
1-
function (inference_download_and_uncompress install_dir url)
2-
get_filename_component(filename ${url} NAME)
3-
message(STATUS "Download inference test stuff ${filename} from ${url}")
1+
set(INFERENCE_URL "http://paddle-inference-dist.bj.bcebos.com")
2+
set(INFERENCE_DEMO_INSTALL_DIR "${THIRD_PARTY_PATH}/inference_demo")
3+
set(INFERENCE_EXTRA_DEPS paddle_inference_api paddle_fluid_api ir_pass_manager analysis_predictor)
4+
function (inference_download_and_uncompress install_dir filename)
5+
message(STATUS "Download inference test stuff from ${INFERENCE_URL}/${filename}")
46
execute_process(COMMAND bash -c "mkdir -p ${install_dir}")
5-
execute_process(COMMAND bash -c "cd ${install_dir} && wget -q ${url}")
7+
execute_process(COMMAND bash -c "cd ${install_dir} && wget -q ${INFERENCE_URL}/${filename}")
68
execute_process(COMMAND bash -c "cd ${install_dir} && tar xzf ${filename}")
79
message(STATUS "finish downloading ${filename}")
810
endfunction(inference_download_and_uncompress)
911

10-
function(download_model_and_data install_dir model_url data_url)
12+
function(download_model_and_data install_dir model_name data_name)
1113
if (NOT EXISTS ${install_dir} AND WITH_INFERENCE)
12-
inference_download_and_uncompress(${install_dir} ${model_url})
13-
inference_download_and_uncompress(${install_dir} ${data_url})
14+
inference_download_and_uncompress(${install_dir} ${model_name})
15+
inference_download_and_uncompress(${install_dir} ${data_name})
1416
endif()
1517
endfunction()
1618

1719
# RNN1
18-
set(RNN1_MODEL_URL "http://paddle-inference-dist.bj.bcebos.com/rnn1%2Fmodel.tar.gz")
19-
set(RNN1_DATA_URL "http://paddle-inference-dist.bj.bcebos.com/rnn1%2Fdata.txt.tar.gz")
20-
set(RNN1_INSTALL_DIR "${THIRD_PARTY_PATH}/inference_demo/rnn1")
21-
download_model_and_data(${RNN1_INSTALL_DIR} ${RNN1_MODEL_URL} ${RNN1_DATA_URL})
22-
inference_analysis_test(test_analyzer_rnn1 SRCS analyzer_rnn1_tester.cc
23-
EXTRA_DEPS paddle_inference_api paddle_fluid_api ir_pass_manager analysis_predictor
20+
set(RNN1_INSTALL_DIR "${INFERENCE_DEMO_INSTALL_DIR}/rnn1")
21+
download_model_and_data(${RNN1_INSTALL_DIR} "rnn1%2Fmodel.tar.gz" "rnn1%2Fdata.txt.tar.gz")
22+
inference_analysis_test(test_analyzer_rnn1 SRCS analyzer_rnn1_tester.cc
23+
EXTRA_DEPS ${INFERENCE_EXTRA_DEPS}
2424
ARGS --infer_model=${RNN1_INSTALL_DIR}/model
2525
--infer_data=${RNN1_INSTALL_DIR}/data.txt)
2626

27+
# RNN2
28+
set(RNN2_INSTALL_DIR "${INFERENCE_DEMO_INSTALL_DIR}/rnn2")
29+
download_model_and_data(${RNN2_INSTALL_DIR} "rnn2_model.tar.gz" "rnn2_data.txt.tar.gz")
30+
inference_analysis_test(test_analyzer_rnn2 SRCS analyzer_rnn2_tester.cc
31+
EXTRA_DEPS ${INFERENCE_EXTRA_DEPS}
32+
ARGS --infer_model=${RNN2_INSTALL_DIR}/model
33+
--infer_data=${RNN2_INSTALL_DIR}/data.txt)
34+
2735
# chinese_ner
28-
set(CHINESE_NER_MODEL_URL "http://paddle-inference-dist.bj.bcebos.com/chinese_ner_model.tar.gz")
29-
set(CHINESE_NER_DATA_URL "http://paddle-inference-dist.bj.bcebos.com/chinese_ner-data.txt.tar.gz")
30-
set(CHINESE_NER_INSTALL_DIR "${THIRD_PARTY_PATH}/inference_demo/chinese_ner")
31-
download_model_and_data(${CHINESE_NER_INSTALL_DIR} ${CHINESE_NER_MODEL_URL} ${CHINESE_NER_DATA_URL})
36+
set(CHINESE_NER_INSTALL_DIR "${INFERENCE_DEMO_INSTALL_DIR}/chinese_ner")
37+
download_model_and_data(${CHINESE_NER_INSTALL_DIR} "chinese_ner_model.tar.gz" "chinese_ner-data.txt.tar.gz")
3238
inference_analysis_test(test_analyzer_ner SRCS analyzer_ner_tester.cc
33-
EXTRA_DEPS paddle_inference_api paddle_fluid_api analysis_predictor
39+
EXTRA_DEPS ${INFERENCE_EXTRA_DEPS}
3440
ARGS --infer_model=${CHINESE_NER_INSTALL_DIR}/model
3541
--infer_data=${CHINESE_NER_INSTALL_DIR}/data.txt)
3642

3743
# lac
38-
set(LAC_MODEL_URL "http://paddle-inference-dist.bj.bcebos.com/lac_model.tar.gz")
39-
set(LAC_DATA_URL "http://paddle-inference-dist.bj.bcebos.com/lac_data.txt.tar.gz")
40-
set(LAC_INSTALL_DIR "${THIRD_PARTY_PATH}/inference_demo/lac")
41-
download_model_and_data(${LAC_INSTALL_DIR} ${LAC_MODEL_URL} ${LAC_DATA_URL})
44+
set(LAC_INSTALL_DIR "${INFERENCE_DEMO_INSTALL_DIR}/lac")
45+
download_model_and_data(${LAC_INSTALL_DIR} "lac_model.tar.gz" "lac_data.txt.tar.gz")
4246
inference_analysis_test(test_analyzer_lac SRCS analyzer_lac_tester.cc
43-
EXTRA_DEPS paddle_inference_api paddle_fluid_api ir_pass_manager analysis_predictor
47+
EXTRA_DEPS ${INFERENCE_EXTRA_DEPS}
4448
ARGS --infer_model=${LAC_INSTALL_DIR}/model
4549
--infer_data=${LAC_INSTALL_DIR}/data.txt)
4650

4751
# text_classification
48-
set(TEXT_CLASSIFICATION_MODEL_URL "http://paddle-inference-dist.bj.bcebos.com/text-classification-Senta.tar.gz")
49-
set(TEXT_CLASSIFICATION_DATA_URL "http://paddle-inference-dist.bj.bcebos.com/text_classification_data.txt.tar.gz")
50-
set(TEXT_CLASSIFICATION_INSTALL_DIR "${THIRD_PARTY_PATH}/inference_demo/text_classification")
51-
download_model_and_data(${TEXT_CLASSIFICATION_INSTALL_DIR} ${TEXT_CLASSIFICATION_MODEL_URL} ${TEXT_CLASSIFICATION_DATA_URL})
52+
set(TEXT_CLASSIFICATION_INSTALL_DIR "${INFERENCE_DEMO_INSTALL_DIR}/text_classification")
53+
download_model_and_data(${TEXT_CLASSIFICATION_INSTALL_DIR} "text-classification-Senta.tar.gz" "text_classification_data.txt.tar.gz")
5254
inference_analysis_test(test_analyzer_text_classification SRCS analyzer_text_classification_tester.cc
53-
EXTRA_DEPS paddle_inference_api paddle_fluid_api analysis_predictor
55+
EXTRA_DEPS ${INFERENCE_EXTRA_DEPS}
5456
ARGS --infer_model=${TEXT_CLASSIFICATION_INSTALL_DIR}/text-classification-Senta
5557
--infer_data=${TEXT_CLASSIFICATION_INSTALL_DIR}/data.txt)
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include "paddle/fluid/inference/analysis/analyzer.h"
16+
17+
#include <google/protobuf/text_format.h>
18+
#include <gtest/gtest.h>
19+
#include <thread> // NOLINT
20+
#include "paddle/fluid/framework/ir/fuse_pass_base.h"
21+
#include "paddle/fluid/framework/ir/pass.h"
22+
#include "paddle/fluid/inference/analysis/ut_helper.h"
23+
#include "paddle/fluid/inference/api/analysis_predictor.h"
24+
#include "paddle/fluid/inference/api/helper.h"
25+
#include "paddle/fluid/inference/api/paddle_inference_api.h"
26+
#include "paddle/fluid/inference/api/paddle_inference_pass.h"
27+
28+
DEFINE_string(infer_model, "", "model path");
29+
DEFINE_string(infer_data, "", "data path");
30+
DEFINE_int32(batch_size, 1, "batch size.");
31+
DEFINE_int32(repeat, 1, "Running the inference program repeat times.");
32+
DEFINE_int32(num_threads, 1, "Running the inference program in multi-threads.");
33+
34+
namespace paddle {
35+
namespace inference {
36+
37+
using namespace framework; // NOLINT
38+
39+
struct DataRecord {
40+
std::vector<std::vector<std::vector<float>>> link_step_data_all;
41+
std::vector<size_t> lod;
42+
std::vector<std::vector<float>> rnn_link_data;
43+
std::vector<float> result_data;
44+
size_t batch_iter{0};
45+
size_t batch_size{1};
46+
DataRecord() = default;
47+
explicit DataRecord(const std::string &path, int batch_size = 1)
48+
: batch_size(batch_size) {
49+
Load(path);
50+
}
51+
DataRecord NextBatch() {
52+
DataRecord data;
53+
size_t batch_end = batch_iter + batch_size;
54+
// NOTE skip the final batch, if no enough data is provided.
55+
if (batch_end <= link_step_data_all.size()) {
56+
data.link_step_data_all.assign(link_step_data_all.begin() + batch_iter,
57+
link_step_data_all.begin() + batch_end);
58+
// Prepare LoDs
59+
data.lod.push_back(0);
60+
CHECK(!data.link_step_data_all.empty()) << "empty";
61+
for (size_t j = 0; j < data.link_step_data_all.size(); j++) {
62+
for (const auto &d : data.link_step_data_all[j]) {
63+
data.rnn_link_data.push_back(d);
64+
// calculate lod
65+
data.lod.push_back(data.lod.back() + 11);
66+
}
67+
}
68+
}
69+
batch_iter += batch_size;
70+
return data;
71+
}
72+
void Load(const std::string &path) {
73+
std::ifstream file(path);
74+
std::string line;
75+
int num_lines = 0;
76+
while (std::getline(file, line)) {
77+
num_lines++;
78+
std::vector<std::string> data;
79+
split(line, ':', &data);
80+
if (num_lines % 2) { // feature
81+
std::vector<std::string> feature_data;
82+
split(data[1], ' ', &feature_data);
83+
std::vector<std::vector<float>> link_step_data;
84+
int feature_count = 1;
85+
std::vector<float> feature;
86+
for (auto &step_data : feature_data) {
87+
std::vector<float> tmp;
88+
split_to_float(step_data, ',', &tmp);
89+
feature.insert(feature.end(), tmp.begin(), tmp.end());
90+
if (feature_count % 11 == 0) { // each sample has 11 features
91+
link_step_data.push_back(feature);
92+
feature.clear();
93+
}
94+
feature_count++;
95+
}
96+
link_step_data_all.push_back(std::move(link_step_data));
97+
} else { // result
98+
std::vector<float> tmp;
99+
split_to_float(data[1], ',', &tmp);
100+
result_data.insert(result_data.end(), tmp.begin(), tmp.end());
101+
}
102+
}
103+
}
104+
};
105+
void PrepareInputs(std::vector<PaddleTensor> *input_slots, DataRecord *data,
106+
int batch_size) {
107+
PaddleTensor feed_tensor;
108+
feed_tensor.name = "feed";
109+
auto one_batch = data->NextBatch();
110+
int token_size = one_batch.rnn_link_data.size();
111+
// each token has 11 features, each feature's dim is 54.
112+
std::vector<int> rnn_link_data_shape({token_size * 11, 54});
113+
feed_tensor.shape = rnn_link_data_shape;
114+
feed_tensor.lod.assign({one_batch.lod});
115+
feed_tensor.dtype = PaddleDType::FLOAT32;
116+
TensorAssignData<float>(&feed_tensor, one_batch.rnn_link_data);
117+
// Set inputs.
118+
input_slots->assign({feed_tensor});
119+
}
120+
121+
void CompareResult(const std::vector<PaddleTensor> &outputs,
122+
const std::vector<float> &base_result) {
123+
PADDLE_ENFORCE_GT(outputs.size(), 0);
124+
for (size_t i = 0; i < outputs.size(); i++) {
125+
auto &out = outputs[i];
126+
size_t size = std::accumulate(out.shape.begin(), out.shape.end(), 1,
127+
[](int a, int b) { return a * b; });
128+
PADDLE_ENFORCE_GT(size, 0);
129+
float *data = static_cast<float *>(out.data.data());
130+
for (size_t i = 0; i < size; i++) {
131+
EXPECT_NEAR(data[i], base_result[i], 1e-3);
132+
}
133+
}
134+
}
135+
// Test with a really complicate model.
136+
void TestRNN2Prediction() {
137+
AnalysisConfig config;
138+
config.prog_file = FLAGS_infer_model + "/__model__";
139+
config.param_file = FLAGS_infer_model + "/param";
140+
config.use_gpu = false;
141+
config.device = 0;
142+
config.specify_input_name = true;
143+
config.enable_ir_optim = true;
144+
PADDLE_ENFORCE(config.ir_mode ==
145+
AnalysisConfig::IrPassMode::kExclude); // default
146+
147+
int batch_size = FLAGS_batch_size;
148+
int num_times = FLAGS_repeat;
149+
150+
auto base_predictor =
151+
CreatePaddlePredictor<NativeConfig, PaddleEngineKind::kNative>(config);
152+
auto predictor =
153+
CreatePaddlePredictor<AnalysisConfig, PaddleEngineKind::kAnalysis>(
154+
config);
155+
std::vector<PaddleTensor> input_slots;
156+
DataRecord data(FLAGS_infer_data, batch_size);
157+
PrepareInputs(&input_slots, &data, batch_size);
158+
std::vector<PaddleTensor> outputs, base_outputs;
159+
160+
Timer timer1;
161+
timer1.tic();
162+
for (int i = 0; i < num_times; i++) {
163+
base_predictor->Run(input_slots, &base_outputs);
164+
}
165+
PrintTime(batch_size, num_times, 1, 0, timer1.toc() / num_times);
166+
167+
Timer timer2;
168+
timer2.tic();
169+
for (int i = 0; i < num_times; i++) {
170+
predictor->Run(input_slots, &outputs);
171+
}
172+
PrintTime(batch_size, num_times, 1, 0, timer2.toc() / num_times);
173+
174+
CompareResult(base_outputs, data.result_data);
175+
CompareResult(outputs, data.result_data);
176+
}
177+
178+
TEST(Analyzer, rnn2) { TestRNN2Prediction(); }
179+
180+
} // namespace inference
181+
} // namespace paddle

paddle/fluid/operators/distributed/grpc_client.cc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,12 +290,18 @@ void GRPCClient::Proceed() {
290290
c->Finish(false);
291291
}
292292

293-
delete c;
293+
bool notify = false;
294294
{
295295
std::lock_guard<std::mutex> lk(sync_mutex_);
296296
req_count_--;
297+
notify = (req_count_ <= 0 || !c->status_.ok());
298+
}
299+
300+
delete c;
301+
302+
if (notify) {
303+
sync_cond_.notify_all();
297304
}
298-
sync_cond_.notify_all();
299305
}
300306
VLOG(3) << "GRPCClient Proceed end";
301307
}

python/paddle/fluid/tests/unittests/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ list(REMOVE_ITEM TEST_OPS test_cond_op) # FIXME(qijun): https://github.com/Paddl
2828

2929
list(REMOVE_ITEM TEST_OPS op_test) # op_test is a helper python file, not a test
3030
list(REMOVE_ITEM TEST_OPS decorators) # decorators is a helper python file, not a test
31+
if(APPLE)
32+
# this op is not support on mac
33+
list(REMOVE_ITEM TEST_OPS test_fusion_seqexpand_concat_fc_op)
34+
endif()
3135

3236
function(py_test_modules TARGET_NAME)
3337
if(WITH_TESTING)

python/paddle/fluid/tests/unittests/test_data_balance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def setUp(self):
8484
self.data_file_name = './data_balance_test.recordio'
8585
self.lod_data_file_name = './data_balance_with_lod_test.recordio'
8686
self.total_ins_num = 50
87-
self.batch_size = 10
87+
self.batch_size = 12
8888
self.prepare_data()
8989
self.prepare_lod_data()
9090

python/paddle/fluid/tests/unittests/test_reader_reset.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414

1515
from __future__ import print_function
16-
16+
import os
1717
import paddle.fluid as fluid
1818
import paddle
1919
import numpy as np
@@ -41,6 +41,8 @@ def fake_data_generator():
4141
self.data_file_name, reader, feeder)
4242

4343
def setUp(self):
44+
# set parallel threads to fit 20 batches in line 49
45+
os.environ['CPU_NUM'] = str(20)
4446
self.use_cuda = fluid.core.is_compiled_with_cuda()
4547
self.data_file_name = './reader_reset_test.recordio'
4648
self.ins_shape = [3]

0 commit comments

Comments
 (0)