Skip to content

Commit 3a54149

Browse files
Merge pull request #23 from PaddlePaddle/develop
update
2 parents c1e59cf + 91be876 commit 3a54149

File tree

104 files changed

+3656
-1288
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+3656
-1288
lines changed

cmake/external/xpu.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ ELSE ()
3535
ENDIF()
3636

3737
SET(XPU_BASE_URL_WITHOUT_DATE "https://baidu-kunlun-product.cdn.bcebos.com/KL-SDK/klsdk-dev")
38-
SET(XPU_BASE_URL "${XPU_BASE_URL_WITHOUT_DATE}/20210701")
38+
SET(XPU_BASE_URL "${XPU_BASE_URL_WITHOUT_DATE}/20210729")
3939
SET(XPU_XRE_URL "${XPU_BASE_URL}/${XPU_XRE_DIR_NAME}.tar.gz" CACHE STRING "" FORCE)
4040
SET(XPU_XDNN_URL "${XPU_BASE_URL}/${XPU_XDNN_DIR_NAME}.tar.gz" CACHE STRING "" FORCE)
4141
SET(XPU_XCCL_URL "${XPU_BASE_URL_WITHOUT_DATE}/20210623/${XPU_XCCL_DIR_NAME}.tar.gz" CACHE STRING "" FORCE)

paddle/fluid/framework/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,13 @@ cc_library(op_kernel_type SRCS op_kernel_type.cc DEPS device_context place)
188188

189189
cc_library(unused_var_check SRCS unused_var_check.cc DEPS glog no_need_buffer_vars_inference)
190190

191+
IF(WITH_XPU)
192+
cc_library(operator SRCS operator.cc DEPS xpu_op_list op_info device_context tensor scope glog trainer_desc_proto data_feed_proto
193+
shape_inference data_transform lod_tensor profiler transfer_scope_cache op_kernel_type op_call_stack unused_var_check nan_inf_utils)
194+
ELSE()
191195
cc_library(operator SRCS operator.cc DEPS op_info device_context tensor scope glog trainer_desc_proto data_feed_proto
192196
shape_inference data_transform lod_tensor profiler transfer_scope_cache op_kernel_type op_call_stack unused_var_check nan_inf_utils)
197+
ENDIF()
193198

194199
cc_test(operator_test SRCS operator_test.cc DEPS operator op_registry device_context)
195200
cc_test(operator_exception_test SRCS operator_exception_test.cc DEPS operator op_registry device_context)
@@ -405,7 +410,7 @@ configure_file(commit.h.in commit.h)
405410
# Adapt to custom op mechanism: Include the header files related to the data type
406411
# to avoid exposing the path of the underlying file
407412
include_directories(${PADDLE_SOURCE_DIR}/paddle/fluid/platform)
408-
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../extension/include)
413+
include_directories(${PADDLE_SOURCE_DIR}/paddle/fluid/extension/include)
409414

410415
if(WITH_ROCM)
411416
hip_library(custom_tensor SRCS ../extension/src/ext_tensor.cc DEPS lod_tensor memory enforce)

paddle/fluid/framework/details/multi_devices_helper.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,6 @@ typedef std::vector<std::pair<std::string, std::string>> ParamsAndGrads;
7777
constexpr char kParamsAndDenseGrads[] = "params_and_dense_grads";
7878
constexpr char kParamsAndSparseGrads[] = "params_and_sparse_grads";
7979

80-
typedef std::vector<ProgramDesc> ProgramDescs;
81-
constexpr char kProgramDescs[] = "program_descs";
82-
constexpr char kStartupProgramDescs[] = "startup_program_descs";
83-
8480
typedef std::unordered_set<std::string> PinnedVars;
8581
constexpr char kPinnedVars[] = "pinned_vars";
8682

paddle/fluid/framework/ir/graph_helper.cc

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ limitations under the License. */
1515
#include "paddle/fluid/framework/ir/graph_helper.h"
1616
#include <queue>
1717
#include <stack>
18+
#include "paddle/fluid/framework/op_proto_maker.h"
1819

20+
DECLARE_bool(convert_all_blocks);
1921
DEFINE_string(print_sub_graph_dir, "",
2022
"FLAGS_print_sub_graph_dir is used "
2123
"to print the nodes of sub_graphs.");
@@ -431,6 +433,117 @@ std::vector<ir::Node *> TopologySortGraphByDescOrder(const Graph &graph) {
431433
return ret;
432434
}
433435

