Skip to content

Commit 4c283d8

Browse files
committed
Merge branch 'develop' into all_data
2 parents fa5036a + 9f2ccf5 commit 4c283d8

40 files changed

+1322
-648
lines changed

doc/fluid/new_docs/user_guides/howto/debug/visualdl.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ visualDL --logdir=scratch_log --port=8080
104104
105105
# 访问 http://127.0.0.1:8080
106106
```
107+
如果出现`TypeError: __init__() got an unexpected keyword argument 'file'`, 是因为protobuf不是3.5以上,运行`pip install --upgrade protobuf`就能解决。
107108

108109
如果在虚拟环境下仍然遇到安装问题,请尝试以下方法。
109110

paddle/fluid/API.spec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ paddle.fluid.Executor.run ArgSpec(args=['self', 'program', 'feed', 'fetch_list',
4343
paddle.fluid.global_scope ArgSpec(args=[], varargs=None, keywords=None, defaults=None)
4444
paddle.fluid.scope_guard ArgSpec(args=[], varargs='args', keywords='kwds', defaults=None)
4545
paddle.fluid.Trainer.__init__ ArgSpec(args=['self', 'train_func', 'optimizer_func', 'param_path', 'place', 'parallel', 'checkpoint_config'], varargs=None, keywords=None, defaults=(None, None, False, None))
46+
paddle.fluid.Trainer.save_inference_model ArgSpec(args=['self', 'param_path', 'feeded_var_names', 'target_var_indexes'], varargs=None, keywords=None, defaults=None)
4647
paddle.fluid.Trainer.save_params ArgSpec(args=['self', 'param_path'], varargs=None, keywords=None, defaults=None)
4748
paddle.fluid.Trainer.stop ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
4849
paddle.fluid.Trainer.test ArgSpec(args=['self', 'reader', 'feed_order'], varargs=None, keywords=None, defaults=None)
@@ -376,7 +377,7 @@ paddle.fluid.optimizer.DecayedAdagradOptimizer.__init__ ArgSpec(args=['self', 'l
376377
paddle.fluid.optimizer.DecayedAdagradOptimizer.minimize ArgSpec(args=['self', 'loss', 'startup_program', 'parameter_list', 'no_grad_set'], varargs=None, keywords=None, defaults=(None, None, None))
377378
paddle.fluid.optimizer.FtrlOptimizer.__init__ ArgSpec(args=['self', 'learning_rate', 'l1', 'l2', 'lr_power'], varargs=None, keywords='kwargs', defaults=(0.0, 0.0, -0.5))
378379
paddle.fluid.optimizer.FtrlOptimizer.minimize ArgSpec(args=['self', 'loss', 'startup_program', 'parameter_list', 'no_grad_set'], varargs=None, keywords=None, defaults=(None, None, None))
379-
paddle.fluid.optimizer.RMSPropOptimizer.__init__ ArgSpec(args=['self', 'learning_rate', 'rho', 'epsilon', 'momentum'], varargs=None, keywords='kwargs', defaults=(0.95, 1e-06, 0.0))
380+
paddle.fluid.optimizer.RMSPropOptimizer.__init__ ArgSpec(args=['self', 'learning_rate', 'rho', 'epsilon', 'momentum', 'centered'], varargs=None, keywords='kwargs', defaults=(0.95, 1e-06, 0.0, False))
380381
paddle.fluid.optimizer.RMSPropOptimizer.minimize ArgSpec(args=['self', 'loss', 'startup_program', 'parameter_list', 'no_grad_set'], varargs=None, keywords=None, defaults=(None, None, None))
381382
paddle.fluid.optimizer.AdadeltaOptimizer.__init__ ArgSpec(args=['self', 'learning_rate', 'epsilon', 'rho'], varargs=None, keywords='kwargs', defaults=(1e-06, 0.95))
382383
paddle.fluid.optimizer.AdadeltaOptimizer.minimize ArgSpec(args=['self', 'loss', 'startup_program', 'parameter_list', 'no_grad_set'], varargs=None, keywords=None, defaults=(None, None, None))

paddle/fluid/framework/ir/fc_lstm_fuse_pass.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14+
1415
#include "paddle/fluid/framework/ir/fc_lstm_fuse_pass.h"
1516
#include <string>
1617
#include "paddle/fluid/framework/lod_tensor.h"

paddle/fluid/framework/ir/graph_viz_pass.cc

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,37 @@ std::unique_ptr<ir::Graph> GraphVizPass::ApplyImpl(
5050

5151
Dot dot;
5252

53-
std::vector<Dot::Attr> op_attrs({Dot::Attr("style", "filled"),
54-
Dot::Attr("shape", "box"),
55-
Dot::Attr("fillcolor", "red")});
56-
std::vector<Dot::Attr> var_attrs({Dot::Attr("style", "filled,rounded"),
57-
// Dot::Attr("shape", "diamond"),
58-
Dot::Attr("fillcolor", "yellow")});
59-
60-
std::vector<Dot::Attr> marked_op_attrs({Dot::Attr("style", "filled"),
61-
Dot::Attr("shape", "box"),
62-
Dot::Attr("fillcolor", "lightgray")});
63-
std::vector<Dot::Attr> marked_var_attrs(
64-
{Dot::Attr("style", "filled,rounded"),
65-
// Dot::Attr("shape", "diamond"),
66-
Dot::Attr("fillcolor", "lightgray")});
53+
const std::vector<Dot::Attr> op_attrs({
54+
Dot::Attr("style", "rounded,filled,bold"), //
55+
Dot::Attr("shape", "box"), //
56+
Dot::Attr("color", "#303A3A"), //
57+
Dot::Attr("fontcolor", "#ffffff"), //
58+
Dot::Attr("width", "1.3"), //
59+
Dot::Attr("height", "0.84"), //
60+
Dot::Attr("fontname", "Arial"), //
61+
});
62+
const std::vector<Dot::Attr> arg_attrs({
63+
Dot::Attr("shape", "box"), //
64+
Dot::Attr("style", "rounded,filled,bold"), //
65+
Dot::Attr("fontname", "Arial"), //
66+
Dot::Attr("fillcolor", "#999999"), //
67+
Dot::Attr("color", "#dddddd"), //
68+
});
69+
70+
const std::vector<Dot::Attr> param_attrs({
71+
Dot::Attr("shape", "box"), //
72+
Dot::Attr("style", "rounded,filled,bold"), //
73+
Dot::Attr("fontname", "Arial"), //
74+
Dot::Attr("color", "#148b97"), //
75+
Dot::Attr("fontcolor", "#ffffff"), //
76+
});
77+
78+
const std::vector<Dot::Attr> marked_op_attrs(
79+
{Dot::Attr("style", "rounded,filled,bold"), Dot::Attr("shape", "box"),
80+
Dot::Attr("fillcolor", "yellow")});
81+
const std::vector<Dot::Attr> marked_var_attrs(
82+
{Dot::Attr("style", "filled,rounded"), Dot::Attr("shape", "box"),
83+
Dot::Attr("fillcolor", "yellow")});
6784

6885
auto marked_nodes = ConsumeMarkedNodes(graph.get());
6986
// Create nodes
@@ -74,9 +91,17 @@ std::unique_ptr<ir::Graph> GraphVizPass::ApplyImpl(
7491
marked_nodes.count(n) ? marked_op_attrs : op_attrs;
7592
dot.AddNode(node_id, attr, node_id);
7693
} else if (n->IsVar()) {
77-
decltype(op_attrs) attr =
78-
marked_nodes.count(n) ? marked_var_attrs : var_attrs;
79-
dot.AddNode(node_id, attr, node_id);
94+
decltype(op_attrs)* attr;
95+
if (marked_nodes.count(n)) {
96+
attr = &marked_var_attrs;
97+
} else if (const_cast<Node*>(n)->Var() &&
98+
const_cast<Node*>(n)->Var()->Persistable()) {
99+
attr = &param_attrs;
100+
} else {
101+
attr = &arg_attrs;
102+
}
103+
104+
dot.AddNode(node_id, *attr, node_id);
80105
}
81106
node2dot[n] = node_id;
82107
}

paddle/fluid/inference/analysis/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,6 @@ if (NOT EXISTS ${TEXT_CLASSIFICATION_INSTALL_DIR} AND WITH_TESTING AND WITH_INFE
105105
inference_download_and_uncompress(${TEXT_CLASSIFICATION_INSTALL_DIR} ${TEXT_CLASSIFICATION_MODEL_URL} "text-classification-Senta.tar.gz")
106106
endif()
107107

108-
inference_analysis_test(test_text_classification SRCS test_text_classification.cc
108+
inference_analysis_test(test_text_classification SRCS analyzer_text_classification_tester.cc
109109
EXTRA_DEPS paddle_inference_api paddle_fluid_api analysis_predictor
110110
ARGS --infer_model=${TEXT_CLASSIFICATION_INSTALL_DIR}/text-classification-Senta)

paddle/fluid/inference/analysis/test_text_classification.cc renamed to paddle/fluid/inference/analysis/analyzer_text_classification_tester.cc

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#include "paddle/fluid/inference/analysis/analyzer.h"
1516
#include <gflags/gflags.h>
1617
#include <glog/logging.h> // use glog instead of PADDLE_ENFORCE to avoid importing other paddle header files.
1718
#include <gtest/gtest.h>
1819
#include "paddle/fluid/framework/ir/pass.h"
19-
#include "paddle/fluid/inference/analysis/analyzer.h"
2020
#include "paddle/fluid/inference/analysis/ut_helper.h"
2121
#include "paddle/fluid/inference/api/helper.h"
2222
#include "paddle/fluid/inference/api/paddle_inference_api.h"
23+
#include "paddle/fluid/inference/api/paddle_inference_pass.h"
24+
#include "paddle/fluid/inference/api/timer.h"
2325

2426
DEFINE_string(infer_model, "", "Directory of the inference model.");
2527
DEFINE_string(infer_data, "", "Path of the dataset.");
@@ -86,10 +88,3 @@ TEST(text_classification, basic) { Main(FLAGS_batch_size); }
8688

8789
} // namespace inference
8890
} // namespace paddle
89-
90-
USE_PASS(fc_fuse_pass);
91-
USE_PASS(seq_concat_fc_fuse_pass);
92-
USE_PASS(fc_lstm_fuse_pass);
93-
USE_PASS(graph_viz_pass);
94-
USE_PASS(infer_clean_graph_pass);
95-
USE_PASS(attention_lstm_fuse_pass);

paddle/fluid/inference/api/CMakeLists.txt

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,7 @@ function(inference_api_test TARGET_NAME)
4444
endfunction(inference_api_test)
4545

4646
cc_library(paddle_inference_api SRCS api.cc api_impl.cc helper.cc DEPS lod_tensor)
47-
cc_library(analysis_predictor SRCS analysis_predictor.cc DEPS paddle_inference_api
48-
analysis
49-
ir_pass_manager
50-
pass
51-
fc_fuse_pass
52-
fc_lstm_fuse_pass
53-
seq_concat_fc_fuse_pass
54-
graph_viz_pass
55-
infer_clean_graph_pass
56-
graph_pattern_detector
57-
infer_clean_graph_pass
58-
attention_lstm_fuse_pass
59-
)
47+
cc_library(analysis_predictor SRCS analysis_predictor.cc DEPS paddle_inference_api analysis)
6048

6149
cc_test(test_paddle_inference_api
6250
SRCS api_tester.cc

paddle/fluid/operators/fake_quantize_op.cu

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ struct FindRangeAbsMaxFunctor<platform::CUDADeviceContext, T> {
119119
const framework::Tensor& last_scale,
120120
const framework::Tensor& iter, const int window_size,
121121
framework::Tensor* scales_arr, framework::Tensor* out_scale) {
122-
auto& gpu_place = boost::get<platform::CUDAPlace>(ctx.GetPlace());
122+
const auto gpu_place = boost::get<platform::CUDAPlace>(ctx.GetPlace());
123+
123124
T* scale_arr = scales_arr->mutable_data<T>(gpu_place);
124125
T* out_scale_data = out_scale->mutable_data<T>(gpu_place);
125126

paddle/fluid/operators/flatten_op.cc

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,116 @@ class FlattenGradOp : public framework::OperatorBase {
157157
}
158158
};
159159

160+
// FIXME(zcd): flatten2 adds an intermediate output(XShape) based on flatten,
161+
// the XShape is used to carry the shape and lod of X which will be used in
162+
// flatten_grad, in this way, the framework can reuse the memory of X
163+
// immediately the flatten2_op is finished.
164+
// Considering compatibility issues, we could not fix flatten2_op
165+
class Flatten2OpInferShape : public FlattenOpInferShape {
166+
public:
167+
void operator()(framework::InferShapeContext *ctx) const override {
168+
FlattenOpInferShape::operator()(ctx);
169+
PADDLE_ENFORCE(ctx->HasOutput("XShape"),
170+
"Output (XShape) of Flatten op should not be null.");
171+
const auto &in_dims = ctx->GetInputDim("X");
172+
std::vector<int64_t> xshape_dims(in_dims.size() + 1);
173+
xshape_dims[0] = 0;
174+
for (int i = 0; i < in_dims.size(); ++i) {
175+
xshape_dims[i + 1] = in_dims[i];
176+
}
177+
ctx->SetOutputDim("XShape", framework::make_ddim(xshape_dims));
178+
ctx->ShareLoD("X", "XShape");
179+
}
180+
};
181+
182+
class Flatten2Op : public framework::OperatorBase {
183+
public:
184+
using OperatorBase::OperatorBase;
185+
186+
private:
187+
void RunImpl(const framework::Scope &scope,
188+
const platform::Place &place) const override {
189+
auto &axis = Attr<int>("axis");
190+
auto in_dims =
191+
scope.FindVar(Input("X"))->Get<framework::LoDTensor>().dims();
192+
const auto &out_dims = FlattenOpInferShape::GetOutputShape(axis, in_dims);
193+
194+
framework::AttributeMap attrs;
195+
attrs["shape"] = out_dims;
196+
attrs["inplace"] = false;
197+
// Invoke Reshape Op
198+
auto reshape_op = framework::OpRegistry::CreateOp(
199+
"reshape2", {{"X", {Input("X")}}, {"Shape", {}}},
200+
{{"Out", {Output("Out")}}, {"XShape", {Output("XShape")}}}, attrs);
201+
reshape_op->Run(scope, place);
202+
}
203+
};
204+
205+
class Flatten2OpMaker : public FlattenOpMaker {
206+
public:
207+
void Make() override {
208+
FlattenOpMaker::Make();
209+
AddOutput("XShape",
210+
"XShape is just used to store the shape and lod of X, which will "
211+
"be used in FlattenGradOp.")
212+
.AsIntermediate();
213+
}
214+
};
215+
216+
class Flatten2GradOpMaker : public framework::SingleGradOpDescMaker {
217+
public:
218+
using framework::SingleGradOpDescMaker::SingleGradOpDescMaker;
219+
220+
std::unique_ptr<framework::OpDesc> Apply() const override {
221+
auto *grad_op = new framework::OpDesc();
222+
grad_op->SetType("flatten2_grad");
223+
grad_op->SetInput("XShape", Output("XShape"));
224+
grad_op->SetInput(framework::GradVarName("Out"), OutputGrad("Out"));
225+
grad_op->SetOutput(framework::GradVarName("X"), InputGrad("X"));
226+
grad_op->SetAttrMap(Attrs());
227+
return std::unique_ptr<framework::OpDesc>(grad_op);
228+
}
229+
};
230+
231+
class Flatten2GradInferShape : public framework::InferShapeBase {
232+
public:
233+
void operator()(framework::InferShapeContext *context) const override {
234+
PADDLE_ENFORCE(context->HasInput("XShape"),
235+
"Input(XShape) shouldn't be null.");
236+
PADDLE_ENFORCE(context->HasInput(framework::GradVarName("Out")),
237+
"Input(Out@GRAD) shouldn't be null.");
238+
auto xshape_dims = context->GetInputDim("XShape");
239+
auto x_dims = framework::slice_ddim(xshape_dims, 1, xshape_dims.size());
240+
context->SetOutputDim(framework::GradVarName("X"), x_dims);
241+
context->ShareLoD("XShape", framework::GradVarName("X"));
242+
}
243+
};
244+
245+
class Flatten2GradOp : public framework::OperatorBase {
246+
public:
247+
using OperatorBase::OperatorBase;
248+
249+
private:
250+
void RunImpl(const framework::Scope &scope,
251+
const platform::Place &place) const override {
252+
auto dx_name = Output(framework::GradVarName("X"));
253+
auto dout_name = Input(framework::GradVarName("Out"));
254+
auto xshape_name = Input("XShape");
255+
auto xshape_dims =
256+
scope.FindVar(xshape_name)->Get<framework::LoDTensor>().dims();
257+
auto x_dims = framework::slice_ddim(xshape_dims, 1, xshape_dims.size());
258+
259+
framework::AttributeMap attrs;
260+
attrs["shape"] = framework::vectorize2int(x_dims);
261+
attrs["inplace"] = false;
262+
263+
auto reshape_op = framework::OpRegistry::CreateOp(
264+
"reshape2", {{"X", {dout_name}}, {"Shape", {}}},
265+
{{"Out", {dx_name}}, {"XShape", {xshape_name}}}, attrs);
266+
reshape_op->Run(scope, place);
267+
}
268+
};
269+
160270
} // namespace operators
161271
} // namespace paddle
162272

@@ -167,3 +277,8 @@ REGISTER_OPERATOR(flatten, ops::FlattenOp, ops::FlattenOpMaker,
167277
ops::FlattenOpInferShape,
168278
paddle::framework::DefaultGradOpDescMaker<true>);
169279
REGISTER_OPERATOR(flatten_grad, ops::FlattenGradOp, ops::FlattenGradInferShape);
280+
281+
REGISTER_OPERATOR(flatten2, ops::Flatten2Op, ops::Flatten2OpMaker,
282+
ops::Flatten2OpInferShape, ops::Flatten2GradOpMaker);
283+
REGISTER_OPERATOR(flatten2_grad, ops::Flatten2GradOp,
284+
ops::Flatten2GradInferShape);

paddle/fluid/operators/fusion_gru_op.cc

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,7 @@ void FusionGRUOp::InferShape(framework::InferShapeContext* ctx) const {
3030
"Input(WeightX) of GRU should not be null.");
3131
PADDLE_ENFORCE(ctx->HasInput("WeightH"),
3232
"Input(WeightH) of GRU should not be null.");
33-
3433
PADDLE_ENFORCE(ctx->HasOutput("XX"), "Output(XX) of GRU should not be null.");
35-
PADDLE_ENFORCE(ctx->HasOutput("ReorderedH0"),
36-
"Output(ReorderedH0) of GRU should not be null.");
37-
PADDLE_ENFORCE(ctx->HasOutput("BatchedInput"),
38-
"Output(BatchedInput) of GRU should not be null.");
39-
PADDLE_ENFORCE(ctx->HasOutput("BatchedOut"),
40-
"Output(BatchedOut) of GRU should not be null.");
4134
PADDLE_ENFORCE(ctx->HasOutput("Hidden"),
4235
"Output(Hidden) of GRU should not be null.");
4336

@@ -80,15 +73,20 @@ void FusionGRUOp::InferShape(framework::InferShapeContext* ctx) const {
8073
}
8174
framework::DDim out_dims({x_dims[0], frame_size});
8275
ctx->SetOutputDim("Hidden", out_dims);
83-
ctx->SetOutputDim("BatchedInput", {x_dims[0], wx_dims[1]});
84-
ctx->SetOutputDim("BatchedOut", out_dims);
8576
ctx->ShareLoD("X", "Hidden");
86-
8777
int xx_width;
8878
if (ctx->Attrs().Get<bool>("use_seq")) {
8979
xx_width = wx_dims[1];
9080
} else {
9181
xx_width = x_dims[1] > wx_dims[1] ? wx_dims[1] : x_dims[1];
82+
PADDLE_ENFORCE(ctx->HasOutput("ReorderedH0"),
83+
"Output(ReorderedH0) of GRU should not be null.");
84+
PADDLE_ENFORCE(ctx->HasOutput("BatchedInput"),
85+
"Output(BatchedInput) of GRU should not be null.");
86+
PADDLE_ENFORCE(ctx->HasOutput("BatchedOut"),
87+
"Output(BatchedOut) of GRU should not be null.");
88+
ctx->SetOutputDim("BatchedInput", {x_dims[0], wx_dims[1]});
89+
ctx->SetOutputDim("BatchedOut", out_dims);
9290
}
9391
ctx->SetOutputDim("XX", {x_dims[0], xx_width});
9492
ctx->ShareLoD("X", "XX");

0 commit comments

Comments
 (0)