Skip to content

Commit 9f65b61

Browse files
authored
Merge branch 'develop' into add_reorg_op
2 parents 4556578 + 08d22cf commit 9f65b61

40 files changed

+1680
-206
lines changed

CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ option(WITH_DISTRIBUTE "Compile with distributed support" OFF)
6262
option(USE_EIGEN_FOR_BLAS "Use matrix multiplication in Eigen" OFF)
6363
option(EIGEN_USE_THREADS "Compile with multi-threaded Eigen" OFF)
6464
option(WITH_ARM_FP16 "Use half precision support on armv8.2-a cpu" OFF)
65-
option(WITH_FAST_BUNDLE_TEST "Bundle tests that can be run in a single process together to reduce launch overhead" OFF)
6665
option(WITH_CONTRIB "Compile the third-party contributation" OFF)
6766
option(REPLACE_ENFORCE_GLOG "Replace PADDLE_ENFORCE with glog/CHECK for better debug." OFF)
6867
option(WITH_ANAKIN "Compile with Anakin library" OFF)

paddle/fluid/API.spec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ paddle.fluid.layers.mul ArgSpec(args=['x', 'y', 'x_num_col_dims', 'y_num_col_dim
175175
paddle.fluid.layers.sigmoid_cross_entropy_with_logits ArgSpec(args=['x', 'label', 'name'], varargs=None, keywords=None, defaults=(None,))
176176
paddle.fluid.layers.maxout ArgSpec(args=['x', 'groups', 'name'], varargs=None, keywords=None, defaults=(None,))
177177
paddle.fluid.layers.space_to_depth ArgSpec(args=['x', 'blocksize', 'name'], varargs=None, keywords=None, defaults=(None,))
178+
paddle.fluid.layers.affine_grid ArgSpec(args=['theta', 'out_shape', 'name'], varargs=None, keywords=None, defaults=(None,))
178179
paddle.fluid.layers.sequence_reverse ArgSpec(args=['x', 'name'], varargs=None, keywords=None, defaults=(None,))
179180
paddle.fluid.layers.affine_channel ArgSpec(args=['x', 'scale', 'bias', 'data_layout', 'name'], varargs=None, keywords=None, defaults=(None, None, 'NCHW', None))
180181
paddle.fluid.layers.hash ArgSpec(args=['input', 'hash_size', 'num_hash', 'name'], varargs=None, keywords=None, defaults=(1, None))

paddle/fluid/framework/ir/conv_relu_mkldnn_fuse_pass_tester.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "paddle/fluid/framework/ir/conv_relu_mkldnn_fuse_pass.h"
1616

1717
#include <gtest/gtest.h>
18+
#include "paddle/fluid/framework/op_proto_maker.h"
1819

1920
namespace paddle {
2021
namespace framework {
@@ -36,6 +37,8 @@ void SetOp(ProgramDesc* prog, const std::string& type, const std::string& name,
3637
op->SetInput("X", inputs);
3738
}
3839
op->SetOutput("Out", outputs);
40+
op->SetAttr(OpProtoAndCheckerMaker::OpRoleAttrName(),
41+
static_cast<int>(OpRole::kForward));
3942
}
4043

4144
// a->OP0->b

paddle/fluid/framework/ir/fc_fuse_pass_tester.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "paddle/fluid/framework/ir/fc_fuse_pass.h"
1616

1717
#include <gtest/gtest.h>
18+
#include "paddle/fluid/framework/op_proto_maker.h"
1819

1920
namespace paddle {
2021
namespace framework {
@@ -32,6 +33,8 @@ void SetOp(ProgramDesc* prog, const std::string& type,
3233
op->SetInput("X", inputs);
3334
}
3435
op->SetOutput("Out", outputs);
36+
op->SetAttr(OpProtoAndCheckerMaker::OpRoleAttrName(),
37+
static_cast<int>(OpRole::kForward));
3538
}
3639

3740
// a->OP0->b

paddle/fluid/framework/ir/graph.cc

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,62 @@ limitations under the License. */
2323
namespace paddle {
2424
namespace framework {
2525
namespace ir {
26+
namespace {
27+
28+
void CheckProgram(const ProgramDesc &program) {
29+
std::map<int, bool> visit;
30+
#define _INT(role) static_cast<int>(role)
31+
32+
for (size_t i = 0; i < program.Size(); ++i) {
33+
for (OpDesc *op : program.Block(i).AllOps()) {
34+
// For backward compatibility, some program doesn't have role added.
35+
if (!op->HasAttr(OpProtoAndCheckerMaker::OpRoleAttrName())) continue;
36+
int role_id = boost::get<int>(
37+
op->GetAttr(OpProtoAndCheckerMaker::OpRoleAttrName()));
38+
visit[role_id] = true;
39+
switch (role_id) {
40+
case _INT(OpRole::kForward):
41+
PADDLE_ENFORCE(
42+
visit.find(_INT(OpRole::kBackward)) == visit.end(),
43+
"Cannot add forward operator before backward operator.");
44+
break;
45+
case _INT(OpRole::kBackward):
46+
case _INT(OpRole::kBackward) | _INT(OpRole::kLoss):
47+
PADDLE_ENFORCE(
48+
visit.find(_INT(OpRole::kOptimize)) == visit.end(),
49+
"Cannot add backward operator before optimize operator.");
50+
break;
51+
case _INT(OpRole::kForward) | _INT(OpRole::kLoss):
52+
PADDLE_ENFORCE(visit.find(_INT(OpRole::kBackward) |
53+
_INT(OpRole::kLoss)) == visit.end(),
54+
"Cannot add backward|loss operator before "
55+
"forward|loss operator.");
56+
PADDLE_ENFORCE(
57+
visit.find(_INT(OpRole::kOptimize)) == visit.end(),
58+
"Cannot add backward operator before optimize operator.");
59+
break;
60+
case _INT(OpRole::kOptimize):
61+
case _INT(OpRole::kOptimize) | _INT(OpRole::kLRSched):
62+
PADDLE_ENFORCE(visit.find(_INT(OpRole::kBackward)) != visit.end(),
63+
"Optimize operators must follow backward operator.");
64+
break;
65+
case _INT(OpRole::kLRSched):
66+
case _INT(OpRole::kDist):
67+
case _INT(OpRole::kRPC):
68+
case _INT(OpRole::kNotSpecified):
69+
break;
70+
default:
71+
LOG(FATAL) << "Unknown operator role. Don't add new role because "
72+
"you don't know what you are doing.";
73+
}
74+
}
75+
}
76+
#undef _INT
77+
}
78+
} // namespace
2679

2780
Graph::Graph(const ProgramDesc &program) : program_(program) {
81+
CheckProgram(program_);
2882
// Make the nodes id start from 0.
2983
Node::ResetId();
3084
auto var_nodes = InitFromProgram(program_);

paddle/fluid/framework/ir/graph_pattern_detector.cc

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,15 @@ GraphPatternDetector::DetectPatterns() {
259259
return result;
260260
}
261261

262+
bool GraphItemCMP(const std::pair<PDNode *, Node *> &a,
263+
const std::pair<PDNode *, Node *> &b) {
264+
if (a.first != b.first) {
265+
return a.first < b.first;
266+
} else {
267+
return a.second < b.second;
268+
}
269+
}
270+
262271
// TODO(Superjomn) enhance the function as it marks unique unique as duplicates
263272
// see https://github.com/PaddlePaddle/Paddle/issues/13550
264273
void GraphPatternDetector::UniquePatterns(
@@ -267,12 +276,16 @@ void GraphPatternDetector::UniquePatterns(
267276
std::vector<GraphPatternDetector::subgraph_t> result;
268277

269278
std::unordered_set<size_t> set;
279+
std::hash<std::string> hasher;
270280
for (auto &g : *subgraphs) {
271-
size_t key = 0;
272-
for (auto &item : g) {
273-
key ^= std::hash<void *>{}(item.first);
274-
key ^= std::hash<void *>{}(item.second);
281+
// Sort the items in the sub-graph, and transform to a string key.
282+
std::vector<std::pair<PDNode *, Node *>> sorted_keys(g.begin(), g.end());
283+
std::sort(sorted_keys.begin(), sorted_keys.end(), GraphItemCMP);
284+
std::stringstream ss;
285+
for (auto &item : sorted_keys) {
286+
ss << item.first << ":" << item.second;
275287
}
288+
auto key = hasher(ss.str());
276289
if (!set.count(key)) {
277290
result.emplace_back(g);
278291
set.insert(key);

paddle/fluid/framework/lod_tensor.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ void LoDTensor::MergeLoDTensor(
418418
PADDLE_ENFORCE_EQ(new_lod.size(), lod.size());
419419
for (size_t j = 0; j < lod.size(); ++j) {
420420
auto &sub_lod = new_lod[j];
421-
auto &offset = sub_lod.back();
421+
size_t offset = sub_lod.back();
422422
for (size_t k = 1; k < lod[j].size(); ++k) {
423423
sub_lod.push_back(lod[j][k] + offset);
424424
}

paddle/fluid/framework/operator.cc

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -354,18 +354,18 @@ void OperatorBase::GenerateTemporaryNames() {
354354
}
355355
}
356356

357-
static bool VarIsTensor(const Variable* var) {
358-
return var->IsType<LoDTensor>() || var->IsType<SelectedRows>();
357+
static bool VarIsTensor(const Variable& var) {
358+
return var.IsType<LoDTensor>() || var.IsType<SelectedRows>();
359359
}
360360

361-
const Tensor* GetTensorFromVar(Variable* var) {
362-
if (var->IsType<LoDTensor>()) {
363-
return var->GetMutable<LoDTensor>();
364-
} else if (var->IsType<SelectedRows>()) {
365-
return var->GetMutable<SelectedRows>()->mutable_value();
361+
const Tensor* GetTensorFromVar(const Variable& var) {
362+
if (var.IsType<LoDTensor>()) {
363+
return static_cast<const Tensor*>(&(var.Get<LoDTensor>()));
364+
} else if (var.IsType<SelectedRows>()) {
365+
return &(var.Get<SelectedRows>().value());
366366
} else {
367367
PADDLE_THROW("Variable type_id %s, expect LoDTensor/SelectedRows.",
368-
var->Type().name());
368+
var.Type().name());
369369
}
370370
}
371371

@@ -415,8 +415,7 @@ bool ExecutionContext::HasOutput(const std::string& name) const {
415415
template <>
416416
const Tensor* ExecutionContext::Input<Tensor>(const std::string& name) const {
417417
auto* var = InputVar(name);
418-
return var == nullptr ? nullptr
419-
: GetTensorFromVar(const_cast<Variable*>(var));
418+
return var == nullptr ? nullptr : GetTensorFromVar(*var);
420419
}
421420

422421
template <>
@@ -428,7 +427,7 @@ const std::vector<const Tensor*> ExecutionContext::MultiInput<Tensor>(
428427
std::transform(names.begin(), names.end(), std::back_inserter(res),
429428
[&](const std::string& sub_name) {
430429
auto var = scope_.FindVar(sub_name);
431-
return var == nullptr ? nullptr : GetTensorFromVar(var);
430+
return var == nullptr ? nullptr : GetTensorFromVar(*var);
432431
});
433432
return res;
434433
}
@@ -770,8 +769,10 @@ void OperatorWithKernel::TransferInplaceVarsBack(
770769
for (auto& var_name : inplace_vars) {
771770
VLOG(3) << "share inplace var " + var_name + " back to it's original scope";
772771
auto* original_tensor = GetMutableTensorFromVar(scope.FindVar(var_name));
773-
auto* transformed_tensor =
774-
GetTensorFromVar(transfer_scope.FindVar(var_name));
772+
auto* var = transfer_scope.FindVar(var_name);
773+
PADDLE_ENFORCE(var != nullptr, "The var[%s] should not be nullptr",
774+
var_name);
775+
auto* transformed_tensor = GetTensorFromVar(*var);
775776
original_tensor->ShareDataWith(*transformed_tensor);
776777
}
777778
}
@@ -784,11 +785,11 @@ Scope* OperatorWithKernel::TryTransferData(
784785
for (auto& var_name : var_name_item.second) {
785786
auto* var = scope.FindVar(var_name);
786787
// Only tensor can be tranfer to another device.
787-
if (var == nullptr || !VarIsTensor(var)) {
788+
if (var == nullptr || !VarIsTensor(*var)) {
788789
continue;
789790
}
790791

791-
auto* tensor_in = GetTensorFromVar(var);
792+
auto* tensor_in = GetTensorFromVar(*var);
792793
if (!tensor_in->IsInitialized()) {
793794
continue;
794795
}

paddle/fluid/framework/operator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ inline std::string GradVarName(const std::string& var_name) {
6363
}
6464

6565
proto::VarType::Type GetDataTypeOfVar(const Variable* var);
66-
const Tensor* GetTensorFromVar(Variable* var);
66+
const Tensor* GetTensorFromVar(const Variable& var);
6767

6868
class OperatorBase;
6969
class ExecutionContext;

paddle/fluid/framework/tensor_test.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,19 @@ TEST(Tensor, MutableData) {
7575
platform::CPUPlace());
7676
EXPECT_EQ(p1, p2);
7777
}
78+
// Not sure if it's desired, but currently, Tensor type can be changed.
79+
{
80+
framework::Tensor src_tensor;
81+
int8_t* p1 = src_tensor.mutable_data<int8_t>(framework::make_ddim({1}),
82+
platform::CPUPlace());
83+
EXPECT_NE(p1, nullptr);
84+
*p1 = 1;
85+
86+
uint8_t* p2 = src_tensor.mutable_data<uint8_t>(framework::make_ddim({1}),
87+
platform::CPUPlace());
88+
EXPECT_NE(p2, nullptr);
89+
EXPECT_EQ(static_cast<int>(p2[0]), 1);
90+
}
7891

7992
#ifdef PADDLE_WITH_CUDA
8093
{

0 commit comments

Comments
 (0)