436+
static OpDesc *ReplaceScaleLossGradOp(const Node &node, OpDesc *desc) {
437+
desc->SetType("fill_constant");
438+
desc->SetAttr(
439+
OpProtoAndCheckerMaker::OpRoleAttrName(),
440+
(static_cast<int>(OpRole::kBackward) | static_cast<int>(OpRole::kLoss)));
441+
desc->SetAttr("value", 1.0f);
442+
std::vector<std::string> output_names;
443+
for (auto out : node.outputs) {
444+
output_names.emplace_back(out->Name());
445+
}
446+
desc->SetOutput("Out", output_names);
447+
return desc;
448+
}
449+
450+
static void GetGraphOpDesc(const std::vector<Node *> &nodes,
451+
std::vector<OpDesc> *ops) {
452+
for (Node *n : nodes) {
453+
// if node is not Op, skip
454+
if (!n->IsOp()) continue;
455+
456+
// create fill_constant op
457+
if (n->Name() == "scale_loss_grad") {
458+
ops->emplace_back();
459+
auto &desc = ops->back();
460+
ReplaceScaleLossGradOp(*n, &desc);
461+
} else if (n->Op()) {
462+
ops->emplace_back(*n->Op());
463+
}
464+
// delete no OpDesc op
465+
}
466+
}
467+
468+
static void GraphToBlock(const Graph &graph, proto::BlockDesc *block,
469+
const SortKind *sort_kind) {
470+
// Remove the unneeded variables after memory optimization.
471+
std::unordered_set<std::string> vars2remove;
472+
if (graph.Has(kGraphToProgramVarsToRemove)) {
473+
vars2remove =
474+
graph.Get<std::unordered_set<std::string>>(kGraphToProgramVarsToRemove);
475+
VLOG(2) << "graph (id: " << block->idx() << ") to program remove "
476+
<< vars2remove.size() << " nodes";
477+
}
478+
479+
block->clear_vars();
480+
std::unordered_set<std::string> visited_vars;
481+
for (Node *n : graph.Nodes()) {
482+
if (n->IsVar()) {
483+
if (n->Var() && visited_vars.count(n->Var()->Name()) == 0 &&
484+
!vars2remove.count(n->Var()->Name()) &&
485+
n->GetVarNodeBlockId() == graph.GetBlockId()) {
486+
visited_vars.insert(n->Var()->Name());
487+
block->add_vars()->MergeFrom(*n->Var()->Proto());
488+
}
489+
}
490+
}
491+
block->clear_ops();
492+
493+
std::vector<Node *> nodes;
494+
if (sort_kind != nullptr) {
495+
// Inference Memory Optimize relays on this branch.
496+
nodes = TopologyVarientSort(graph, *sort_kind);
497+
} else {
498+
if (FLAGS_convert_all_blocks) {
499+
nodes = TopologySortGraphByDescOrder(graph);
500+
} else {
501+
nodes = TopologySortOperations(graph);
502+
}
503+
}
504+
505+
std::vector<OpDesc> ops;
506+
GetGraphOpDesc(nodes, &ops);
507+
for (auto &op : ops) {
508+
block->add_ops()->MergeFrom(*op.Proto());
509+
}
510+
}
511+
512+
void GraphToProgram(const Graph &graph, ProgramDesc *program,
513+
const SortKind *sort_kind) {
514+
PADDLE_ENFORCE_EQ(graph.IsMainGraph(), true,
515+
platform::errors::InvalidArgument(
516+
"This graph is a sub_graph, "
517+
"and can't convert to program individually"));
518+
PADDLE_ENFORCE_NOT_NULL(
519+
program,
520+
platform::errors::InvalidArgument(
521+
"program must not be nullptr when converting graph to program"));
522+
523+
proto::ProgramDesc program_pb(*(program->Proto()));
524+
auto block = program_pb.mutable_blocks(kRootBlockIndex);
525+
block->set_idx(kRootBlockIndex);
526+
527+
if (FLAGS_convert_all_blocks) {
528+
GraphToBlock(*graph.GetSubGraph(kRootBlockIndex), block, sort_kind);
529+
530+
VLOG(3) << "Graph to program need convert " << graph.SubGraphsSize()
531+
<< " sub graph";
532+
for (size_t idx = 0; idx < graph.SubGraphsSize(); ++idx) {
533+
// avoid kRootBlockIndex not 0
534+
if (idx == kRootBlockIndex) continue;
535+
536+
block = program_pb.add_blocks();
537+
block->set_idx(idx);
538+
GraphToBlock(*graph.GetSubGraph(idx), block, sort_kind);
539+
}
540+
} else {
541+
GraphToBlock(graph, block, sort_kind);
542+
}
543+
544+
program->CopyFrom(program_pb);
545+
}
546+
434547
} // namespace ir
435548
} // namespace framework
436549
} // namespace paddle

