Skip to content

Commit 0d7047c

Browse files
committed
Merge branch 'develop' of https://github.com/PaddlePaddle/Paddle into port_pybind11
2 parents 4d4491e + bd87f67 commit 0d7047c

File tree

20 files changed

+495
-118
lines changed

20 files changed

+495
-118
lines changed

paddle/fluid/API.spec

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ paddle.fluid.Inferencer.__init__ ArgSpec(args=['self', 'infer_func', 'param_path
5555
paddle.fluid.Inferencer.infer ArgSpec(args=['self', 'inputs', 'return_numpy'], varargs=None, keywords=None, defaults=(True,))
5656
paddle.fluid.DistributeTranspiler.__init__ ArgSpec(args=['self', 'config'], varargs=None, keywords=None, defaults=(None,))
5757
paddle.fluid.DistributeTranspiler.get_pserver_program ArgSpec(args=['self', 'endpoint'], varargs=None, keywords=None, defaults=None)
58-
paddle.fluid.DistributeTranspiler.get_startup_program ArgSpec(args=['self', 'endpoint', 'pserver_program'], varargs=None, keywords=None, defaults=None)
58+
paddle.fluid.DistributeTranspiler.get_startup_program ArgSpec(args=['self', 'endpoint', 'pserver_program', 'startup_program'], varargs=None, keywords=None, defaults=(None,))
5959
paddle.fluid.DistributeTranspiler.get_trainer_program ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
6060
paddle.fluid.DistributeTranspiler.transpile ArgSpec(args=['self', 'trainer_id', 'program', 'pservers', 'trainers', 'sync_mode'], varargs=None, keywords=None, defaults=(None, '127.0.0.1:6174', 1, True))
6161
paddle.fluid.InferenceTranspiler.__init__
@@ -159,6 +159,7 @@ paddle.fluid.layers.relu ArgSpec(args=['x'], varargs=None, keywords=None, defaul
159159
paddle.fluid.layers.log ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)
160160
paddle.fluid.layers.crop ArgSpec(args=['x', 'shape', 'offsets', 'name'], varargs=None, keywords=None, defaults=(None, None, None))
161161
paddle.fluid.layers.rank_loss ArgSpec(args=['label', 'left', 'right', 'name'], varargs=None, keywords=None, defaults=(None,))
162+
paddle.fluid.layers.flatten ArgSpec(args=['x', 'axis', 'name'], varargs=None, keywords=None, defaults=(1, None))
162163
paddle.fluid.layers.data ArgSpec(args=['name', 'shape', 'append_batch_size', 'dtype', 'lod_level', 'type', 'stop_gradient'], varargs=None, keywords=None, defaults=(True, 'float32', 0, VarType.LOD_TENSOR, True))
163164
paddle.fluid.layers.open_recordio_file ArgSpec(args=['filename', 'shapes', 'lod_levels', 'dtypes', 'pass_num', 'for_parallel'], varargs=None, keywords=None, defaults=(1, True))
164165
paddle.fluid.layers.open_files ArgSpec(args=['filenames', 'shapes', 'lod_levels', 'dtypes', 'thread_num', 'buffer_size', 'pass_num', 'is_test'], varargs=None, keywords=None, defaults=(None, None, 1, None))
@@ -327,7 +328,7 @@ paddle.fluid.contrib.BeamSearchDecoder.update_array ArgSpec(args=['self', 'array
327328
paddle.fluid.contrib.memory_usage ArgSpec(args=['program', 'batch_size'], varargs=None, keywords=None, defaults=None)
328329
paddle.fluid.transpiler.DistributeTranspiler.__init__ ArgSpec(args=['self', 'config'], varargs=None, keywords=None, defaults=(None,))
329330
paddle.fluid.transpiler.DistributeTranspiler.get_pserver_program ArgSpec(args=['self', 'endpoint'], varargs=None, keywords=None, defaults=None)
330-
paddle.fluid.transpiler.DistributeTranspiler.get_startup_program ArgSpec(args=['self', 'endpoint', 'pserver_program'], varargs=None, keywords=None, defaults=None)
331+
paddle.fluid.transpiler.DistributeTranspiler.get_startup_program ArgSpec(args=['self', 'endpoint', 'pserver_program', 'startup_program'], varargs=None, keywords=None, defaults=(None,))
331332
paddle.fluid.transpiler.DistributeTranspiler.get_trainer_program ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
332333
paddle.fluid.transpiler.DistributeTranspiler.transpile ArgSpec(args=['self', 'trainer_id', 'program', 'pservers', 'trainers', 'sync_mode'], varargs=None, keywords=None, defaults=(None, '127.0.0.1:6174', 1, True))
333334
paddle.fluid.transpiler.InferenceTranspiler.__init__

paddle/fluid/framework/details/exception_holder.h

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#pragma once
1616

17+
#include "glog/logging.h"
1718
#include "paddle/fluid/platform/enforce.h"
1819

1920
namespace paddle {
@@ -22,55 +23,66 @@ namespace details {
2223

2324
class ExceptionHolder {
2425
public:
25-
void Catch(const platform::EnforceNotMet& exp) {
26-
std::lock_guard<std::mutex> lock(mu_);
27-
exception_.reset(new platform::EnforceNotMet(exp));
28-
type_ = kEnforceNotMet;
29-
}
30-
31-
void Catch(const platform::EOFException& exp) {
32-
std::lock_guard<std::mutex> lock(mu_);
33-
// EOFException will not cover up existing EnforceNotMet.
34-
if (exception_.get() == nullptr) {
35-
exception_.reset(new platform::EOFException(exp));
36-
type_ = kEOF;
26+
void Catch(std::exception_ptr eptr) {
27+
try {
28+
std::rethrow_exception(eptr);
29+
} catch (platform::EOFException exp) {
30+
Catch(exp);
31+
} catch (platform::EnforceNotMet exp) {
32+
Catch(exp);
33+
} catch (...) {
34+
LOG(FATAL) << "Unknown exception caught";
3735
}
3836
}
3937

40-
bool ExceptionCatched() const {
38+
bool IsCaught() const {
4139
std::lock_guard<std::mutex> lock(mu_);
4240
return exception_.get() != nullptr;
4341
}
4442

45-
void Throw() {
43+
void ReThrow() {
4644
std::lock_guard<std::mutex> lock(mu_);
4745
switch (type_) {
4846
case kNone:
4947
break;
5048
case kEnforceNotMet: {
5149
auto e = *static_cast<platform::EnforceNotMet*>(exception_.get());
5250
throw e;
53-
break;
5451
}
5552
case kEOF: {
5653
auto e = *static_cast<platform::EOFException*>(exception_.get());
5754
throw e;
58-
break;
5955
}
60-
default:
61-
LOG(FATAL) << "Unknown exception.";
6256
}
63-
exception_.reset();
64-
type_ = kNone;
57+
ClearImpl();
6558
}
6659

6760
void Clear() {
6861
std::lock_guard<std::mutex> lock(mu_);
62+
ClearImpl();
63+
}
64+
65+
private:
66+
void ClearImpl() {
6967
exception_.reset();
7068
type_ = kNone;
7169
}
7270

73-
private:
71+
void Catch(const platform::EnforceNotMet& exp) {
72+
std::lock_guard<std::mutex> lock(mu_);
73+
exception_.reset(new platform::EnforceNotMet(exp));
74+
type_ = kEnforceNotMet;
75+
}
76+
77+
void Catch(const platform::EOFException& exp) {
78+
std::lock_guard<std::mutex> lock(mu_);
79+
// EOFException will not cover up existing EnforceNotMet.
80+
if (exception_.get() == nullptr) {
81+
exception_.reset(new platform::EOFException(exp));
82+
type_ = kEOF;
83+
}
84+
}
85+
7486
enum ExceptionType { kNone, kEnforceNotMet, kEOF };
7587
ExceptionType type_{kNone};
7688

paddle/fluid/framework/details/threaded_ssa_graph_executor.cc

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ FeedFetchList ThreadedSSAGraphExecutor::Run(
107107
auto cur_ready_vars = ready_vars.PopAll(1, &timeout);
108108

109109
if (timeout) {
110-
if (exception_holder_.ExceptionCatched()) {
110+
if (exception_holder_.IsCaught()) {
111111
for (auto &run_op_future : run_op_futures_) {
112112
run_op_future.wait();
113113
}
114-
exception_holder_.Throw();
114+
exception_holder_.ReThrow();
115115
} else {
116116
continue;
117117
}
@@ -220,12 +220,8 @@ void ThreadedSSAGraphExecutor::RunOp(
220220
running_ops_--;
221221
ready_var_q->Extend(op->Outputs());
222222
VLOG(10) << op << " " << op->Name() << "Signal posted";
223-
} catch (platform::EOFException ex) {
224-
exception_holder_.Catch(ex);
225-
} catch (platform::EnforceNotMet ex) {
226-
exception_holder_.Catch(ex);
227223
} catch (...) {
228-
LOG(FATAL) << "Unknown exception catched";
224+
exception_holder_.Catch(std::current_exception());
229225
}
230226
};
231227
if (pool_) {

paddle/fluid/framework/ir/graph.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,38 @@ namespace paddle {
2828
namespace framework {
2929
namespace ir {
3030

31+
/*
32+
* The graph is a Directed Acyclic Single Static Assignment Graph.
33+
*
34+
* In more detail, the following properties must hold:
35+
*
36+
* The graph shouldn't contain cycle. Each node is a black-box to the graph
37+
* so the node itself could be a loop operator.
38+
*
39+
* Each Variable-type node has only one input (thus single static assignment).
40+
*
41+
* The output/input of operator is variable and the output/input of variable
42+
* is operator.
43+
*
44+
* The following data harzards in Program are addressed in the Graph:
45+
*
46+
* Write-After-Read
47+
* a = op1(x)
48+
* x = op2(b)
49+
* A control-dependency connection is created bettwen op1 and op2 such that
50+
* op1->op2, so as to ensure correct order.
51+
*
52+
* Write-After-Write
53+
* x = op1(a)
54+
* x = op2(b)
55+
* A control-dependency connection is created between op1 and op2 such that
56+
* op1->op2, so as to ensure correct order.
57+
*
58+
* Other properties currently hold, but is not enforced yet:
59+
*
60+
* Variable-type node (not control dep) with the same variable name share
61+
* the same underlying VarDesc.
62+
*/
3163
class Graph {
3264
public:
3365
explicit Graph(const ProgramDesc &program);

paddle/fluid/framework/ir/graph_test.cc

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class SumOpMaker : public OpProtoAndCheckerMaker {
3636
public:
3737
void Make() {
3838
AddInput("X", "").AsDuplicable();
39-
AddOutput("Out", "");
39+
AddOutput("Out", "").AsDuplicable();
4040
AddComment("");
4141
}
4242
};
@@ -59,11 +59,27 @@ class SumOpVarTypeInference : public VarTypeInference {
5959
block->Var(out_var_name)->SetType(default_var_type);
6060
}
6161
};
62+
63+
class DummyOpMaker : public OpProtoAndCheckerMaker {
64+
public:
65+
void Make() {
66+
AddInput("X", "").AsDuplicable();
67+
AddOutput("Out", "").AsDuplicable();
68+
AddComment("");
69+
}
70+
};
71+
72+
class DummyOpVarTypeInference : public VarTypeInference {
73+
public:
74+
void operator()(const OpDesc &op_desc, BlockDesc *block) const override {}
75+
};
6276
} // namespace framework
6377
} // namespace paddle
6478

6579
REGISTER_OPERATOR(sum, paddle::framework::NOP, paddle::framework::SumOpMaker,
6680
paddle::framework::SumOpVarTypeInference);
81+
REGISTER_OPERATOR(dummy, paddle::framework::NOP, paddle::framework::SumOpMaker,
82+
paddle::framework::SumOpVarTypeInference);
6783
REGISTER_OPERATOR(sum_without_infer_var_type, paddle::framework::NOP,
6884
paddle::framework::SumOpMaker);
6985

@@ -110,5 +126,83 @@ TEST(GraphTest, Basic) {
110126
}
111127
ASSERT_EQ(nodes.size(), 5);
112128
}
129+
130+
TEST(GraphTest, WriteAfterRead) {
131+
// void Test() {
132+
ProgramDesc prog;
133+
auto *op = prog.MutableBlock(0)->AppendOp();
134+
op->SetType("sum");
135+
op->SetInput("X", {"a"});
136+
op->SetOutput("Out", {"b"});
137+
op->SetAttr("op_role", 1);
138+
139+
op = prog.MutableBlock(0)->AppendOp();
140+
op->SetType("dummy");
141+
op->SetInput("X", {"c"});
142+
op->SetOutput("Out", {"a"});
143+
op->SetAttr("op_role", 1);
144+
145+
prog.MutableBlock(0)->Var("a")->SetType(proto::VarType::LOD_TENSOR);
146+
prog.MutableBlock(0)->Var("b")->SetType(proto::VarType::LOD_TENSOR);
147+
prog.MutableBlock(0)->Var("c")->SetType(proto::VarType::LOD_TENSOR);
148+
149+
std::unique_ptr<ir::Graph> g(new ir::Graph(prog));
150+
ir::Node *control_dep1 = nullptr;
151+
ir::Node *control_dep2 = nullptr;
152+
for (ir::Node *n : g->Nodes()) {
153+
if (n->Name() == "sum") {
154+
ASSERT_EQ(n->outputs[0]->Name(), "b");
155+
ASSERT_TRUE(ir::IsControlDepVar(*n->outputs[1]));
156+
control_dep1 = n->outputs[1];
157+
ASSERT_EQ(n->outputs.size(), 2);
158+
}
159+
if (n->Name() == "dummy") {
160+
ASSERT_EQ(n->inputs[0]->Name(), "c");
161+
ASSERT_TRUE(ir::IsControlDepVar(*n->inputs[1]));
162+
control_dep2 = n->inputs[1];
163+
ASSERT_EQ(n->inputs.size(), 2);
164+
}
165+
}
166+
ASSERT_EQ(control_dep1, control_dep2);
167+
}
168+
169+
TEST(GraphTest, WriteAfterWrite) {
170+
// void Test() {
171+
ProgramDesc prog;
172+
auto *op = prog.MutableBlock(0)->AppendOp();
173+
op->SetType("sum");
174+
op->SetInput("X", {"a"});
175+
op->SetOutput("Out", {"b"});
176+
op->SetAttr("op_role", 1);
177+
178+
op = prog.MutableBlock(0)->AppendOp();
179+
op->SetType("dummy");
180+
op->SetInput("X", {"c"});
181+
op->SetOutput("Out", {"b"});
182+
op->SetAttr("op_role", 1);
183+
184+
prog.MutableBlock(0)->Var("a")->SetType(proto::VarType::LOD_TENSOR);
185+
prog.MutableBlock(0)->Var("b")->SetType(proto::VarType::LOD_TENSOR);
186+
prog.MutableBlock(0)->Var("c")->SetType(proto::VarType::LOD_TENSOR);
187+
188+
std::unique_ptr<ir::Graph> g(new ir::Graph(prog));
189+
ir::Node *control_dep1 = nullptr;
190+
ir::Node *control_dep2 = nullptr;
191+
for (ir::Node *n : g->Nodes()) {
192+
if (n->Name() == "sum") {
193+
ASSERT_EQ(n->outputs[0]->Name(), "b");
194+
ASSERT_TRUE(ir::IsControlDepVar(*n->outputs[1]));
195+
ASSERT_EQ(n->outputs.size(), 2);
196+
control_dep1 = n->outputs[1];
197+
}
198+
if (n->Name() == "dummy") {
199+
ASSERT_EQ(n->inputs[0]->Name(), "c");
200+
ASSERT_TRUE(ir::IsControlDepVar(*n->inputs[1]));
201+
control_dep2 = n->inputs[1];
202+
ASSERT_EQ(n->inputs.size(), 2);
203+
ASSERT_EQ(control_dep1, control_dep2);
204+
}
205+
}
206+
}
113207
} // namespace framework
114208
} // namespace paddle

paddle/fluid/framework/tensor.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,5 +112,6 @@ Tensor& Tensor::Resize(const DDim& dims) {
112112
const DDim& Tensor::dims() const { return dims_; }
113113

114114
int64_t Tensor::numel() const { return product(dims_); }
115+
115116
} // namespace framework
116117
} // namespace paddle

paddle/fluid/framework/tensor_impl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ inline T* Tensor::mutable_data(platform::Place place) {
5959
}
6060

6161
inline Tensor ReshapeToMatrix(const Tensor& src, int num_col_dims) {
62+
int rank = src.dims().size();
63+
PADDLE_ENFORCE_GE(
64+
rank, 2,
65+
"'ReshapeToMatrix()' is only used for flatten high rank "
66+
"tensors to matrixs. Can not be used in reshaping vectors.");
67+
if (rank == 2) {
68+
return src;
69+
}
6270
Tensor res;
6371
res.ShareDataWith(src);
6472
res.Resize(flatten_to_2d(src.dims(), num_col_dims));

paddle/fluid/inference/api/api_impl.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ limitations under the License. */
2222
#include <vector>
2323

2424
#include "paddle/fluid/inference/api/api_impl.h"
25+
#include "paddle/fluid/platform/profiler.h"
26+
27+
DEFINE_bool(profile, false, "Turn on profiler for fluid");
2528

2629
namespace paddle {
2730
namespace {
@@ -58,6 +61,15 @@ bool NativePaddlePredictor::Init(
5861
std::shared_ptr<framework::Scope> parent_scope) {
5962
VLOG(3) << "Predictor::init()";
6063

64+
if (FLAGS_profile) {
65+
LOG(WARNING) << "Profiler is actived, might affect the performance";
66+
LOG(INFO) << "You can turn off by set gflags '-profile false'";
67+
68+
auto tracking_device = config_.use_gpu ? platform::ProfilerState::kAll
69+
: platform::ProfilerState::kCPU;
70+
platform::EnableProfiler(tracking_device);
71+
}
72+
6173
if (config_.use_gpu) {
6274
place_ = paddle::platform::CUDAPlace(config_.device);
6375
} else {
@@ -102,6 +114,10 @@ bool NativePaddlePredictor::Init(
102114
}
103115

104116
NativePaddlePredictor::~NativePaddlePredictor() {
117+
if (FLAGS_profile) {
118+
platform::DisableProfiler(platform::EventSortingKey::kTotal,
119+
"./profile.log");
120+
}
105121
if (sub_scope_) {
106122
scope_->DeleteScope(sub_scope_);
107123
}
-16 KB
Binary file not shown.

0 commit comments

Comments
 (0)