Skip to content

Commit 5373fe2

Browse files
committed
Merge remote-tracking branch 'ups/develop' into refine/im2col
2 parents 687a322 + 02c3145 commit 5373fe2

Some content is hidden

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

49 files changed

+1313
-324
lines changed

AUTHORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
| tianbingsz | Tian-Bing Xu |
4747
| tpatejko | Tomasz Patejko |
4848
| typhoonzero | Yi Wu |
49+
| velconia | Qi-Yang Min |
4950
| wanghaoshuang | Hao-Shuang Wang |
5051
| wangyang59 | Yang Wang |
5152
| wangzhen-nlp | Zhen Wang |

benchmark/fluid/fluid_benchmark.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,7 @@ def dist_transpile(trainer_id, args):
8585
trainer_id,
8686
pservers=pserver_endpoints,
8787
trainers=trainers,
88-
sync_mode=not args.async_mode,
89-
slice_var_up=not args.no_split_var)
88+
sync_mode=not args.async_mode)
9089
if training_role == "PSERVER":
9190
pserver_program = t.get_pserver_program(current_endpoint)
9291
pserver_startup_program = t.get_startup_program(current_endpoint,

cmake/external/grpc.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ ExternalProject_Add(
5050
UPDATE_COMMAND ""
5151
CONFIGURE_COMMAND ""
5252
BUILD_IN_SOURCE 1
53-
PATCH_COMMAND git apply ${PADDLE_SOURCE_DIR}/patches/grpc/fix_too_early_destory.patch
53+
PATCH_COMMAND cp ${PADDLE_SOURCE_DIR}/patches/grpc/grpc_library.h ${GRPC_SOURCES_DIR}/src/extern_grpc/include/grpcpp/impl/codegen/grpc_library.h && cp ${PADDLE_SOURCE_DIR}/patches/grpc/completion_queue.h ${GRPC_SOURCES_DIR}/src/extern_grpc/include/grpcpp/impl/codegen/completion_queue.h
5454
# NOTE(yuyang18):
5555
# Disable -Werror, otherwise the compile will fail in MacOS.
5656
# It seems that we cannot configure that by make command.

cmake/inference_lib.cmake

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,11 @@ if (WITH_ANAKIN AND WITH_GPU)
148148
list(APPEND inference_deps anakin_inference_lib)
149149
endif()
150150

151-
copy(inference_api_lib DEPS paddle_inference_api paddle_inference_api_shared
152-
SRCS ${src_dir}/${module}/paddle_inference_api.h
153-
${src_dir}/${module}/demo_ci
154-
${PADDLE_BINARY_DIR}/paddle/fluid/inference/api/libpaddle_inference_api*
155-
DSTS ${dst_dir}/inference ${dst_dir}/inference ${dst_dir}/inference
156-
)
157-
list(APPEND inference_deps inference_api_lib)
158-
159151
set(module "inference")
160152
copy(inference_lib DEPS ${inference_deps}
161153
SRCS ${src_dir}/${module}/*.h ${PADDLE_BINARY_DIR}/paddle/fluid/inference/libpaddle_fluid.*
162-
DSTS ${dst_dir}/${module} ${dst_dir}/${module}
154+
${src_dir}/${module}/api/paddle_inference_api.h ${src_dir}/${module}/api/demo_ci
155+
DSTS ${dst_dir}/${module} ${dst_dir}/${module} ${dst_dir}/${module} ${dst_dir}/${module}
163156
)
164157

165158
set(module "platform")

paddle/fluid/framework/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ cc_test(ddim_test SRCS ddim_test.cc DEPS ddim)
88
nv_test(dim_test SRCS dim_test.cu DEPS ddim)
99
cc_library(data_type SRCS data_type.cc DEPS framework_proto ddim device_context)
1010
if(WITH_GPU)
11-
nv_library(tensor SRCS tensor.cc tensor_util.cu DEPS place memory data_type)
11+
nv_library(tensor SRCS tensor.cc tensor_util.cu DEPS place memory data_type device_context)
1212
else()
13-
cc_library(tensor SRCS tensor.cc tensor_util.cc DEPS place memory data_type)
13+
cc_library(tensor SRCS tensor.cc tensor_util.cc DEPS place memory data_type device_context)
1414
endif()
1515

1616
cc_test(tensor_test SRCS tensor_test.cc DEPS tensor)
@@ -110,7 +110,7 @@ cc_test(selected_rows_test SRCS selected_rows_test.cc DEPS selected_rows)
110110

111111
cc_test(op_kernel_type_test SRCS op_kernel_type_test.cc DEPS place device_context framework_proto)
112112
cc_test(cow_ptr_tests SRCS details/cow_ptr_test.cc)
113-
113+
114114
# cc_test(channel_test SRCS channel_test.cc)
115115
cc_test(tuple_test SRCS tuple_test.cc )
116116

paddle/fluid/framework/details/multi_devices_graph_builder.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ void MultiDevSSAGraphBuilder::CreateRPCOp(ir::Graph *result,
715715
result->CreateOpNode(node->Op()), *node->Op(), local_scopes_[op_dev_id],
716716
node->Op()->Type(), places_[op_dev_id]));
717717

718+
// TODO(panyx0718): This might not be needed anymore.
718719
if (node->Op()->Type() == "send_barrier") {
719720
ConnectOp(result, result->Get<GraphOps>("ops").back().get(), "send");
720721
} else if (node->Op()->Type() == "recv") {

paddle/fluid/framework/ir/graph.cc

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,68 @@ namespace paddle {
2424
namespace framework {
2525
namespace ir {
2626

27+
std::vector<std::string> FindDistTrainSendVars(
28+
const std::vector<ir::Node *> &nodes) {
29+
std::vector<std::string> send_vars;
30+
// since parameters are all in block 0,
31+
// it's enough to only scan send ops in block 0
32+
for (auto &node : nodes) {
33+
auto op_vars = node->Op()->InputArgumentNames();
34+
send_vars.reserve(send_vars.size() +
35+
std::distance(op_vars.begin(), op_vars.end()));
36+
send_vars.insert(send_vars.end(), op_vars.begin(), op_vars.end());
37+
}
38+
return send_vars;
39+
}
40+
41+
std::vector<std::string> FindDistTrainRecvVars(
42+
const std::vector<ir::Node *> &nodes) {
43+
std::vector<std::string> recv_vars;
44+
for (auto &node : nodes) {
45+
auto op_vars = node->Op()->OutputArgumentNames();
46+
recv_vars.reserve(recv_vars.size() +
47+
std::distance(op_vars.begin(), op_vars.end()));
48+
recv_vars.insert(recv_vars.end(), op_vars.begin(), op_vars.end());
49+
}
50+
return recv_vars;
51+
}
52+
53+
bool IsDistTrainOp(ir::Node *node, const std::vector<std::string> &send_vars,
54+
const std::vector<std::string> &recv_vars) {
55+
if (send_vars.size() == 0 || recv_vars.size() == 0) {
56+
return false;
57+
}
58+
59+
/**
60+
* Check any of opvars contains `.block` and in sendvars
61+
*/
62+
auto checker = [](const std::vector<std::string> &opvars,
63+
const std::vector<std::string> &rpc_vars) -> bool {
64+
for (auto &var : opvars) {
65+
// a variable name with the suffix `.block` means it's a splited
66+
// variable by (DistributeTranspiler)
67+
// [python/paddle/fluid/transpiler/distribute_transpiler.py]
68+
if (var.find(".block") != std::string::npos &&
69+
std::find(rpc_vars.begin(), rpc_vars.end(), var) != rpc_vars.end()) {
70+
return true;
71+
}
72+
}
73+
return false;
74+
};
75+
76+
std::vector<std::string> input_var_names;
77+
std::vector<std::string> output_var_names;
78+
for (ir::Node *input : node->inputs) {
79+
input_var_names.push_back(input->Name());
80+
}
81+
for (ir::Node *output : node->outputs) {
82+
output_var_names.push_back(output->Name());
83+
}
84+
85+
return checker(output_var_names, send_vars) ||
86+
checker(input_var_names, recv_vars);
87+
}
88+
2789
Graph::Graph(const ProgramDesc &program) : program_(program) {
2890
VLOG(3) << "block in program:" << program_.Size();
2991
std::unordered_map<std::string, VarDesc *> all_vars;
@@ -61,6 +123,64 @@ Graph::Graph(const ProgramDesc &program) : program_(program) {
61123
var->inputs.push_back(node);
62124
}
63125
}
126+
127+
std::vector<ir::Node *> send_ops;
128+
ir::Node *send_bar = nullptr;
129+
std::vector<ir::Node *> recv_ops;
130+
ir::Node *fetch_bar = nullptr;
131+
for (ir::Node *node : Nodes()) {
132+
if (node->Name() == "send") {
133+
send_ops.push_back(node);
134+
} else if (node->Name() == "send_barrier") {
135+
PADDLE_ENFORCE(!send_bar, "only has one send barrier");
136+
send_bar = node;
137+
} else if (node->Name() == "recv") {
138+
recv_ops.push_back(node);
139+
} else if (node->Name() == "fetch_barrier") {
140+
PADDLE_ENFORCE(!fetch_bar, "only has one fetch barrier");
141+
fetch_bar = node;
142+
}
143+
}
144+
if (send_bar) {
145+
for (ir::Node *send : send_ops) {
146+
ir::Node *dep_var = CreateControlDepVar();
147+
send->outputs.push_back(dep_var);
148+
dep_var->inputs.push_back(send);
149+
send_bar->inputs.push_back(dep_var);
150+
dep_var->outputs.push_back(send_bar);
151+
}
152+
for (ir::Node *recv : recv_ops) {
153+
ir::Node *dep_var = CreateControlDepVar();
154+
recv->inputs.push_back(dep_var);
155+
dep_var->outputs.push_back(recv);
156+
send_bar->outputs.push_back(dep_var);
157+
dep_var->inputs.push_back(send_bar);
158+
}
159+
}
160+
if (fetch_bar) {
161+
for (ir::Node *recv : recv_ops) {
162+
ir::Node *dep_var = CreateControlDepVar();
163+
recv->outputs.push_back(dep_var);
164+
dep_var->inputs.push_back(recv);
165+
fetch_bar->inputs.push_back(dep_var);
166+
dep_var->outputs.push_back(fetch_bar);
167+
}
168+
}
169+
170+
std::vector<std::string> send_vars = FindDistTrainSendVars(send_ops);
171+
std::vector<std::string> recv_vars = FindDistTrainRecvVars(recv_ops);
172+
for (ir::Node *node : Nodes()) {
173+
if (IsDistTrainOp(node, send_vars, recv_vars)) {
174+
if (fetch_bar && node->Name() == "concat") {
175+
ir::Node *dep_var = CreateControlDepVar();
176+
fetch_bar->outputs.push_back(dep_var);
177+
dep_var->inputs.push_back(fetch_bar);
178+
node->inputs.push_back(dep_var);
179+
dep_var->outputs.push_back(node);
180+
}
181+
}
182+
}
183+
64184
/**
65185
* We only handle write after read(WAR), since it should not have a write
66186
* after write in program. If there are write after write operators, we need

paddle/fluid/inference/CMakeLists.txt

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@ cc_library(paddle_fluid_api
1414

1515
get_property(fluid_modules GLOBAL PROPERTY FLUID_MODULES)
1616

17+
# paddle_fluid_origin exclude inference api interface
18+
cc_library(paddle_fluid_origin DEPS ${fluid_modules} paddle_fluid_api)
19+
20+
if(NOT APPLE)
21+
add_subdirectory(api)
22+
endif()
23+
1724
# Create static library
18-
cc_library(paddle_fluid DEPS ${fluid_modules} paddle_fluid_api)
25+
cc_library(paddle_fluid DEPS ${fluid_modules} paddle_fluid_api paddle_inference_api)
1926
if(NOT APPLE)
2027
# TODO(liuyiqu: Temporarily disable the link flag because it is not support on Mac.
2128
set(LINK_FLAGS "-Wl,--retain-symbols-file ${CMAKE_CURRENT_SOURCE_DIR}/paddle_fluid.sym")
@@ -24,20 +31,29 @@ endif()
2431

2532
# Create shared library
2633
cc_library(paddle_fluid_shared SHARED
27-
SRCS io.cc
34+
SRCS io.cc ${CMAKE_CURRENT_SOURCE_DIR}/api/api.cc ${CMAKE_CURRENT_SOURCE_DIR}/api/api_impl.cc
2835
DEPS ${fluid_modules} paddle_fluid_api)
2936

3037
set_target_properties(paddle_fluid_shared PROPERTIES OUTPUT_NAME paddle_fluid)
3138
if(NOT APPLE)
3239
# TODO(liuyiqun): Temporarily disable the link flag because it is not support on Mac.
3340
set(LINK_FLAGS "-Wl,--version-script ${CMAKE_CURRENT_SOURCE_DIR}/paddle_fluid.map")
3441
set_target_properties(paddle_fluid_shared PROPERTIES LINK_FLAGS "${LINK_FLAGS}")
42+
# check symbol hidden
43+
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/check_symbol.cmake
44+
"execute_process(COMMAND bash -c \"${CMAKE_CURRENT_SOURCE_DIR}/check_symbol.sh"
45+
" ${CMAKE_CURRENT_BINARY_DIR}/libpaddle_fluid.so\" RESULT_VARIABLE symbol_res)\n"
46+
"if(NOT \"\${symbol_res}\" STREQUAL \"0\")\n"
47+
" message(FATAL_ERROR \"Check symbol failed.\")\n"
48+
"endif()\n")
49+
add_custom_command(
50+
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/.check_symbol"
51+
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/check_symbol.cmake"
52+
DEPENDS paddle_fluid_shared)
53+
add_custom_target(check_symbol ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/.check_symbol")
3554
endif()
3655

3756
if(WITH_TESTING)
3857
# both tests/book and analysis depends the models that generated by python/paddle/fluid/tests/book
3958
add_subdirectory(tests/book)
4059
endif()
41-
if(NOT APPLE)
42-
add_subdirectory(api)
43-
endif()

paddle/fluid/inference/api/CMakeLists.txt

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -42,35 +42,8 @@ function(inference_api_test TARGET_NAME)
4242
endif(WITH_TESTING)
4343
endfunction(inference_api_test)
4444

45-
cc_library(paddle_inference_api
46-
SRCS api.cc api_impl.cc
47-
DEPS ${FLUID_CORE_MODULES} ${GLOB_OP_LIB})
48-
if(NOT APPLE)
49-
set(LINK_FLAGS "-Wl,--retain-symbols-file ${CMAKE_CURRENT_SOURCE_DIR}/api.sym")
50-
set_target_properties(paddle_inference_api PROPERTIES LINK_FLAGS "${LINK_FLAGS}")
51-
endif()
52-
53-
# Here the shared library doesn't depend on other fluid libraries, or double free will occur.
54-
cc_library(paddle_inference_api_shared SHARED
55-
SRCS api.cc api_impl.cc)
56-
add_dependencies(paddle_inference_api_shared ${FLUID_CORE_MODULES} ${GLOB_OP_LIB})
57-
set_target_properties(paddle_inference_api_shared PROPERTIES OUTPUT_NAME paddle_inference_api)
45+
cc_library(paddle_inference_api SRCS api.cc api_impl.cc DEPS lod_tensor)
5846

59-
if(NOT APPLE)
60-
set(LINK_FLAGS "-Wl,--version-script ${CMAKE_CURRENT_SOURCE_DIR}/api.map")
61-
set_target_properties(paddle_inference_api_shared PROPERTIES LINK_FLAGS "${LINK_FLAGS}")
62-
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/check_symbol.cmake
63-
"execute_process(COMMAND bash -c \"${CMAKE_CURRENT_SOURCE_DIR}/check_symbol.sh"
64-
" ${CMAKE_CURRENT_BINARY_DIR}/libpaddle_inference_api.so\" RESULT_VARIABLE symbol_res)\n"
65-
"if(NOT \"\${symbol_res}\" STREQUAL \"0\")\n"
66-
" message(FATAL_ERROR \"Check symbol failed.\")\n"
67-
"endif()\n")
68-
add_custom_command(
69-
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/.check_symbol"
70-
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/check_symbol.cmake"
71-
DEPENDS paddle_inference_api_shared)
72-
add_custom_target(check_symbol ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/.check_symbol")
73-
endif()
7447

7548
cc_test(test_paddle_inference_api
7649
SRCS api_tester.cc

paddle/fluid/inference/api/api.map

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)