paddle/fluid/framework/ir/graph_helper.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ namespace paddle {
2727
namespace framework {
2828
namespace ir {
2929

30+
constexpr char kGraphToProgramVarsToRemove[] =
31+
"__graph_to_program_vars_to_remove__";
32+
constexpr char kGraphToProgramSortKind[] = "__graph_to_program_sort_kind__";
33+
3034
// Compare nodes via node id.
3135
class Graph;
3236

@@ -117,6 +121,9 @@ std::vector<T *> FilterByNodeWrapper(const Graph &graph) {
117121

118122
std::vector<ir::Node *> TopologySortGraphByDescOrder(const Graph &graph);
119123

124+
void GraphToProgram(const Graph &graph, ProgramDesc *p_program,
125+
const SortKind *sort_kind = nullptr);
126+
120127
} // namespace ir
121128
} // namespace framework
122129
} // namespace paddle

paddle/fluid/framework/ir/graph_to_program_pass.cc

Lines changed: 4 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,8 @@ limitations under the License. */
1717
#include <gflags/gflags.h>
1818
#include <algorithm>
1919

20-
#include "paddle/fluid/framework/ir/graph_helper.h"
2120
#include "paddle/fluid/framework/op_proto_maker.h"
2221

23-
DECLARE_bool(convert_all_blocks);
24-
2522
namespace paddle {
2623
namespace framework {
2724
class ProgramDesc;
@@ -33,116 +30,12 @@ namespace framework {
3330
namespace ir {
3431

3532
void GraphToProgramPass::ApplyImpl(ir::Graph* graph) const {
36-
PADDLE_ENFORCE_EQ(graph->IsMainGraph(), true,
37-
platform::errors::InvalidArgument(
38-
"This graph is a sub_graph, "
39-
"and can't convert to program individually"));
40-
41-
ProgramDesc& program = Get<ProgramDesc>("program");
42-
43-
std::unique_ptr<proto::ProgramDesc> program_pb(
44-
new proto::ProgramDesc(*program.Proto()));
45-
46-
auto block = program_pb->mutable_blocks(kRootBlockIndex);
47-
block->set_idx(kRootBlockIndex);
48-
49-
if (FLAGS_convert_all_blocks) {
50-
GraphToBlock(graph->GetSubGraph(kRootBlockIndex), block);
51-
52-
VLOG(3) << "Graph to program need convert " << graph->SubGraphsSize()
53-
<< " sub graph";
54-
for (size_t idx = 0; idx < graph->SubGraphsSize(); ++idx) {
55-
// avoid kRootBlockIndex not 0
56-
if (idx == kRootBlockIndex) continue;
57-
58-
block = program_pb->add_blocks();
59-
block->set_idx(idx);
60-
GraphToBlock(graph->GetSubGraph(idx), block);
61-
}
62-
} else {
63-
GraphToBlock(graph, block);
64-
}
65-
66-
program.CopyFrom(*program_pb);
67-
}
68-
69-
OpDesc* ReplaceScaleLossGradOp(ir::Node* node, OpDesc* desc) {
70-
desc->SetType("fill_constant");
71-
desc->SetAttr(
72-
OpProtoAndCheckerMaker::OpRoleAttrName(),
73-
(static_cast<int>(OpRole::kBackward) | static_cast<int>(OpRole::kLoss)));
74-
desc->SetAttr("value", 1.0f);
75-
std::vector<std::string> output_names;
76-
for (auto out : node->outputs) {
77-
output_names.emplace_back(out->Name());
78-
}
79-
desc->SetOutput("Out", output_names);
80-
return desc;
81-
}
82-
83-
std::vector<OpDesc>* GetGraphOpDesc(const std::vector<ir::Node*>& nodes,
84-
std::vector<OpDesc>* ops) {
85-
for (ir::Node* n : nodes) {
86-
// if node is not Op, skip
87-
if (!n->IsOp()) continue;
88-
89-
// create fill_constant op
90-
if (n->Name() == "scale_loss_grad") {
91-
ops->emplace_back();
92-
auto& desc = ops->back();
93-
ReplaceScaleLossGradOp(n, &desc);
94-
} else if (n->Op()) {
95-
ops->emplace_back(*n->Op());
96-
} else {
97-
// delete no OpDesc op
98-
}
99-
}
100-
return ops;
101-
}
102-
103-
void GraphToProgramPass::GraphToBlock(const Graph* graph,
104-
proto::BlockDesc* block) const {
105-
// Remove the unneeded variables after memory optimization.
106-
std::unordered_set<std::string> vars2remove;
107-
if (graph->Has(kGraphToProgramVarsToRemove)) {
108-
vars2remove = graph->Get<std::unordered_set<std::string>>(
109-
kGraphToProgramVarsToRemove);
110-
VLOG(2) << "graph (id: " << block->idx() << ") to program remove "
111-
<< vars2remove.size() << " nodes";
112-
}
113-
114-
block->clear_vars();
115-
std::unordered_set<std::string> visited_vars;
116-
for (ir::Node* n : graph->Nodes()) {
117-
if (n->IsVar()) {
118-
if (n->Var() && visited_vars.count(n->Var()->Name()) == 0 &&
119-
!vars2remove.count(n->Var()->Name()) &&
120-
n->GetVarNodeBlockId() == graph->GetBlockId()) {
121-
visited_vars.insert(n->Var()->Name());
122-
block->add_vars()->MergeFrom(*n->Var()->Proto());
123-
}
124-
}
125-
}
126-
block->clear_ops();
127-
128-
std::vector<ir::Node*> nodes;
33+
auto& program = Get<ProgramDesc>("program");
12934
if (Has(kGraphToProgramSortKind)) {
130-
// Inference Memory Optimize relays on this branch.
131-
int sort_kind = Get<int>(kGraphToProgramSortKind);
132-
nodes = TopologyVarientSort(
133-
*graph, static_cast<framework::ir::SortKind>(sort_kind));
35+
auto sort_kind = static_cast<SortKind>(Get<int>(kGraphToProgramSortKind));
36+
GraphToProgram(*graph, &program, &sort_kind);
13437
} else {
135-
if (FLAGS_convert_all_blocks) {
136-
nodes = TopologySortGraphByDescOrder(*graph);
137-
} else {
138-
nodes = TopologySortOperations(*graph);
139-
}
140-
}
141-
142-
std::vector<OpDesc> ops;
143-
GetGraphOpDesc(nodes, &ops);
144-
for (auto& op : ops) {
145-
block->add_ops()->MergeFrom(*op.Proto());
38+
GraphToProgram(*graph, &program, nullptr);
14639
}
14740
}
14841

paddle/fluid/framework/ir/graph_to_program_pass.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ limitations under the License. */
1414

1515
#pragma once
1616

17+
#include "paddle/fluid/framework/ir/graph_helper.h"
1718
#include "paddle/fluid/framework/ir/pass.h"
1819

1920
namespace paddle {
@@ -22,16 +23,9 @@ namespace ir {
2223

2324
class Graph;
2425

25-
const char kGraphToProgramVarsToRemove[] =
26-
"__graph_to_program_vars_to_remove__";
27-
const char kGraphToProgramSortKind[] = "__graph_to_program_sort_kind__";
28-
2926
class GraphToProgramPass : public Pass {
3027
protected:
3128
void ApplyImpl(ir::Graph* graph) const override;
32-
33-
private:
34-
void GraphToBlock(const Graph* graph, proto::BlockDesc* block) const;
3529
};
3630

3731
} // namespace ir

paddle/fluid/framework/ir/pass.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,26 @@ Graph* Pass::Apply(Graph* graph) const {
6969
return graph;
7070
}
7171

72+
void Pass::Apply(ProgramDesc* main_program,
73+
ProgramDesc* startup_program) const {
74+
PADDLE_ENFORCE_NOT_NULL(main_program, platform::errors::InvalidArgument(
75+
"main program must be provided"));
76+
PADDLE_ENFORCE_NOT_NULL(
77+
startup_program,
78+
platform::errors::InvalidArgument("startup program must be provided"));
79+
80+
Graph graph(*main_program);
81+
Apply(&graph);
82+
83+
// TODO(zjl): support details::kStartupProgramDescs and details::kProgramDescs
84+
ProgramDesc new_main_program;
85+
GraphToProgram(graph, &new_main_program);
86+
main_program->CopyFrom(*new_main_program.Proto());
87+
88+
startup_program->Flush();
89+
main_program->Flush();
90+
}
91+
7292
PassRegistry& PassRegistry::Instance() {
7393
static PassRegistry g_pass_info_map;
7494
return g_pass_info_map;

0 commit comments

Comments
 (0)