Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
6cd79701
P
Paddle
项目概览
机器未来
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
6cd79701
编写于
7月 12, 2022
作者:
W
wanghuancoder
提交者:
GitHub
7月 12, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[Eager] split coed gen for eager fluid_generated (#44177)
* split coed gen for eager fluid_generated
上级
be746adf
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
340 addition
and
227 deletion
+340
-227
.gitignore
.gitignore
+1
-2
paddle/fluid/eager/auto_code_generator/CMakeLists.txt
paddle/fluid/eager/auto_code_generator/CMakeLists.txt
+6
-58
paddle/fluid/eager/auto_code_generator/eager_generator.cc
paddle/fluid/eager/auto_code_generator/eager_generator.cc
+75
-26
paddle/fluid/eager/auto_code_generator/final_state_generator/CMakeLists.txt
.../auto_code_generator/final_state_generator/CMakeLists.txt
+2
-3
paddle/fluid/eager/auto_code_generator/final_state_generator/python_c_gen.py
...auto_code_generator/final_state_generator/python_c_gen.py
+21
-17
paddle/fluid/eager/auto_code_generator/generate_file_structures.py
...uid/eager/auto_code_generator/generate_file_structures.py
+54
-10
paddle/fluid/pybind/.gitignore
paddle/fluid/pybind/.gitignore
+3
-4
paddle/fluid/pybind/CMakeLists.txt
paddle/fluid/pybind/CMakeLists.txt
+47
-33
paddle/fluid/pybind/eager.cc
paddle/fluid/pybind/eager.cc
+1
-1
paddle/fluid/pybind/eager.h
paddle/fluid/pybind/eager.h
+2
-1
paddle/fluid/pybind/eager_custom_python_api.h
paddle/fluid/pybind/eager_custom_python_api.h
+8
-47
paddle/fluid/pybind/eager_final_state_custom_python_api.h
paddle/fluid/pybind/eager_final_state_custom_python_api.h
+73
-0
paddle/fluid/pybind/eager_op_function_generator.cc
paddle/fluid/pybind/eager_op_function_generator.cc
+12
-19
paddle/fluid/pybind/generate_file_structures.py
paddle/fluid/pybind/generate_file_structures.py
+28
-0
paddle/fluid/pybind/op_function.h
paddle/fluid/pybind/op_function.h
+2
-3
paddle/fluid/pybind/op_function_generator.cc
paddle/fluid/pybind/op_function_generator.cc
+5
-3
未找到文件。
.gitignore
浏览文件 @
6cd79701
...
...
@@ -65,8 +65,7 @@ paddle/infrt/dialect/pd/common/pd_ops_info.h
paddle/infrt/tests/dialect/Output
paddle/infrt/tests/lit.cfg.py
paddle/infrt/kernel/phi/infershaped/infershaped_kernel_launchers.cc
paddle/fluid/pybind/eager_final_state_op_function_impl.h
paddle/fluid/pybind/tmp_eager_final_state_op_function_impl.h
paddle/fluid/pybind/eager_final_state_op_function.cc
# these files (directories) are generated before build system generation
paddle/fluid/operators/generated_op.cc
...
...
paddle/fluid/eager/auto_code_generator/CMakeLists.txt
浏览文件 @
6cd79701
...
...
@@ -26,36 +26,14 @@ endif()
message
(
"Generate dygraph file structure at path:
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/generated"
)
set
(
CODE_GEN_SPLIT_FILE_COUNT
"8"
)
execute_process
(
COMMAND
"
${
PYTHON_EXECUTABLE
}
"
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/auto_code_generator/generate_file_structures.py"
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/"
)
set
(
tmp_dygraph_forward_h_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/dygraph_forward_api.tmp.h"
)
set
(
tmp_dygraph_forward_cc_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions.tmp.cc"
)
set
(
tmp_dygraph_node_h_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes.tmp.h"
)
set
(
tmp_dygraph_node_cc_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes.tmp.cc"
)
set
(
dygraph_forward_h_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/dygraph_forward_api.h"
)
set
(
dygraph_forward_cc_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions.cc"
)
set
(
dygraph_node_h_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes.h"
)
set
(
dygraph_node_cc_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes.cc"
)
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/"
"
${
CODE_GEN_SPLIT_FILE_COUNT
}
"
)
if
(
WIN32
)
set
(
EAGER_CODEGEN_DEPS eager_generator
)
...
...
@@ -114,22 +92,7 @@ if(WIN32)
COMMAND
"
${
eager_generator_path
}
/eager_generator.exe"
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_forward_h_path
}
${
dygraph_forward_h_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_forward_h_path
}
to
${
dygraph_forward_h_path
}
"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_forward_cc_path
}
${
dygraph_forward_cc_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_forward_cc_path
}
to
${
dygraph_forward_cc_path
}
"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_node_h_path
}
${
dygraph_node_h_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_node_h_path
}
to
${
dygraph_node_h_path
}
"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_node_cc_path
}
${
dygraph_node_cc_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_node_cc_path
}
to
${
dygraph_node_cc_path
}
"
"
${
CODE_GEN_SPLIT_FILE_COUNT
}
"
DEPENDS
${
EAGER_CODEGEN_DEPS
}
VERBATIM
)
else
()
...
...
@@ -140,22 +103,7 @@ else()
"LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:
${
CMAKE_CURRENT_BINARY_DIR
}
/../../pybind"
"
${
CMAKE_CURRENT_BINARY_DIR
}
/eager_generator"
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/eager/api/generated/fluid_generated"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_forward_h_path
}
${
dygraph_forward_h_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_forward_h_path
}
to
${
dygraph_forward_h_path
}
"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_forward_cc_path
}
${
dygraph_forward_cc_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_forward_cc_path
}
to
${
dygraph_forward_cc_path
}
"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_node_h_path
}
${
dygraph_node_h_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_node_h_path
}
to
${
dygraph_node_h_path
}
"
COMMAND
${
CMAKE_COMMAND
}
-E copy_if_different
${
tmp_dygraph_node_cc_path
}
${
dygraph_node_cc_path
}
COMMENT
"copy_if_different
${
tmp_dygraph_node_cc_path
}
to
${
dygraph_node_cc_path
}
"
"
${
CODE_GEN_SPLIT_FILE_COUNT
}
"
DEPENDS eager_generator
VERBATIM
)
endif
()
paddle/fluid/eager/auto_code_generator/eager_generator.cc
浏览文件 @
6cd79701
...
...
@@ -3108,7 +3108,8 @@ static std::string GenerateCoreOpsReturnsInfo() {
return
core_ops_info_str
;
}
static
void
DygraphCodeGeneration
(
const
std
::
string
&
output_dir
)
{
static
void
DygraphCodeGeneration
(
const
std
::
string
&
output_dir
,
int
split_count
)
{
std
::
string
dygraph_forward_api_str
=
GenerateDygraphHFileIncludes
();
std
::
string
fwd_function_str
=
""
;
std
::
string
grad_node_h_str
=
""
;
...
...
@@ -3116,6 +3117,8 @@ static void DygraphCodeGeneration(const std::string& output_dir) {
auto
&
op_info_map
=
paddle
::
framework
::
OpInfoMap
::
Instance
().
map
();
paddle
::
flat_hash_map
<
std
::
string
,
OpInfo
>
op_info_map_need_gen
;
for
(
auto
&
pair
:
op_info_map
)
{
const
OpInfo
&
op_info
=
pair
.
second
;
proto
::
OpProto
*
op_proto
=
op_info
.
proto_
;
...
...
@@ -3126,6 +3129,31 @@ static void DygraphCodeGeneration(const std::string& output_dir) {
continue
;
}
GradNodeGenerationInfo
bwd_info
;
bool
is_available
=
CollectGradInformationFromOpInfo
(
op_info
,
&
bwd_info
);
if
(
!
is_available
&&
!
bwd_info
.
GenerateForwardOnly
())
{
VLOG
(
6
)
<<
"Skipped operator: "
<<
op_type
;
continue
;
}
op_info_map_need_gen
.
emplace
(
pair
);
}
int
each_cc_file_api_size
=
op_info_map_need_gen
.
size
()
/
split_count
;
if
(
op_info_map_need_gen
.
size
()
%
split_count
!=
0
)
{
each_cc_file_api_size
++
;
}
int
api_index
=
0
;
int
file_index
=
0
;
for
(
auto
&
pair
:
op_info_map_need_gen
)
{
const
OpInfo
&
op_info
=
pair
.
second
;
proto
::
OpProto
*
op_proto
=
op_info
.
proto_
;
const
std
::
string
&
op_type
=
op_proto
->
type
();
/* ----------------------------- */
/* ---- Collect Information ---- */
/* ----------------------------- */
...
...
@@ -3137,12 +3165,7 @@ static void DygraphCodeGeneration(const std::string& output_dir) {
CollectForwardInformationFromOpInfo
(
op_info
,
&
fwd_info
);
bool
is_available
=
CollectGradInformationFromOpInfo
(
op_info
,
&
bwd_info
);
if
(
!
is_available
&&
!
bwd_info
.
GenerateForwardOnly
())
{
VLOG
(
6
)
<<
"Skipped operator: "
<<
op_type
;
continue
;
}
CollectGradInformationFromOpInfo
(
op_info
,
&
bwd_info
);
VLOG
(
6
)
<<
"-------- PurifyOpProto -------"
;
PurifyForwardOpProto
(
*
op_proto
,
&
fwd_info
);
...
...
@@ -3188,25 +3211,54 @@ static void DygraphCodeGeneration(const std::string& output_dir) {
dygraph_forward_api_str
+=
inplace_fwd_function_declare_str
;
}
if
(
bwd_info
.
GenerateForwardOnly
())
continue
;
VLOG
(
6
)
<<
"-------- GenerateGradNodeHeaderContents -------"
;
grad_node_h_str
+=
GenerateGradNodeHeaderContents
(
fwd_info
,
bwd_info
);
grad_node_h_str
+=
"
\n
"
;
if
(
!
bwd_info
.
GenerateForwardOnly
())
{
VLOG
(
6
)
<<
"-------- GenerateGradNodeHeaderContents -------"
;
grad_node_h_str
+=
GenerateGradNodeHeaderContents
(
fwd_info
,
bwd_info
);
grad_node_h_str
+=
"
\n
"
;
VLOG
(
6
)
<<
"-------- GenerateGradNodeCCContents -------"
;
grad_node_cc_str
+=
GenerateGradNodeCCContents
(
fwd_info
,
bwd_info
);
grad_node_cc_str
+=
"
\n
"
;
VLOG
(
6
)
<<
"-------- GenerateGradNodeCCContents -------"
;
grad_node_cc_str
+=
GenerateGradNodeCCContents
(
fwd_info
,
bwd_info
);
grad_node_cc_str
+=
"
\n
"
;
}
VLOG
(
6
)
<<
op_type
<<
": Finished Generating Op: "
<<
op_type
;
api_index
++
;
if
(
api_index
/
each_cc_file_api_size
>
file_index
)
{
file_index
++
;
VLOG
(
6
)
<<
"-------- GenerateDygraphForwardCCFile -------"
;
std
::
string
forward_cc_path
=
output_dir
+
"/forwards/dygraph_forward_functions"
+
std
::
to_string
(
file_index
)
+
".tmp.cc"
;
fwd_function_str
+=
"
\n
"
;
GenerateForwardDygraphFile
(
forward_cc_path
,
fwd_function_str
);
fwd_function_str
=
""
;
VLOG
(
6
)
<<
"-------- GenerateNodeCCFile -------"
;
std
::
string
node_cc_path
=
output_dir
+
"/nodes/nodes"
+
std
::
to_string
(
file_index
)
+
".tmp.cc"
;
GenerateNodeCCFile
(
node_cc_path
,
grad_node_cc_str
);
grad_node_cc_str
=
""
;
}
}
file_index
++
;
VLOG
(
6
)
<<
"-------- GenerateDygraphForwardCCFile -------"
;
std
::
string
forward_cc_path
=
output_dir
+
"/forwards/dygraph_forward_functions.tmp.cc"
;
fwd_function_str
+=
"
\n
"
;
fwd_function_str
+=
GenerateCoreOpsReturnsInfo
();
std
::
string
forward_cc_path
=
output_dir
+
"/forwards/dygraph_forward_functions"
+
std
::
to_string
(
file_index
)
+
".tmp.cc"
;
GenerateForwardDygraphFile
(
forward_cc_path
,
fwd_function_str
);
fwd_function_str
=
""
;
GenerateForwardDygraphFile
(
output_dir
+
"/forwards/dygraph_forward_functions_args_info.tmp.cc"
,
GenerateCoreOpsReturnsInfo
());
VLOG
(
6
)
<<
"-------- GenerateNodeCCFile -------"
;
std
::
string
node_cc_path
=
output_dir
+
"/nodes/nodes"
+
std
::
to_string
(
file_index
)
+
".tmp.cc"
;
GenerateNodeCCFile
(
node_cc_path
,
grad_node_cc_str
);
grad_node_cc_str
=
""
;
VLOG
(
6
)
<<
"-------- GenerateForwardHFile -------"
;
std
::
string
dygraph_forward_api_path
=
...
...
@@ -3216,26 +3268,23 @@ static void DygraphCodeGeneration(const std::string& output_dir) {
VLOG
(
6
)
<<
"-------- GenerateNodeHFile -------"
;
std
::
string
node_h_path
=
output_dir
+
"/nodes/nodes.tmp.h"
;
GenerateNodeHFile
(
node_h_path
,
grad_node_h_str
);
VLOG
(
6
)
<<
"-------- GenerateNodeCCFile -------"
;
std
::
string
node_cc_path
=
output_dir
+
"/nodes/nodes.tmp.cc"
;
GenerateNodeCCFile
(
node_cc_path
,
grad_node_cc_str
);
}
}
// namespace framework
}
// namespace paddle
int
main
(
int
argc
,
char
*
argv
[])
{
if
(
argc
!=
2
)
{
std
::
cerr
<<
"argc must be
2
"
<<
std
::
endl
;
if
(
argc
!=
3
)
{
std
::
cerr
<<
"argc must be
3
"
<<
std
::
endl
;
return
-
1
;
}
std
::
string
eager_root
=
argv
[
1
];
int
split_count
=
atoi
(
argv
[
2
]);
paddle
::
framework
::
PrepareAttrMapForOps
();
paddle
::
framework
::
DygraphCodeGeneration
(
eager_root
);
paddle
::
framework
::
DygraphCodeGeneration
(
eager_root
,
split_count
);
return
0
;
}
paddle/fluid/eager/auto_code_generator/final_state_generator/CMakeLists.txt
浏览文件 @
6cd79701
...
...
@@ -54,11 +54,10 @@ add_custom_target(
VERBATIM
)
set
(
tmp_python_c_output_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/pybind/
tmp_eager_final_state_op_function_impl.h
"
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/pybind/
eager_final_state_op_function.cc.tmp
"
)
set
(
python_c_output_path
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/pybind/eager_final_state_op_function_impl.h"
)
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/pybind/eager_final_state_op_function.cc"
)
add_custom_target
(
eager_final_state_python_c_codegen
...
...
paddle/fluid/eager/auto_code_generator/final_state_generator/python_c_gen.py
浏览文件 @
6cd79701
...
...
@@ -139,22 +139,16 @@ PYTHON_C_FUNCTION_REG_TEMPLATE = \
PYTHON_C_WRAPPER_TEMPLATE
=
\
"""
#pragma once
#include "pybind11/detail/common.h"
#include "paddle/phi/api/all.h"
#include "paddle/phi/api/lib/dygraph_api.h"
#include "paddle/phi/common/backend.h"
#include "paddle/phi/common/data_type.h"
#include "paddle/phi/common/scalar.h"
#include "paddle/phi/common/int_array.h"
#include "paddle/phi/api/include/sparse_api.h"
#include "paddle/phi/api/include/strings_api.h"
#include "paddle/fluid/pybind/op_function_common.h"
#include "paddle/fluid/eager/api/generated/eager_generated/forwards/dygraph_functions.h"
#include "paddle/fluid/pybind/exception.h"
#include "paddle/fluid/platform/profiler/event_tracing.h"
#include <Python.h>
#include <Python.h>
#include "paddle/fluid/platform/enforce.h"
#include "paddle/phi/api/include/strings_api.h"
#include "paddle/fluid/pybind/eager_utils.h"
#include "paddle/fluid/pybind/exception.h"
#include "paddle/fluid/platform/profiler/event_tracing.h"
#include "paddle/fluid/pybind/op_function_common.h"
#include "paddle/fluid/eager/api/generated/eager_generated/forwards/dygraph_functions.h"
#include "paddle/fluid/pybind/eager_final_state_custom_python_api.h"
#include "paddle/fluid/pybind/eager.h"
namespace paddle {{
namespace pybind {{
...
...
@@ -165,6 +159,16 @@ static PyMethodDef EagerFinalStateMethods[] = {{
{}
}};
void BindFinalStateEagerOpFunctions(pybind11::module *module) {{
if (PyModule_AddFunctions(module->ptr(), EagerFinalStateMethods) < 0) {{
PADDLE_THROW(platform::errors::Fatal ("Add functions to core.eager.ops failed!"));
}}
if (PyModule_AddFunctions(module->ptr(), CustomEagerFinalStateMethods) < 0) {{
PADDLE_THROW(platform::errors::Fatal ("Add functions to core.eager.ops failed!"));
}}
}}
}} // namespace pybind
}} // namespace paddle
"""
...
...
@@ -449,8 +453,8 @@ class PythonCGenerator(GeneratorBase):
def
GeneratePythonCFunctions
(
self
):
namespace
=
self
.
namespace
forward_api_list
=
self
.
forward_api_list
forward_api_list
=
self
.
forward_api_list
for
forward_api_content
in
forward_api_list
:
f_generator
=
PythonCSingleFunctionGenerator
(
forward_api_content
,
namespace
)
...
...
paddle/fluid/eager/auto_code_generator/generate_file_structures.py
浏览文件 @
6cd79701
...
...
@@ -53,7 +53,7 @@ def GenerateFileStructureForFinalDygraph(eager_dir):
open
(
path
,
'a'
).
close
()
def
GenerateFileStructureForIntermediateDygraph
(
eager_dir
):
def
GenerateFileStructureForIntermediateDygraph
(
eager_dir
,
split_count
):
"""
paddle/fluid/eager
|- generated
...
...
@@ -86,11 +86,16 @@ def GenerateFileStructureForIntermediateDygraph(eager_dir):
dygraph_forward_api_h_path
=
os
.
path
.
join
(
generated_dir
,
"dygraph_forward_api.h"
)
empty_files
=
[
dygraph_forward_api_h_path
]
empty_files
.
append
(
os
.
path
.
join
(
forwards_dir
,
"dygraph_forward_functions.cc"
))
empty_files
.
append
(
os
.
path
.
join
(
nodes_dir
,
"nodes.cc"
))
empty_files
.
append
(
os
.
path
.
join
(
nodes_dir
,
"nodes.h"
))
for
i
in
range
(
split_count
):
empty_files
.
append
(
os
.
path
.
join
(
forwards_dir
,
"dygraph_forward_functions"
+
str
(
i
+
1
)
+
".cc"
))
empty_files
.
append
(
os
.
path
.
join
(
nodes_dir
,
"nodes"
+
str
(
i
+
1
)
+
".cc"
))
empty_files
.
append
(
os
.
path
.
join
(
forwards_dir
,
"dygraph_forward_functions_args_info.cc"
))
for
path
in
empty_files
:
if
not
os
.
path
.
exists
(
path
):
open
(
path
,
'a'
).
close
()
...
...
@@ -102,23 +107,62 @@ def GenerateFileStructureForIntermediateDygraph(eager_dir):
forwards_level_cmakelist_path
=
os
.
path
.
join
(
forwards_dir
,
"CMakeLists.txt"
)
with
open
(
nodes_level_cmakelist_path
,
"w"
)
as
f
:
f
.
write
(
"add_custom_target(
\n
"
)
f
.
write
(
" copy_dygraph_node
\n
"
)
f
.
write
(
"
cc_library(dygraph_node SRCS nodes.cc DEPS ${eager_deps} ${fluid_deps} ${fluid_manual_nodes})
\n
"
"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes.tmp.h
\"
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes.h
\"
\n
"
)
f
.
write
(
"add_dependencies(dygraph_node eager_codegen)"
)
for
i
in
range
(
split_count
):
f
.
write
(
" COMMAND ${CMAKE_COMMAND} -E copy_if_different
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes"
+
str
(
i
+
1
)
+
".tmp.cc
\"
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/nodes/nodes"
+
str
(
i
+
1
)
+
".cc
\"\n
"
)
f
.
write
(
" DEPENDS eager_codegen
\n
"
)
f
.
write
(
" VERBATIM)
\n
"
)
f
.
write
(
"cc_library(dygraph_node SRCS "
)
for
i
in
range
(
split_count
):
f
.
write
(
"nodes"
+
str
(
i
+
1
)
+
".cc "
)
f
.
write
(
"DEPS ${eager_deps} ${fluid_deps} ${fluid_manual_nodes})
\n
"
)
f
.
write
(
"add_dependencies(dygraph_node copy_dygraph_node)"
)
with
open
(
forwards_level_cmakelist_path
,
"w"
)
as
f
:
f
.
write
(
"add_custom_target(
\n
"
)
f
.
write
(
" copy_dygraph_forward_functions
\n
"
)
f
.
write
(
"
cc_library(dygraph_function SRCS dygraph_forward_functions.cc DEPS ${eager_deps} ${fluid_deps} ${GLOB_OP_LIB} ${GLOB_OPERATOR_DEPS} ${fluid_manual_functions})
\n
"
"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/dygraph_forward_api.tmp.h
\"
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/dygraph_forward_api.h
\"
\n
"
)
f
.
write
(
"add_dependencies(dygraph_function eager_codegen)"
)
for
i
in
range
(
split_count
):
f
.
write
(
" COMMAND ${CMAKE_COMMAND} -E copy_if_different
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions"
+
str
(
i
+
1
)
+
".tmp.cc
\"
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions"
+
str
(
i
+
1
)
+
".cc
\"\n
"
)
f
.
write
(
" COMMAND ${CMAKE_COMMAND} -E copy_if_different
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions_args_info.tmp.cc
\"
\"
${PADDLE_SOURCE_DIR}/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions_args_info.cc
\"\n
"
)
f
.
write
(
" DEPENDS eager_codegen
\n
"
)
f
.
write
(
" VERBATIM)
\n
"
)
f
.
write
(
"cc_library(dygraph_function SRCS "
)
for
i
in
range
(
split_count
):
f
.
write
(
"dygraph_forward_functions"
+
str
(
i
+
1
)
+
".cc "
)
f
.
write
(
"dygraph_forward_functions_args_info.cc "
)
f
.
write
(
"DEPS ${eager_deps} ${fluid_deps} ${GLOB_OP_LIB} ${GLOB_OPERATOR_DEPS} ${fluid_manual_functions})
\n
"
)
f
.
write
(
"add_dependencies(dygraph_function copy_dygraph_forward_functions)"
)
with
open
(
generated_level_cmakelist_path
,
"w"
)
as
f
:
f
.
write
(
"add_subdirectory(forwards)
\n
add_subdirectory(nodes)"
)
if
__name__
==
"__main__"
:
assert
len
(
sys
.
argv
)
==
2
assert
len
(
sys
.
argv
)
==
3
eager_dir
=
sys
.
argv
[
1
]
GenerateFileStructureForIntermediateDygraph
(
eager_dir
)
split_count
=
int
(
sys
.
argv
[
2
])
GenerateFileStructureForIntermediateDygraph
(
eager_dir
,
split_count
)
GenerateFileStructureForFinalDygraph
(
eager_dir
)
paddle/fluid/pybind/.gitignore
浏览文件 @
6cd79701
pybind.h
op_function_impl.h
eager_op_function_impl.h
eager_final_state_op_function_impl.h
tmp_eager_final_state_op_function_impl.h
op_function.cc
eager_op_function.cc
eager_final_state_op_function.cc
paddle/fluid/pybind/CMakeLists.txt
浏览文件 @
6cd79701
...
...
@@ -101,11 +101,16 @@ endif()
set
(
PYBIND_SRCS
pybind.cc
exception.cc
imperative.cc
op_function.cc
inference_api.cc
ir.cc
bind_fleet_executor.cc
reader_py.cc
protobuf.cc
exception.cc
const_value.cc
global_value_getter_setter.cc
reader_py.cc
fleet_wrapper_py.cc
heter_wrapper_py.cc
ps_gpu_wrapper_py.cc
...
...
@@ -113,11 +118,7 @@ set(PYBIND_SRCS
box_helper_py.cc
metrics_py.cc
data_set_py.cc
imperative.cc
ir.cc
bind_cost_model.cc
bind_fleet_executor.cc
inference_api.cc
compatible.cc
io.cc
generator_py.cc
...
...
@@ -125,6 +126,12 @@ set(PYBIND_SRCS
cuda_streams_py.cc
jit.cc
)
execute_process
(
COMMAND
"
${
PYTHON_EXECUTABLE
}
"
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/pybind/generate_file_structures.py"
"
${
PADDLE_SOURCE_DIR
}
/paddle/fluid/pybind/"
)
if
(
WITH_CUSTOM_DEVICE
)
set
(
PYBIND_DEPS
${
PYBIND_DEPS
}
phi_capi
)
endif
()
...
...
@@ -189,7 +196,8 @@ if(WITH_PSCORE)
set_source_files_properties
(
fleet_py.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
list
(
APPEND PYBIND_DEPS fleet communicator index_wrapper index_sampler
)
list
(
APPEND PYBIND_SRCS fleet_py.cc
)
list
(
APPEND PYBIND_SRCS
)
set
(
PYBIND_SRCS fleet_py.cc
${
PYBIND_SRCS
}
)
endif
()
if
(
WITH_NCCL OR WITH_RCCL
)
...
...
@@ -259,10 +267,10 @@ if(WITH_PYTHON)
target_link_libraries
(
kernel_signature_generator
${
ROCM_HIPRTC_LIB
}
)
endif
()
set
(
impl_file
${
CMAKE_SOURCE_DIR
}
/paddle/fluid/pybind/op_function
_impl.h
)
set
(
impl_file
${
CMAKE_SOURCE_DIR
}
/paddle/fluid/pybind/op_function
.cc
)
set
(
tmp_impl_file
${
impl_file
}
.tmp
)
set
(
eager_impl_file
${
CMAKE_SOURCE_DIR
}
/paddle/fluid/pybind/eager_op_function
_impl.h
)
${
CMAKE_SOURCE_DIR
}
/paddle/fluid/pybind/eager_op_function
.cc
)
set
(
tmp_eager_impl_file
${
eager_impl_file
}
.tmp
)
set
(
OP_IMPL_DEPS op_function_generator
)
...
...
@@ -461,30 +469,31 @@ if(WITH_PYTHON)
list
(
APPEND PYBIND_DEPS op_function_common
)
if
(
NOT
((
NOT WITH_PYTHON
)
AND ON_INFER
))
cc_library
(
paddle_eager
SRCS eager.cc eager_functions.cc eager_method.cc eager_properties.cc
eager_utils.cc eager_py_layer.cc
DEPS eager_api
autograd_meta
backward
grad_node_info
phi
op_function_common
final_dygraph_function
final_dygraph_node
dygraph_function
dygraph_node
accumulation_node
py_layer_node
global_utils
utils
python
custom_operator
custom_operator_node
)
add_dependencies
(
paddle_eager eager_codegen
)
add_dependencies
(
paddle_eager eager_op_function_generator_cmd
)
list
(
APPEND PYBIND_DEPS paddle_eager
)
set
(
PYBIND_SRCS eager.cc
${
PYBIND_SRCS
}
)
set
(
PYBIND_SRCS eager_functions.cc
${
PYBIND_SRCS
}
)
set
(
PYBIND_SRCS eager_method.cc
${
PYBIND_SRCS
}
)
set
(
PYBIND_SRCS eager_properties.cc
${
PYBIND_SRCS
}
)
set
(
PYBIND_SRCS eager_utils.cc
${
PYBIND_SRCS
}
)
set
(
PYBIND_SRCS eager_py_layer.cc
${
PYBIND_SRCS
}
)
set
(
PYBIND_SRCS eager_op_function.cc
${
PYBIND_SRCS
}
)
set
(
PYBIND_SRCS eager_final_state_op_function.cc
${
PYBIND_SRCS
}
)
list
(
APPEND PYBIND_DEPS eager_api
)
list
(
APPEND PYBIND_DEPS autograd_meta
)
list
(
APPEND PYBIND_DEPS backward
)
list
(
APPEND PYBIND_DEPS grad_node_info
)
list
(
APPEND PYBIND_DEPS phi
)
list
(
APPEND PYBIND_DEPS op_function_common
)
list
(
APPEND PYBIND_DEPS final_dygraph_function
)
list
(
APPEND PYBIND_DEPS final_dygraph_node
)
list
(
APPEND PYBIND_DEPS dygraph_function
)
list
(
APPEND PYBIND_DEPS dygraph_node
)
list
(
APPEND PYBIND_DEPS accumulation_node
)
list
(
APPEND PYBIND_DEPS py_layer_node
)
list
(
APPEND PYBIND_DEPS global_utils
)
list
(
APPEND PYBIND_DEPS utils
)
list
(
APPEND PYBIND_DEPS python
)
list
(
APPEND PYBIND_DEPS custom_operator
)
list
(
APPEND PYBIND_DEPS custom_operator_node
)
endif
()
cc_library
(
...
...
@@ -492,6 +501,11 @@ if(WITH_PYTHON)
SRCS
${
PYBIND_SRCS
}
DEPS
${
PYBIND_DEPS
}
${
GLOB_OP_LIB
}
${
GLOB_OPERATOR_DEPS
}
)
if
(
NOT
((
NOT WITH_PYTHON
)
AND ON_INFER
))
add_dependencies
(
paddle_pybind eager_codegen
)
add_dependencies
(
paddle_pybind eager_op_function_generator_cmd
)
endif
()
if
(
NOT APPLE AND NOT WIN32
)
target_link_libraries
(
paddle_pybind rt
)
endif
()
...
...
paddle/fluid/pybind/eager.cc
浏览文件 @
6cd79701
...
...
@@ -33,7 +33,7 @@ limitations under the License. */
#include "pybind11/pybind11.h"
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#include "paddle/fluid/framework/python_headers.h"
#include "paddle/fluid/pybind/e
ager_op_function_impl
.h"
#include "paddle/fluid/pybind/e
xception
.h"
#include "paddle/fluid/pybind/tensor_py.h"
#include "paddle/phi/api/lib/utils/tensor_utils.h"
#include "paddle/phi/core/string_tensor.h"
...
...
paddle/fluid/pybind/eager.h
浏览文件 @
6cd79701
...
...
@@ -40,6 +40,7 @@ void BindEager(pybind11::module* m);
void
BindEagerStringTensor
(
pybind11
::
module
*
module
);
void
BindFunctions
(
PyObject
*
module
);
void
BindEagerPyLayer
(
PyObject
*
module
);
void
BindEagerOpFunctions
(
pybind11
::
module
*
module
);
void
BindFinalStateEagerOpFunctions
(
pybind11
::
module
*
module
);
}
// namespace pybind
}
// namespace paddle
paddle/fluid/pybind/eager_custom_python_api.h
浏览文件 @
6cd79701
...
...
@@ -15,8 +15,12 @@
#include <iostream>
#include "paddle/fluid/eager/to_static/run_program_op_func.h"
#include "paddle/phi/core/enforce.h"
namespace
paddle
{
namespace
pybind
{
static
PyObject
*
eager_api_run_program
(
PyObject
*
self
,
PyObject
*
args
,
PyObject
*
kwargs
)
{
...
...
@@ -57,55 +61,12 @@ static PyObject *eager_api_run_program(PyObject *self,
}
}
static
PyObject
*
eager_api_final_state_linear
(
PyObject
*
self
,
PyObject
*
args
,
PyObject
*
kwargs
)
{
PyThreadState
*
tstate
=
nullptr
;
try
{
auto
x
=
GetTensorFromArgs
(
"linear"
,
"X"
,
args
,
0
,
false
);
auto
weight
=
GetTensorFromArgs
(
"linear"
,
"weight"
,
args
,
1
,
false
);
auto
bias
=
GetTensorFromArgs
(
"linear"
,
"Bias"
,
args
,
2
,
true
);
tstate
=
PyEval_SaveThread
();
if
(
bias
.
initialized
())
{
auto
mm_out
=
matmul_final_state_dygraph_function
(
x
,
weight
,
false
,
false
);
auto
out
=
add_final_state_dygraph_function
(
mm_out
,
bias
);
PyEval_RestoreThread
(
tstate
);
tstate
=
nullptr
;
return
ToPyObject
(
out
);
}
else
{
auto
mm_out
=
matmul_final_state_dygraph_function
(
x
,
weight
,
false
,
false
);
PyEval_RestoreThread
(
tstate
);
tstate
=
nullptr
;
return
ToPyObject
(
mm_out
);
}
}
catch
(
paddle
::
platform
::
EnforceNotMet
&
exception
)
{
if
(
tstate
)
{
PyEval_RestoreThread
(
tstate
);
}
std
::
ostringstream
sout
;
sout
<<
exception
.
what
();
sout
<<
" [operator < linear > error]"
;
exception
.
set_error_str
(
sout
.
str
());
ThrowExceptionToPython
(
std
::
current_exception
());
return
nullptr
;
}
catch
(...)
{
if
(
tstate
)
{
PyEval_RestoreThread
(
tstate
);
}
ThrowExceptionToPython
(
std
::
current_exception
());
return
nullptr
;
}
}
static
PyMethodDef
CustomEagerFinalStateMethods
[]
=
{
static
PyMethodDef
CustomEagerMethods
[]
=
{
{
"run_program"
,
(
PyCFunction
)(
void
(
*
)(
void
))
eager_api_run_program
,
METH_VARARGS
|
METH_KEYWORDS
,
"C++ interface function for run_program in dygraph."
},
{
"final_state_linear"
,
(
PyCFunction
)(
void
(
*
)(
void
))
eager_api_final_state_linear
,
METH_VARARGS
|
METH_KEYWORDS
,
"C++ interface function for run_program in dygraph."
},
{
nullptr
,
nullptr
,
0
,
nullptr
}};
}
// namespace pybind
}
// namespace paddle
paddle/fluid/pybind/eager_final_state_custom_python_api.h
0 → 100644
浏览文件 @
6cd79701
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <iostream>
#include "paddle/phi/core/enforce.h"
namespace
paddle
{
namespace
pybind
{
static
PyObject
*
eager_api_final_state_linear
(
PyObject
*
self
,
PyObject
*
args
,
PyObject
*
kwargs
)
{
PyThreadState
*
tstate
=
nullptr
;
try
{
auto
x
=
GetTensorFromArgs
(
"linear"
,
"X"
,
args
,
0
,
false
);
auto
weight
=
GetTensorFromArgs
(
"linear"
,
"weight"
,
args
,
1
,
false
);
auto
bias
=
GetTensorFromArgs
(
"linear"
,
"Bias"
,
args
,
2
,
true
);
tstate
=
PyEval_SaveThread
();
if
(
bias
.
initialized
())
{
auto
mm_out
=
matmul_final_state_dygraph_function
(
x
,
weight
,
false
,
false
);
auto
out
=
add_final_state_dygraph_function
(
mm_out
,
bias
);
PyEval_RestoreThread
(
tstate
);
tstate
=
nullptr
;
return
ToPyObject
(
out
);
}
else
{
auto
mm_out
=
matmul_final_state_dygraph_function
(
x
,
weight
,
false
,
false
);
PyEval_RestoreThread
(
tstate
);
tstate
=
nullptr
;
return
ToPyObject
(
mm_out
);
}
}
catch
(
paddle
::
platform
::
EnforceNotMet
&
exception
)
{
if
(
tstate
)
{
PyEval_RestoreThread
(
tstate
);
}
std
::
ostringstream
sout
;
sout
<<
exception
.
what
();
sout
<<
" [operator < linear > error]"
;
exception
.
set_error_str
(
sout
.
str
());
ThrowExceptionToPython
(
std
::
current_exception
());
return
nullptr
;
}
catch
(...)
{
if
(
tstate
)
{
PyEval_RestoreThread
(
tstate
);
}
ThrowExceptionToPython
(
std
::
current_exception
());
return
nullptr
;
}
}
static
PyMethodDef
CustomEagerFinalStateMethods
[]
=
{
{
"final_state_linear"
,
(
PyCFunction
)(
void
(
*
)(
void
))
eager_api_final_state_linear
,
METH_VARARGS
|
METH_KEYWORDS
,
"C++ interface function for run_program in dygraph."
},
{
nullptr
,
nullptr
,
0
,
nullptr
}};
}
// namespace pybind
}
// namespace paddle
paddle/fluid/pybind/eager_op_function_generator.cc
浏览文件 @
6cd79701
...
...
@@ -138,8 +138,6 @@ const char* PYBIND_ITEM_TEMPLATE = R"( {"%s", (PyCFunction)(void(*)(void))%s, M
// These operators will skip automatical code generatrion and
// need to be handwritten in CUSTOM_HANDWRITE_OP_FUNC_FILE
std
::
unordered_set
<
std
::
string
>
CUSTOM_HANDWRITE_OPS_SET
=
{
"run_program"
};
const
char
*
CUSTOM_HANDWRITE_OP_FUNC_FILE
=
"#include
\"
paddle/fluid/pybind/eager_custom_python_api.h
\"\n
"
;
// clang-format on
static
inline
bool
FindInsMap
(
const
std
::
string
&
op_type
,
...
...
@@ -413,7 +411,6 @@ GenerateOpFunctions() {
std
::
vector
<
std
::
string
>
op_function_list
,
bind_function_list
;
auto
&
all_kernels
=
paddle
::
framework
::
OperatorWithKernel
::
AllOpKernels
();
bool
append_custom_head_file
=
false
;
for
(
auto
&
pair
:
op_info_map
)
{
auto
&
op_info
=
pair
.
second
;
auto
op_proto
=
op_info
.
proto_
;
...
...
@@ -423,7 +420,6 @@ GenerateOpFunctions() {
auto
&
op_type
=
op_proto
->
type
();
// Skip operators that will be handwriten in CUSTOM_HANDWRITE_OP_FUNC_FILE.
if
(
CUSTOM_HANDWRITE_OPS_SET
.
count
(
op_type
))
{
append_custom_head_file
=
true
;
continue
;
}
// Skip operator which is not inherit form OperatorWithKernel, like while,
...
...
@@ -480,9 +476,7 @@ GenerateOpFunctions() {
bind_function_list
.
emplace_back
(
std
::
move
(
inplace_bind_function_str
));
}
}
if
(
append_custom_head_file
)
{
op_function_list
.
emplace_back
(
CUSTOM_HANDWRITE_OP_FUNC_FILE
);
}
return
std
::
make_tuple
(
op_function_list
,
bind_function_list
);
}
...
...
@@ -498,18 +492,19 @@ int main(int argc, char* argv[]) {
#endif
std
::
vector
<
std
::
string
>
headers
{
"
\"
pybind11/detail/common.h
\"
"
,
"
\"
paddle/fluid/pybind/eager_final_state_op_function_impl.h
\"
"
,
"
\"
paddle/fluid/pybind/op_function_common.h
\"
"
,
"<Python.h>"
,
"
\"
paddle/fluid/platform/enforce.h
\"
"
,
"
\"
paddle/fluid/eager/api/generated/fluid_generated/"
"dygraph_forward_api.h
\"
"
,
"
\"
paddle/fluid/pybind/eager_utils.h
\"
"
,
"
\"
paddle/fluid/platform/profiler/event_tracing.h
\"
"
,
"
\"
paddle/fluid/pybind/exception.h
\"
"
,
"<Python.h>"
};
"
\"
paddle/fluid/pybind/op_function_common.h
\"
"
,
"
\"
paddle/fluid/pybind/eager_custom_python_api.h
\"
"
,
"
\"
paddle/fluid/pybind/eager.h
\"
"
};
std
::
ofstream
out
(
argv
[
1
],
std
::
ios
::
out
);
out
<<
"#pragma once
\n\n
"
;
for
(
auto
&
header
:
headers
)
{
out
<<
"#include "
+
header
+
"
\n
"
;
}
...
...
@@ -542,22 +537,20 @@ int main(int argc, char* argv[]) {
<<
core_ops_infos_registry
<<
"
\n
{nullptr,nullptr,0,nullptr}"
<<
"};
\n\n
"
;
out
<<
"
inline
void BindEagerOpFunctions(pybind11::module *module) {
\n
"
out
<<
"void BindEagerOpFunctions(pybind11::module *module) {
\n
"
<<
" InitOpsAttrTypeMap();
\n
"
<<
" auto m = module->def_submodule(
\"
ops
\"
);
\n
"
<<
" if (PyModule_AddFunctions(m.ptr(), ExtestMethods) < 0) {
\n
"
<<
" PADDLE_THROW(platform::errors::Fatal (
\"
Add functions to "
"core.eager.ops failed!
\"
));
\n
"
<<
" }
\n\n
"
<<
" if (PyModule_AddFunctions(m.ptr(), EagerFinalStateMethods) < 0) {
\n
"
<<
" PADDLE_THROW(platform::errors::Fatal (
\"
Add functions to "
"core.eager.ops failed!
\"
));
\n
"
<<
" }
\n\n
"
<<
" if (PyModule_AddFunctions(m.ptr(), CustomEagerFinalStateMethods) < "
<<
" if (PyModule_AddFunctions(m.ptr(), CustomEagerMethods) < "
"0) {
\n
"
<<
" PADDLE_THROW(platform::errors::Fatal (
\"
Add functions to "
"core.eager.ops failed!
\"
));
\n
"
<<
" }
\n\n
"
<<
" BindFinalStateEagerOpFunctions(&m);
\n\n
"
<<
"}
\n\n
"
<<
"} // namespace pybind
\n
"
<<
"} // namespace paddle
\n
"
;
...
...
paddle/fluid/pybind/generate_file_structures.py
0 → 100644
浏览文件 @
6cd79701
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import
sys
import
os
if
__name__
==
"__main__"
:
assert
len
(
sys
.
argv
)
==
2
pybind_dir
=
sys
.
argv
[
1
]
empty_files
=
[
os
.
path
.
join
(
pybind_dir
,
"eager_final_state_op_function.cc"
)]
empty_files
.
append
(
os
.
path
.
join
(
pybind_dir
,
"eager_op_function.cc"
))
empty_files
.
append
(
os
.
path
.
join
(
pybind_dir
,
"op_function.cc"
))
for
path
in
empty_files
:
if
not
os
.
path
.
exists
(
path
):
open
(
path
,
'a'
).
close
()
paddle/fluid/pybind/op_function.h
浏览文件 @
6cd79701
...
...
@@ -257,8 +257,7 @@ PyObject* MakeReturnPyObject(const std::tuple<Args...>& out) {
return
result
;
}
void
BindOpFunctions
(
pybind11
::
module
*
module
);
}
// namespace pybind
}
// namespace paddle
// This include must be the last line
#include "paddle/fluid/pybind/op_function_impl.h"
paddle/fluid/pybind/op_function_generator.cc
浏览文件 @
6cd79701
...
...
@@ -506,13 +506,15 @@ int main(int argc, char* argv[]) {
std
::
vector
<
std
::
string
>
headers
{
"
\"
paddle/fluid/imperative/tracer.h
\"
"
,
"
\"
paddle/fluid/platform/profiler.h
\"
"
,
"
\"
pybind11/numpy.h
\"
"
,
"
\"
pybind11/pybind11.h
\"
"
,
"
\"
pybind11/detail/common.h
\"
"
,
"
\"
paddle/fluid/pybind/eager_utils.h
\"
"
,
"
\"
paddle/fluid/pybind/op_function.h
\"
"
,
"<Python.h>"
};
std
::
ofstream
out
(
argv
[
1
],
std
::
ios
::
out
);
out
<<
"#pragma once
\n\n
"
;
for
(
auto
&
header
:
headers
)
{
out
<<
"#include "
+
header
+
"
\n
"
;
}
...
...
@@ -532,7 +534,7 @@ int main(int argc, char* argv[]) {
<<
"
\n
{nullptr,nullptr,0,nullptr}"
<<
"};
\n\n
"
;
out
<<
"
inline
void BindOpFunctions(pybind11::module *module) {
\n
"
out
<<
"void BindOpFunctions(pybind11::module *module) {
\n
"
<<
" auto m = module->def_submodule(
\"
ops
\"
);
\n
"
<<
" if (PyModule_AddFunctions(m.ptr(), ExtestMethods) < 0) {
\n
"
<<
" PADDLE_THROW(platform::errors::Fatal (
\"
Add functions to "
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录