Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
d945e24c
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
d945e24c
编写于
2月 22, 2022
作者:
A
Allen Guo
提交者:
GitHub
2月 22, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
sync recent changes (#39763)
上级
df1dbff1
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
170 addition
and
148 deletion
+170
-148
paddle/fluid/framework/ir/CMakeLists.txt
paddle/fluid/framework/ir/CMakeLists.txt
+1
-1
paddle/fluid/framework/ir/ipu/optimizer_extract_pass.cc
paddle/fluid/framework/ir/ipu/optimizer_extract_pass.cc
+2
-2
paddle/fluid/framework/ir/ipu/popart_canonicalization_pass.cc
...le/fluid/framework/ir/ipu/popart_canonicalization_pass.cc
+3
-5
paddle/fluid/platform/device/ipu/CMakeLists.txt
paddle/fluid/platform/device/ipu/CMakeLists.txt
+3
-3
paddle/fluid/platform/device/ipu/ipu_backend.cc
paddle/fluid/platform/device/ipu/ipu_backend.cc
+11
-13
paddle/fluid/platform/device/ipu/ipu_backend.h
paddle/fluid/platform/device/ipu/ipu_backend.h
+0
-1
paddle/fluid/platform/device/ipu/ipu_compiler.cc
paddle/fluid/platform/device/ipu/ipu_compiler.cc
+93
-97
paddle/fluid/platform/device/ipu/ipu_compiler.h
paddle/fluid/platform/device/ipu/ipu_compiler.h
+34
-26
paddle/fluid/platform/device/ipu/ipu_strategy.cc
paddle/fluid/platform/device/ipu/ipu_strategy.cc
+17
-0
paddle/fluid/platform/device/ipu/ipu_strategy.h
paddle/fluid/platform/device/ipu/ipu_strategy.h
+6
-0
未找到文件。
paddle/fluid/framework/ir/CMakeLists.txt
浏览文件 @
d945e24c
...
@@ -147,7 +147,7 @@ if(WITH_IPU)
...
@@ -147,7 +147,7 @@ if(WITH_IPU)
pass_library
(
ipu_runtime_replacer_pass base DIR ipu
)
pass_library
(
ipu_runtime_replacer_pass base DIR ipu
)
pass_library
(
inference_process_pass base DIR ipu
)
pass_library
(
inference_process_pass base DIR ipu
)
pass_library
(
inference_postprocess_pass base DIR ipu
)
pass_library
(
inference_postprocess_pass base DIR ipu
)
pass_library
(
popart_canonicalization_pass base DIR ipu
)
pass_library
(
popart_canonicalization_pass base DIR ipu
DEPS paddle_ipu
)
pass_library
(
ipu_inplace_pass base DIR ipu
)
pass_library
(
ipu_inplace_pass base DIR ipu
)
pass_library
(
infer_shape_pass base DIR ipu
)
pass_library
(
infer_shape_pass base DIR ipu
)
pass_library
(
delete_scale_op_pass base DIR ipu
)
pass_library
(
delete_scale_op_pass base DIR ipu
)
...
...
paddle/fluid/framework/ir/ipu/optimizer_extract_pass.cc
浏览文件 @
d945e24c
...
@@ -56,7 +56,7 @@ const bool is_regularization_op(const std::string& op_namescope) {
...
@@ -56,7 +56,7 @@ const bool is_regularization_op(const std::string& op_namescope) {
}
}
void
IpuOptimizerExtractPass
::
ApplyImpl
(
ir
::
Graph
*
graph
)
const
{
void
IpuOptimizerExtractPass
::
ApplyImpl
(
ir
::
Graph
*
graph
)
const
{
//
这里构建的 op 符合 popart 的定义, 涉及到的一些值需要在 LowerOptimier 时获得
//
optimizer values will be extracted when lowering optimizer in ipu_backend
OpDesc
new_op
(
"popart_optimizer"
,
{},
{},
{});
OpDesc
new_op
(
"popart_optimizer"
,
{},
{},
{});
new_op
.
SetAttr
(
"op_role"
,
0
);
new_op
.
SetAttr
(
"op_role"
,
0
);
new_op
.
SetAttr
(
"with_lr_sched"
,
false
);
new_op
.
SetAttr
(
"with_lr_sched"
,
false
);
...
@@ -86,7 +86,7 @@ void IpuOptimizerExtractPass::ApplyImpl(ir::Graph* graph) const {
...
@@ -86,7 +86,7 @@ void IpuOptimizerExtractPass::ApplyImpl(ir::Graph* graph) const {
bool
is_regularization
=
is_regularization_op
(
op_namescope
);
bool
is_regularization
=
is_regularization_op
(
op_namescope
);
VLOG
(
10
)
<<
"found optimizer releated op: "
<<
op_type
;
VLOG
(
10
)
<<
"found optimizer releated op: "
<<
op_type
;
// initial larning_rate will be set in
LowerOptimier
// initial larning_rate will be set in
ipu_backend
set_ops
.
insert
(
op_type
);
set_ops
.
insert
(
op_type
);
if
(
op_type
==
"sgd"
)
{
if
(
op_type
==
"sgd"
)
{
auto
type
=
std
::
string
{
"sgd"
};
auto
type
=
std
::
string
{
"sgd"
};
...
...
paddle/fluid/framework/ir/ipu/popart_canonicalization_pass.cc
浏览文件 @
d945e24c
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
#include "paddle/fluid/framework/ir/ipu/popart_canonicalization_pass.h"
#include "paddle/fluid/framework/ir/ipu/popart_canonicalization_pass.h"
#include "paddle/fluid/framework/ir/graph_helper.h"
#include "paddle/fluid/framework/ir/pass_tester_helper.h"
#include "paddle/fluid/framework/ir/pass_tester_helper.h"
#include "paddle/fluid/platform/device/ipu/popart_canonicalization/canonicalization_utils.h"
#include "paddle/fluid/platform/device/ipu/popart_canonicalization/canonicalization_utils.h"
...
@@ -28,11 +29,8 @@ void PopartCanonicalizationPass::ApplyImpl(ir::Graph* graph) const {
...
@@ -28,11 +29,8 @@ void PopartCanonicalizationPass::ApplyImpl(ir::Graph* graph) const {
auto
custom_ops
=
Get
<
std
::
unordered_set
<
std
::
string
>>
(
"custom_ops"
);
auto
custom_ops
=
Get
<
std
::
unordered_set
<
std
::
string
>>
(
"custom_ops"
);
std
::
vector
<
std
::
string
>
missing_ops
;
std
::
vector
<
std
::
string
>
missing_ops
;
auto
nodes
=
graph
->
Nodes
();
auto
sorted_ops
=
TopologySortOperations
(
*
graph
);
for
(
auto
*
node
:
nodes
)
{
for
(
auto
*
node
:
sorted_ops
)
{
if
(
!
node
->
IsOp
())
{
continue
;
}
auto
*
op
=
node
->
Op
();
auto
*
op
=
node
->
Op
();
auto
op_type
=
op
->
Type
();
auto
op_type
=
op
->
Type
();
...
...
paddle/fluid/platform/device/ipu/CMakeLists.txt
浏览文件 @
d945e24c
...
@@ -13,9 +13,9 @@ IF(WITH_IPU)
...
@@ -13,9 +13,9 @@ IF(WITH_IPU)
"ipu_device.cc"
"ipu_device.cc"
)
)
cc_library
(
ipu_backend SRCS
${
IPU_BACKEND_SRC
}
DEPS popart graph graph_helper
)
cc_library
(
ipu_backend SRCS
${
IPU_BACKEND_SRC
}
DEPS popart
-only
graph graph_helper
)
cc_library
(
ipu_info SRCS
${
IPU_INFO_SRC
}
DEPS popart enforce
)
cc_library
(
ipu_info SRCS
${
IPU_INFO_SRC
}
DEPS popart
-only
enforce
)
cc_library
(
paddle_ipu SHARED SRCS
${
PADDLE_IPU_SRC
}
DEPS popart graph_helper
)
add_library
(
paddle_ipu SHARED
${
PADDLE_IPU_SRC
}
)
add_dependencies
(
paddle_ipu ipu_backend
)
add_dependencies
(
paddle_ipu ipu_backend
)
set
(
PADDLE_IPU_LIB
"
${
CMAKE_CURRENT_BINARY_DIR
}
/libpaddle_ipu.so"
CACHE STRING
""
)
set
(
PADDLE_IPU_LIB
"
${
CMAKE_CURRENT_BINARY_DIR
}
/libpaddle_ipu.so"
CACHE STRING
""
)
set
(
PADDLE_IPU_LIB_DIR
"
${
CMAKE_CURRENT_BINARY_DIR
}
"
CACHE STRING
""
)
set
(
PADDLE_IPU_LIB_DIR
"
${
CMAKE_CURRENT_BINARY_DIR
}
"
CACHE STRING
""
)
...
...
paddle/fluid/platform/device/ipu/ipu_backend.cc
浏览文件 @
d945e24c
...
@@ -43,17 +43,17 @@ void IpuBackend::Compile(Graph* graph,
...
@@ -43,17 +43,17 @@ void IpuBackend::Compile(Graph* graph,
const
std
::
vector
<
std
::
string
>&
feed_list
,
const
std
::
vector
<
std
::
string
>&
feed_list
,
const
std
::
vector
<
std
::
string
>&
fetch_list
)
{
const
std
::
vector
<
std
::
string
>&
fetch_list
)
{
VLOG
(
10
)
<<
"enter IpuBackend::Compile"
;
VLOG
(
10
)
<<
"enter IpuBackend::Compile"
;
compiler_
->
Prepare
();
compiler_
->
Prepare
(
graph
);
executor_
->
SetCompilerResources
(
compiler_
->
GetResources
());
compiler_
->
InitInputs
(
feed_list
);
compiler_
->
LowerConstants
(
scope_
);
compiler_
->
InitInputs
(
graph
,
feed_list
);
compiler_
->
LowerWeights
(
scope_
);
compiler_
->
LowerConstants
(
graph
,
scope_
);
compiler_
->
LowerBody
();
compiler_
->
LowerWeights
(
graph
,
scope_
);
compiler_
->
LowerBody
(
graph
);
compiler_
->
InitOutputs
(
fetch_list
);
compiler_
->
InitOutputs
(
fetch_list
);
if
(
ipu_strategy_
->
is_training
)
{
if
(
ipu_strategy_
->
is_training
)
{
compiler_
->
LowerOptimi
er
(
graph
,
scope_
);
compiler_
->
LowerOptimi
zer
(
scope_
);
}
}
executor_
->
SetCompilerResources
(
compiler_
->
GetResources
());
is_compiled_
=
true
;
is_compiled_
=
true
;
// when call compile, means a new graph
// when call compile, means a new graph
is_prepared_
=
false
;
is_prepared_
=
false
;
...
@@ -95,11 +95,9 @@ void IpuBackend::SetIpuStrategy(const IpuStrategy& strategy) {
...
@@ -95,11 +95,9 @@ void IpuBackend::SetIpuStrategy(const IpuStrategy& strategy) {
ipu_strategy_
=
&
strategy
;
ipu_strategy_
=
&
strategy
;
compiler_
->
SetIpuStrategy
(
strategy
);
compiler_
->
SetIpuStrategy
(
strategy
);
executor_
->
SetIpuStrategy
(
strategy
);
executor_
->
SetIpuStrategy
(
strategy
);
}
if
(
!
strategy
.
custom_ops
.
empty
())
{
compiler_
->
SetCustomOps
(
strategy
.
custom_ops
);
void
IpuBackend
::
SetCustomOps
(
}
const
std
::
vector
<
IpuCustomOpIdentifier
>&
custom_ops
)
{
compiler_
->
SetCustomOps
(
custom_ops
);
}
}
void
IpuBackend
::
SaveModelProto
(
const
std
::
string
&
path
)
{
void
IpuBackend
::
SaveModelProto
(
const
std
::
string
&
path
)
{
...
...
paddle/fluid/platform/device/ipu/ipu_backend.h
浏览文件 @
d945e24c
...
@@ -71,7 +71,6 @@ class IpuBackend {
...
@@ -71,7 +71,6 @@ class IpuBackend {
const
Scope
*
GetScope
()
{
return
scope_
;
}
const
Scope
*
GetScope
()
{
return
scope_
;
}
void
SetIpuStrategy
(
const
IpuStrategy
&
strategy
);
void
SetIpuStrategy
(
const
IpuStrategy
&
strategy
);
const
IpuStrategy
*
GetIpuStrategy
()
{
return
ipu_strategy_
;
}
const
IpuStrategy
*
GetIpuStrategy
()
{
return
ipu_strategy_
;
}
void
SetCustomOps
(
const
std
::
vector
<
IpuCustomOpIdentifier
>
&
custom_ops
);
// save compiled model to onnx
// save compiled model to onnx
void
SaveModelProto
(
const
std
::
string
&
path
);
void
SaveModelProto
(
const
std
::
string
&
path
);
...
...
paddle/fluid/platform/device/ipu/ipu_compiler.cc
浏览文件 @
d945e24c
...
@@ -98,6 +98,19 @@ TO GetCastSigAttrAllowNull(std::string attr, OpDesc* op_desc) {
...
@@ -98,6 +98,19 @@ TO GetCastSigAttrAllowNull(std::string attr, OpDesc* op_desc) {
}
}
}
}
GraphHelper
::
GraphHelper
(
const
Graph
*
g
)
{
graph
=
g
;
sorted_ops
=
framework
::
ir
::
TopologySortOperations
(
*
g
);
for
(
auto
*
node
:
g
->
Nodes
())
{
nodes_id_map
[
node
->
id
()]
=
node
;
if
(
node
->
IsVar
())
{
vars_name_map
[
node
->
Name
()]
=
node
;
sorted_vars_id
.
push_back
(
node
->
id
());
}
}
std
::
sort
(
sorted_vars_id
.
begin
(),
sorted_vars_id
.
end
());
}
Compiler
::
Compiler
()
{
RegisterOpFunc
();
}
Compiler
::
Compiler
()
{
RegisterOpFunc
();
}
Compiler
::~
Compiler
()
{
Compiler
::~
Compiler
()
{
...
@@ -105,9 +118,10 @@ Compiler::~Compiler() {
...
@@ -105,9 +118,10 @@ Compiler::~Compiler() {
resources_
.
reset
();
resources_
.
reset
();
}
}
void
Compiler
::
Prepare
()
{
void
Compiler
::
Prepare
(
const
Graph
*
graph
)
{
builder_
=
popart
::
Builder
::
create
();
builder_
=
popart
::
Builder
::
create
();
resources_
=
std
::
make_unique
<
CompilerResources
>
();
resources_
=
std
::
make_unique
<
CompilerResources
>
();
graph_helper_
=
std
::
make_unique
<
GraphHelper
>
(
graph
);
}
}
void
Compiler
::
RegisterOpFunc
()
{
void
Compiler
::
RegisterOpFunc
()
{
...
@@ -171,93 +185,24 @@ void Compiler::RegisterOpFunc() {
...
@@ -171,93 +185,24 @@ void Compiler::RegisterOpFunc() {
#undef INT_VEC
#undef INT_VEC
}
}
void
Compiler
::
LowerBody
(
const
Graph
*
graph
)
{
void
Compiler
::
InitInputs
(
const
std
::
vector
<
std
::
string
>&
feed_list
)
{
VLOG
(
10
)
<<
"enter Compiler::LowerBody"
;
auto
nodes
=
framework
::
ir
::
TopologySortOperations
(
*
graph
);
for
(
auto
*
node
:
nodes
)
{
auto
*
op_desc
=
node
->
Op
();
auto
op_type
=
op_desc
->
Type
();
VLOG
(
10
)
<<
"lowering op: "
<<
op_type
;
if
(
op_type
==
"popart_constant"
)
{
// pass
}
else
if
(
op_type
==
"popart_optimizer"
)
{
// pass
}
else
if
(
op_type
==
"popart_checkpointoutput"
)
{
auto
inputs
=
GetOpInputs
(
op_desc
);
auto
outputs
=
GetOpOutputs
(
op_desc
);
auto
output_ids
=
builder_
->
checkpointOutput
(
inputs
);
InsertTensors
(
outputs
,
output_ids
);
}
else
if
(
op_type
==
"popart_custom_op"
)
{
auto
inputs
=
GetOpInputs
(
op_desc
);
auto
outputs
=
GetOpOutputs
(
op_desc
);
auto
debug_context
=
BuildDebugContext
(
op_desc
);
auto
attributes
=
std
::
map
<
std
::
string
,
popart
::
any
>
{};
for
(
auto
&
attr
:
op_desc
->
GetAttrMap
())
{
CustomOpAttrVisitor
visitor
(
&
attributes
,
attr
.
first
);
boost
::
apply_visitor
(
visitor
,
attr
.
second
);
}
auto
__op_type
=
BOOST_GET_CONST
(
std
::
string
,
op_desc
->
GetAttr
(
"__op_type"
));
VLOG
(
10
)
<<
"Build graph from custom op: "
<<
__op_type
;
auto
it
=
custom_ops_
.
find
(
__op_type
);
auto
output_ids
=
builder_
->
customOp
(
it
->
second
.
popart_op
,
it
->
second
.
popart_op
.
version
,
inputs
,
outputs
.
size
(),
attributes
,
debug_context
);
SetIpuIndexStage
(
output_ids
,
op_desc
);
InsertTensors
(
outputs
,
output_ids
);
}
else
if
(
op_type
==
"popart_printtensor"
)
{
auto
inputs
=
GetOpInputs
(
op_desc
);
auto
outputs
=
GetOpOutputs
(
op_desc
);
auto
debug_context
=
BuildDebugContext
(
op_desc
);
auto
print_gradient
=
BOOST_GET_CONST
(
int64_t
,
op_desc
->
GetAttr
(
"print_gradient"
));
auto
title
=
BOOST_GET_CONST
(
std
::
string
,
op_desc
->
GetAttr
(
"title"
));
auto
output_ids
=
builder_
->
aiGraphcoreOpset1
().
printtensor
(
inputs
,
print_gradient
,
debug_context
,
title
);
SetIpuIndexStage
(
output_ids
,
op_desc
);
InsertTensors
(
outputs
,
output_ids
);
}
else
{
auto
itr
=
name_function_
.
find
(
op_type
);
if
(
itr
!=
name_function_
.
end
())
{
itr
->
second
(
node
->
Op
());
}
else
{
PADDLE_THROW
(
platform
::
errors
::
NotFound
(
"%s is not registered, please check for unsupported operators for "
"running on IPU"
,
op_type
));
}
}
}
VLOG
(
10
)
<<
"leave Compiler::LowerBody"
;
}
void
Compiler
::
InitInputs
(
Graph
*
graph
,
const
std
::
vector
<
std
::
string
>&
feed_list
)
{
for
(
const
auto
&
feed_name
:
feed_list
)
{
for
(
const
auto
&
feed_name
:
feed_list
)
{
feed_list_
.
push_back
(
feed_name
);
auto
*
node
=
graph_helper_
->
vars_name_map
[
feed_name
];
for
(
const
Node
*
n
:
graph
->
Nodes
())
{
auto
*
var_desc
=
node
->
Var
();
if
(
n
->
IsVar
())
{
VLOG
(
10
)
<<
"feed_name= "
<<
var_desc
->
Name
();
auto
*
var_desc
=
n
->
Var
();
auto
data_type
=
VarType2PopartType
(
var_desc
->
GetDataType
());
if
(
feed_name
==
var_desc
->
Name
())
{
popart
::
TensorInfo
input_info
{
data_type
,
var_desc
->
GetShape
()};
VLOG
(
10
)
<<
"feed_name= "
<<
var_desc
->
Name
();
VLOG
(
10
)
<<
"popart input_info = "
<<
input_info
;
auto
data_type
=
VarType2PopartType
(
var_desc
->
GetDataType
());
popart
::
TensorId
tensor_id
=
popart
::
TensorInfo
input_info
{
data_type
,
var_desc
->
GetShape
()};
builder_
->
addInputTensor
(
input_info
,
feed_name
);
VLOG
(
10
)
<<
"popart input_info = "
<<
input_info
;
VLOG
(
10
)
<<
"popart input tensor id = "
<<
tensor_id
;
popart
::
TensorId
tensor_id
=
resources_
->
inputs
.
push_back
(
tensor_id
);
builder_
->
addInputTensor
(
input_info
,
feed_name
);
resources_
->
tensors
.
emplace
(
var_desc
->
Name
(),
tensor_id
);
VLOG
(
10
)
<<
"popart input tensor id = "
<<
tensor_id
;
resources_
->
inputs
.
push_back
(
tensor_id
);
resources_
->
tensors
.
emplace
(
var_desc
->
Name
(),
tensor_id
);
}
}
}
}
}
}
}
void
Compiler
::
InitOutputs
(
const
std
::
vector
<
std
::
string
>&
fetch_list
)
{
void
Compiler
::
InitOutputs
(
const
std
::
vector
<
std
::
string
>&
fetch_list
)
{
for
(
const
auto
&
fetch_name
:
fetch_list
)
{
for
(
const
auto
&
fetch_name
:
fetch_list
)
{
fetch_list_
.
push_back
(
fetch_name
);
auto
tensor
=
resources_
->
tensors
.
find
(
fetch_name
);
auto
tensor
=
resources_
->
tensors
.
find
(
fetch_name
);
PADDLE_ENFORCE_NE
(
PADDLE_ENFORCE_NE
(
tensor
,
resources_
->
tensors
.
end
(),
tensor
,
resources_
->
tensors
.
end
(),
...
@@ -271,14 +216,10 @@ void Compiler::InitOutputs(const std::vector<std::string>& fetch_list) {
...
@@ -271,14 +216,10 @@ void Compiler::InitOutputs(const std::vector<std::string>& fetch_list) {
}
}
}
}
void
Compiler
::
LowerConstants
(
const
Graph
*
graph
,
const
Scope
*
scope
)
{
void
Compiler
::
LowerConstants
(
const
Scope
*
scope
)
{
auto
&
kid_scope
=
scope
->
NewScope
();
auto
&
kid_scope
=
scope
->
NewScope
();
VLOG
(
10
)
<<
"enter Compiler::LowerConstants"
;
VLOG
(
10
)
<<
"enter Compiler::LowerConstants"
;
for
(
auto
*
node
:
graph
->
Nodes
())
{
for
(
auto
*
node
:
graph_helper_
->
sorted_ops
)
{
if
(
!
node
->
IsOp
())
{
continue
;
}
auto
*
op_desc
=
node
->
Op
();
auto
*
op_desc
=
node
->
Op
();
auto
op_type
=
op_desc
->
Type
();
auto
op_type
=
op_desc
->
Type
();
if
(
op_type
==
"popart_constant"
)
{
if
(
op_type
==
"popart_constant"
)
{
...
@@ -308,17 +249,16 @@ void Compiler::LowerConstants(const Graph* graph, const Scope* scope) {
...
@@ -308,17 +249,16 @@ void Compiler::LowerConstants(const Graph* graph, const Scope* scope) {
VLOG
(
10
)
<<
"leave Compiler::LowerConstants"
;
VLOG
(
10
)
<<
"leave Compiler::LowerConstants"
;
}
}
void
Compiler
::
LowerWeights
(
const
Graph
*
graph
,
const
Scope
*
scope
)
{
void
Compiler
::
LowerWeights
(
const
Scope
*
scope
)
{
VLOG
(
10
)
<<
"enter Compiler::LowerWeights"
;
VLOG
(
10
)
<<
"enter Compiler::LowerWeights"
;
PADDLE_ENFORCE_NOT_NULL
(
scope
,
platform
::
errors
::
PreconditionNotMet
(
"You should call set_scope before LowerWeights"
));
// at this step, the graph doesn't contains optimizer related states
// at this step, the graph doesn't contains optimizer related states
for
(
const
auto
*
node
:
graph
->
Nodes
())
{
for
(
auto
id
:
graph_helper_
->
sorted_vars_id
)
{
auto
*
node
=
graph_helper_
->
nodes_id_map
[
id
];
if
(
node
->
IsVar
()
&&
!
node
->
IsCtrlVar
()
&&
node
->
Var
())
{
if
(
node
->
IsVar
()
&&
!
node
->
IsCtrlVar
()
&&
node
->
Var
())
{
if
(
node
->
Var
()
->
Persistable
()
&&
node
->
inputs
.
empty
())
{
if
(
node
->
Var
()
->
Persistable
()
&&
node
->
inputs
.
empty
())
{
auto
var_name
=
node
->
Var
()
->
Name
();
auto
var_name
=
node
->
Var
()
->
Name
();
if
(
resources_
->
tensors
.
count
(
var_name
)
!=
0
)
{
if
(
resources_
->
tensors
.
count
(
var_name
)
!=
0
)
{
VLOG
(
10
)
<<
"found existed one, skip lowering Weight: "
<<
var_name
;
continue
;
continue
;
}
}
VLOG
(
10
)
<<
"lowering weight: "
<<
var_name
;
VLOG
(
10
)
<<
"lowering weight: "
<<
var_name
;
...
@@ -344,12 +284,68 @@ void Compiler::LowerWeights(const Graph* graph, const Scope* scope) {
...
@@ -344,12 +284,68 @@ void Compiler::LowerWeights(const Graph* graph, const Scope* scope) {
VLOG
(
10
)
<<
"leave Compiler::LowerWeights"
;
VLOG
(
10
)
<<
"leave Compiler::LowerWeights"
;
}
}
void
Compiler
::
LowerOptimier
(
const
Graph
*
graph
,
const
Scope
*
scope
)
{
void
Compiler
::
LowerBody
()
{
for
(
auto
*
node
:
graph
->
Nodes
())
{
VLOG
(
10
)
<<
"enter Compiler::LowerBody"
;
if
(
!
node
->
IsOp
())
{
for
(
auto
*
node
:
graph_helper_
->
sorted_ops
)
{
continue
;
auto
*
op_desc
=
node
->
Op
();
auto
op_type
=
op_desc
->
Type
();
VLOG
(
10
)
<<
"lowering op: "
<<
op_type
;
if
(
op_type
==
"popart_constant"
)
{
// pass
}
else
if
(
op_type
==
"popart_optimizer"
)
{
// pass
}
else
if
(
op_type
==
"popart_checkpointoutput"
)
{
auto
inputs
=
GetOpInputs
(
op_desc
);
auto
outputs
=
GetOpOutputs
(
op_desc
);
auto
output_ids
=
builder_
->
checkpointOutput
(
inputs
);
InsertTensors
(
outputs
,
output_ids
);
}
else
if
(
op_type
==
"popart_custom_op"
)
{
auto
inputs
=
GetOpInputs
(
op_desc
);
auto
outputs
=
GetOpOutputs
(
op_desc
);
auto
debug_context
=
BuildDebugContext
(
op_desc
);
auto
attributes
=
std
::
map
<
std
::
string
,
popart
::
any
>
{};
for
(
auto
&
attr
:
op_desc
->
GetAttrMap
())
{
CustomOpAttrVisitor
visitor
(
&
attributes
,
attr
.
first
);
boost
::
apply_visitor
(
visitor
,
attr
.
second
);
}
auto
__op_type
=
BOOST_GET_CONST
(
std
::
string
,
op_desc
->
GetAttr
(
"__op_type"
));
VLOG
(
10
)
<<
"Build graph from custom op: "
<<
__op_type
;
auto
it
=
custom_ops_
.
find
(
__op_type
);
auto
output_ids
=
builder_
->
customOp
(
it
->
second
.
popart_op
,
it
->
second
.
popart_op
.
version
,
inputs
,
outputs
.
size
(),
attributes
,
debug_context
);
SetIpuIndexStage
(
output_ids
,
op_desc
);
InsertTensors
(
outputs
,
output_ids
);
}
else
if
(
op_type
==
"popart_printtensor"
)
{
auto
inputs
=
GetOpInputs
(
op_desc
);
auto
outputs
=
GetOpOutputs
(
op_desc
);
auto
debug_context
=
BuildDebugContext
(
op_desc
);
auto
print_gradient
=
BOOST_GET_CONST
(
int64_t
,
op_desc
->
GetAttr
(
"print_gradient"
));
auto
title
=
BOOST_GET_CONST
(
std
::
string
,
op_desc
->
GetAttr
(
"title"
));
auto
output_ids
=
builder_
->
aiGraphcoreOpset1
().
printtensor
(
inputs
,
print_gradient
,
debug_context
,
title
);
SetIpuIndexStage
(
output_ids
,
op_desc
);
InsertTensors
(
outputs
,
output_ids
);
}
else
{
auto
itr
=
name_function_
.
find
(
op_type
);
if
(
itr
!=
name_function_
.
end
())
{
itr
->
second
(
node
->
Op
());
}
else
{
PADDLE_THROW
(
platform
::
errors
::
NotFound
(
"%s is not registered, please check for unsupported operators for "
"running on IPU"
,
op_type
));
}
}
}
}
VLOG
(
10
)
<<
"leave Compiler::LowerBody"
;
}
void
Compiler
::
LowerOptimizer
(
const
Scope
*
scope
)
{
for
(
auto
*
node
:
graph_helper_
->
sorted_ops
)
{
auto
*
op_desc
=
node
->
Op
();
auto
*
op_desc
=
node
->
Op
();
auto
op_type
=
op_desc
->
Type
();
auto
op_type
=
op_desc
->
Type
();
if
(
op_type
==
"popart_optimizer"
)
{
if
(
op_type
==
"popart_optimizer"
)
{
...
...
paddle/fluid/platform/device/ipu/ipu_compiler.h
浏览文件 @
d945e24c
...
@@ -68,34 +68,29 @@ struct CompilerResources {
...
@@ -68,34 +68,29 @@ struct CompilerResources {
std
::
unique_ptr
<
popart
::
Optimizer
>
optimizer
;
std
::
unique_ptr
<
popart
::
Optimizer
>
optimizer
;
};
};
// helper for lowering graph
struct
GraphHelper
{
explicit
GraphHelper
(
const
Graph
*
);
const
Graph
*
graph
;
std
::
map
<
std
::
string
,
Node
*>
vars_name_map
;
std
::
map
<
int
,
Node
*>
nodes_id_map
;
std
::
vector
<
Node
*>
sorted_ops
;
std
::
vector
<
int
>
sorted_vars_id
;
};
class
Compiler
{
class
Compiler
{
public:
public:
Compiler
();
Compiler
();
~
Compiler
();
~
Compiler
();
void
RegisterOpFunc
();
void
Prepare
(
const
Graph
*
graph
);
void
Prepare
();
void
InitInputs
(
const
std
::
vector
<
std
::
string
>
&
feed_list
);
void
LowerBody
(
const
Graph
*
graph
);
void
InitInputs
(
Graph
*
graph
,
const
std
::
vector
<
std
::
string
>
&
feed_list
);
void
InitOutputs
(
const
std
::
vector
<
std
::
string
>
&
fetch_list
);
void
InitOutputs
(
const
std
::
vector
<
std
::
string
>
&
fetch_list
);
void
LowerConstants
(
const
Graph
*
graph
,
const
Scope
*
scope
);
void
LowerConstants
(
const
Scope
*
scope
);
void
LowerWeights
(
const
Graph
*
graph
,
const
Scope
*
scope
);
void
LowerWeights
(
const
Scope
*
scope
);
void
LowerOptimier
(
const
Graph
*
graph
,
const
Scope
*
scope
);
void
LowerBody
();
void
LowerOptimizer
(
const
Scope
*
scope
);
void
InsertTensors
(
const
std
::
vector
<
std
::
string
>
&
output_names
,
const
std
::
vector
<
std
::
string
>
&
tensor_ids
);
void
InsertTensors
(
const
std
::
vector
<
std
::
string
>
&
output_names
,
const
std
::
string
&
tensor_id
);
void
SetIpuIndexStage
(
const
std
::
vector
<
std
::
string
>
&
tensor_ids
,
const
OpDesc
*
op_desc
);
void
SetIpuIndexStage
(
const
std
::
string
&
tensor_id
,
const
OpDesc
*
op_desc
);
void
SetAMPAttributes
(
const
std
::
vector
<
std
::
string
>
&
tensor_ids
,
const
OpDesc
*
op_desc
);
void
SetAMPAttributes
(
const
std
::
string
&
tensor_id
,
const
OpDesc
*
op_desc
);
void
SetSerializeAttributes
(
const
std
::
vector
<
std
::
string
>
&
tensor_ids
,
const
OpDesc
*
op_desc
);
void
SetSerializeAttributes
(
const
std
::
string
&
tensor_id
,
const
OpDesc
*
op_desc
);
void
SetIpuStrategy
(
const
IpuStrategy
&
strategy
)
{
void
SetIpuStrategy
(
const
IpuStrategy
&
strategy
)
{
ipu_strategy_
=
&
strategy
;
ipu_strategy_
=
&
strategy
;
...
@@ -112,21 +107,34 @@ class Compiler {
...
@@ -112,21 +107,34 @@ class Compiler {
void
SaveModelProtoNoCheck
(
const
std
::
string
&
path
);
void
SaveModelProtoNoCheck
(
const
std
::
string
&
path
);
private:
private:
void
RegisterOpFunc
();
std
::
vector
<
std
::
string
>
GetOpInputs
(
const
OpDesc
*
op
);
std
::
vector
<
std
::
string
>
GetOpInputs
(
const
OpDesc
*
op
);
const
std
::
vector
<
std
::
string
>
&
GetOpOutputs
(
const
OpDesc
*
op
);
const
std
::
vector
<
std
::
string
>
&
GetOpOutputs
(
const
OpDesc
*
op
);
popart
::
DebugContext
BuildDebugContext
(
const
OpDesc
*
op
);
popart
::
DebugContext
BuildDebugContext
(
const
OpDesc
*
op
);
void
InsertTensors
(
const
std
::
vector
<
std
::
string
>
&
output_names
,
const
std
::
vector
<
std
::
string
>
&
tensor_ids
);
void
InsertTensors
(
const
std
::
vector
<
std
::
string
>
&
output_names
,
const
std
::
string
&
tensor_id
);
void
SetIpuIndexStage
(
const
std
::
vector
<
std
::
string
>
&
tensor_ids
,
const
OpDesc
*
op_desc
);
void
SetIpuIndexStage
(
const
std
::
string
&
tensor_id
,
const
OpDesc
*
op_desc
);
void
SetAMPAttributes
(
const
std
::
vector
<
std
::
string
>
&
tensor_ids
,
const
OpDesc
*
op_desc
);
void
SetAMPAttributes
(
const
std
::
string
&
tensor_id
,
const
OpDesc
*
op_desc
);
void
SetSerializeAttributes
(
const
std
::
vector
<
std
::
string
>
&
tensor_ids
,
const
OpDesc
*
op_desc
);
void
SetSerializeAttributes
(
const
std
::
string
&
tensor_id
,
const
OpDesc
*
op_desc
);
private:
private:
std
::
unique_ptr
<
popart
::
Builder
>
builder_
;
std
::
unique_ptr
<
popart
::
Builder
>
builder_
;
std
::
unique_ptr
<
CompilerResources
>
resources_
;
std
::
unique_ptr
<
CompilerResources
>
resources_
;
std
::
unique_ptr
<
GraphHelper
>
graph_helper_
;
using
OpFunc
=
std
::
function
<
void
(
OpDesc
*
op_desc
)
>
;
using
OpFunc
=
std
::
function
<
void
(
OpDesc
*
op_desc
)
>
;
std
::
unordered_map
<
std
::
string
,
OpFunc
>
name_function_
;
std
::
unordered_map
<
std
::
string
,
OpFunc
>
name_function_
;
// feed_list_ & fetch_list save paddle tensor id
std
::
vector
<
std
::
string
>
feed_list_
;
std
::
vector
<
std
::
string
>
fetch_list_
;
const
IpuStrategy
*
ipu_strategy_
=
nullptr
;
const
IpuStrategy
*
ipu_strategy_
=
nullptr
;
std
::
map
<
std
::
string
,
IpuCustomOpIdentifier
>
custom_ops_
;
std
::
map
<
std
::
string
,
IpuCustomOpIdentifier
>
custom_ops_
;
};
};
...
...
paddle/fluid/platform/device/ipu/ipu_strategy.cc
浏览文件 @
d945e24c
...
@@ -241,6 +241,15 @@ IpuStrategy::IpuStrategy() {
...
@@ -241,6 +241,15 @@ IpuStrategy::IpuStrategy() {
#undef ADD_POPART_BOOL_OPTION_ALIAS
#undef ADD_POPART_BOOL_OPTION_ALIAS
#undef ADD_POPART_ENUM_OPTION_ALIAS
#undef ADD_POPART_ENUM_OPTION_ALIAS
RegisterGetter
(
vector_options_getter
,
options_type
,
"custom_ops"
,
"vector"
,
[
&
]()
{
std
::
vector
<
std
::
string
>
res
;
for
(
auto
x
:
custom_ops
)
{
res
.
push_back
(
x
.
repr
());
}
return
res
;
});
RegisterSetter
(
bool_options
,
"enable_manual_shard"
,
[
&
](
bool
value
)
{
RegisterSetter
(
bool_options
,
"enable_manual_shard"
,
[
&
](
bool
value
)
{
if
(
value
)
{
if
(
value
)
{
popart_options
.
virtualGraphMode
=
popart
::
VirtualGraphMode
::
Manual
;
popart_options
.
virtualGraphMode
=
popart
::
VirtualGraphMode
::
Manual
;
...
@@ -429,6 +438,14 @@ void IpuStrategy::SetTensorLocation(const std::string& tensor,
...
@@ -429,6 +438,14 @@ void IpuStrategy::SetTensorLocation(const std::string& tensor,
}
}
}
}
void
IpuStrategy
::
AddCustomOp
(
const
std
::
string
&
paddle_op
,
const
std
::
string
&
popart_op
,
const
std
::
string
&
domain
,
int
version
)
{
LOG
(
INFO
)
<<
"IpuStrategy add custom op: "
<<
paddle_op
;
custom_ops
.
push_back
(
IpuCustomOpIdentifier
(
paddle_op
,
popart_op
,
domain
,
version
));
}
std
::
string
IpuStrategy
::
GetOption
(
const
std
::
string
&
option
)
{
std
::
string
IpuStrategy
::
GetOption
(
const
std
::
string
&
option
)
{
return
get
(
option
,
options_getter
);
return
get
(
option
,
options_getter
);
}
}
...
...
paddle/fluid/platform/device/ipu/ipu_strategy.h
浏览文件 @
d945e24c
...
@@ -17,6 +17,7 @@ limitations under the License. */
...
@@ -17,6 +17,7 @@ limitations under the License. */
#include <popart/patterns/patterns.hpp>
#include <popart/patterns/patterns.hpp>
#include <popart/sessionoptions.hpp>
#include <popart/sessionoptions.hpp>
#include <popart/tensorlocation.hpp>
#include <popart/tensorlocation.hpp>
#include "paddle/fluid/platform/device/ipu/ipu_utils.h"
#include "paddle/fluid/platform/enforce.h"
#include "paddle/fluid/platform/enforce.h"
namespace
paddle
{
namespace
paddle
{
...
@@ -71,6 +72,9 @@ struct IpuStrategy {
...
@@ -71,6 +72,9 @@ struct IpuStrategy {
// popart pattern manager
// popart pattern manager
popart
::
Patterns
popart_patterns
;
popart
::
Patterns
popart_patterns
;
// custom ops
std
::
vector
<
IpuCustomOpIdentifier
>
custom_ops
;
private:
private:
std
::
map
<
std
::
string
,
std
::
function
<
void
(
bool
)
>>
bool_options
;
std
::
map
<
std
::
string
,
std
::
function
<
void
(
bool
)
>>
bool_options
;
std
::
map
<
std
::
string
,
std
::
function
<
void
(
std
::
uint64_t
)
>>
uint64_options
;
std
::
map
<
std
::
string
,
std
::
function
<
void
(
std
::
uint64_t
)
>>
uint64_options
;
...
@@ -123,6 +127,8 @@ struct IpuStrategy {
...
@@ -123,6 +127,8 @@ struct IpuStrategy {
const
std
::
string
&
value
);
const
std
::
string
&
value
);
void
SetTensorLocation
(
const
std
::
string
&
tensor
,
const
std
::
string
&
option
,
void
SetTensorLocation
(
const
std
::
string
&
tensor
,
const
std
::
string
&
option
,
std
::
uint64_t
value
);
std
::
uint64_t
value
);
void
AddCustomOp
(
const
std
::
string
&
paddle_op
,
const
std
::
string
&
popart_op
,
const
std
::
string
&
domain
,
int
version
);
std
::
string
GetOption
(
const
std
::
string
&
);
std
::
string
GetOption
(
const
std
::
string
&
);
std
::
vector
<
std
::
string
>
GetVectorOption
(
const
std
::
string
&
);
std
::
vector
<
std
::
string
>
GetVectorOption
(
const
std
::
string
&
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录