Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
e9f33320
P
Paddle
项目概览
PaddlePaddle
/
Paddle
大约 1 年 前同步成功
通知
2298
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
e9f33320
编写于
5月 16, 2019
作者:
Y
Yan Chunwei
提交者:
GitHub
5月 16, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add some ops for training (#17442)
上级
72fb4adb
变更
26
隐藏空白更改
内联
并排
Showing
26 changed file
with
522 addition
and
25 deletion
+522
-25
paddle/fluid/framework/operator.h
paddle/fluid/framework/operator.h
+18
-0
paddle/fluid/incubate/CMakeLists.txt
paddle/fluid/incubate/CMakeLists.txt
+1
-0
paddle/fluid/lite/api/cxx_api.cc
paddle/fluid/lite/api/cxx_api.cc
+1
-1
paddle/fluid/lite/api/cxx_api.h
paddle/fluid/lite/api/cxx_api.h
+65
-3
paddle/fluid/lite/api/cxx_api_bin.cc
paddle/fluid/lite/api/cxx_api_bin.cc
+1
-1
paddle/fluid/lite/api/cxx_api_test.cc
paddle/fluid/lite/api/cxx_api_test.cc
+41
-3
paddle/fluid/lite/core/context.h
paddle/fluid/lite/core/context.h
+9
-1
paddle/fluid/lite/core/hvy_tensor.h
paddle/fluid/lite/core/hvy_tensor.h
+13
-3
paddle/fluid/lite/core/naive_test_model.py
paddle/fluid/lite/core/naive_test_model.py
+46
-0
paddle/fluid/lite/core/op_lite.cc
paddle/fluid/lite/core/op_lite.cc
+1
-1
paddle/fluid/lite/core/op_lite.h
paddle/fluid/lite/core/op_lite.h
+16
-0
paddle/fluid/lite/core/program.h
paddle/fluid/lite/core/program.h
+2
-1
paddle/fluid/lite/kernels/CMakeLists.txt
paddle/fluid/lite/kernels/CMakeLists.txt
+1
-0
paddle/fluid/lite/kernels/x86/CMakeLists.txt
paddle/fluid/lite/kernels/x86/CMakeLists.txt
+6
-0
paddle/fluid/lite/kernels/x86/activation_compute.cc
paddle/fluid/lite/kernels/x86/activation_compute.cc
+108
-0
paddle/fluid/lite/kernels/x86/elementwise_compute.cc
paddle/fluid/lite/kernels/x86/elementwise_compute.cc
+56
-0
paddle/fluid/lite/model_parser/model_parser.cc
paddle/fluid/lite/model_parser/model_parser.cc
+1
-1
paddle/fluid/lite/model_parser/model_parser.h
paddle/fluid/lite/model_parser/model_parser.h
+2
-0
paddle/fluid/lite/operators/CMakeLists.txt
paddle/fluid/lite/operators/CMakeLists.txt
+2
-0
paddle/fluid/lite/operators/activation_ops.cc
paddle/fluid/lite/operators/activation_ops.cc
+37
-0
paddle/fluid/lite/operators/elementwise_ops.cc
paddle/fluid/lite/operators/elementwise_ops.cc
+47
-0
paddle/fluid/lite/operators/feed_op.cc
paddle/fluid/lite/operators/feed_op.cc
+0
-1
paddle/fluid/lite/operators/mul_op.h
paddle/fluid/lite/operators/mul_op.h
+6
-3
paddle/fluid/lite/operators/op_params.h
paddle/fluid/lite/operators/op_params.h
+37
-5
paddle/fluid/lite/utils/all.h
paddle/fluid/lite/utils/all.h
+1
-0
paddle/fluid/lite/utils/factory.h
paddle/fluid/lite/utils/factory.h
+4
-1
未找到文件。
paddle/fluid/framework/operator.h
浏览文件 @
e9f33320
...
...
@@ -232,6 +232,17 @@ using OpKernelConfigsMap =
std
::
unordered_map
<
OpKernelType
,
std
::
vector
<
KernelConfig
>
,
OpKernelType
::
Hash
>
;
class
OpDuppy
:
public
OperatorBase
{
public:
OpDuppy
()
:
OperatorBase
(
"duppy"
,
{},
{},
{})
{}
void
RunImpl
(
const
Scope
&
scope
,
const
platform
::
Place
&
place
)
const
override
{}
};
OpDuppy
op_duppy
;
Scope
scope_duppy
;
RuntimeContext
runtime_context_duppy
({},
{});
class
ExecutionContext
{
public:
ExecutionContext
(
const
OperatorBase
&
op
,
const
Scope
&
scope
,
...
...
@@ -244,6 +255,13 @@ class ExecutionContext {
ctx_
(
ctx
),
kernel_configs_
(
configs
)
{}
ExecutionContext
(
const
platform
::
DeviceContext
&
device_context
)
:
op_
(
op_duppy
),
scope_
(
scope_duppy
),
device_context_
(
device_context
),
ctx_
(
runtime_context_duppy
),
kernel_configs_
(
nullptr
)
{}
const
OperatorBase
&
op
()
const
{
return
op_
;
}
const
Scope
&
scope
()
const
{
return
scope_
;
}
...
...
paddle/fluid/incubate/CMakeLists.txt
0 → 100644
浏览文件 @
e9f33320
include_directories
(
lite
)
\ No newline at end of file
paddle/fluid/lite/api/cxx_api.cc
浏览文件 @
e9f33320
...
...
@@ -25,7 +25,7 @@ namespace paddle {
namespace
lite
{
#ifndef LITE_WITH_LIGHT_WEIGHT_FRAMEWORK
void
CXXPredictor
::
SaveModel
(
const
std
::
string
&
dir
)
{
void
ExecutorLite
::
SaveModel
(
const
std
::
string
&
dir
)
{
MkDirRecursively
(
dir
.
c_str
());
program_
->
PersistModel
(
dir
,
program_desc_
);
}
...
...
paddle/fluid/lite/api/cxx_api.h
浏览文件 @
e9f33320
...
...
@@ -28,14 +28,24 @@ namespace lite {
struct
Config
{};
class
CXXPredictor
{
class
ExecutorLite
{
public:
CXXPredictor
()
{
scope_
=
std
::
make_shared
<
Scope
>
();
}
ExecutorLite
()
{
scope_
=
std
::
make_shared
<
Scope
>
();
}
explicit
ExecutorLite
(
const
std
::
shared_ptr
<
lite
::
Scope
>&
root_scope
)
{
scope_
=
root_scope
;
}
void
Build
(
const
std
::
string
&
model_path
,
const
Place
&
prefer_place
,
const
std
::
vector
<
Place
>&
valid_places
)
{
LoadModel
(
model_path
,
scope_
.
get
(),
&
program_desc_
);
Program
program
(
program_desc_
,
scope_
,
valid_places
);
Build
(
program_desc_
,
prefer_place
,
valid_places
);
}
void
Build
(
const
framework
::
proto
::
ProgramDesc
&
desc
,
const
Place
&
prefer_place
,
const
std
::
vector
<
Place
>&
valid_places
)
{
program_desc_
=
desc
;
Program
program
(
desc
,
scope_
,
valid_places
);
optimizer_
.
KernelPickPreferPlace
(
prefer_place
);
core
::
KernelPickFactor
factor
;
...
...
@@ -81,5 +91,57 @@ class CXXPredictor {
std
::
unique_ptr
<
RuntimeProgram
>
program_
;
};
/*
* An executor for training.
*
* Usage:
*
* CXXTrainer trainer(...);
* trainer.RunStartupProgram(...);
* auto exe = BuildMainProgramExecutor(...);
*
* for (auto& epoch : epoches) {
* auto* tensor0 = exe.GetInput(...);
* // fill data for tensor0
* exe.Run();
* }
*/
class
CXXTrainer
{
public:
CXXTrainer
(
const
std
::
shared_ptr
<
lite
::
Scope
>&
root_scope
,
const
Place
&
preferred_place
,
const
std
::
vector
<
Place
>&
valid_places
)
:
scope_
(
root_scope
),
preferred_place_
(
preferred_place
),
valid_places_
(
valid_places
),
main_program_executor_
(
ExecutorLite
(
scope_
))
{}
// Build the RuntimeProgram cache for the main program. The cache will run
// multiple times for the epoches.
// NOTE Just support to execute the 0-th block currently.
ExecutorLite
&
BuildMainProgramExecutor
(
const
framework
::
proto
::
ProgramDesc
&
desc
,
int
block_id
=
0
)
{
main_program_executor_
.
Build
(
desc
,
preferred_place_
,
valid_places_
);
return
main_program_executor_
;
}
// Run the startup program. It just executes once, no cache needed.
void
RunStartupProgram
(
const
framework
::
proto
::
ProgramDesc
&
desc
,
int
block_id
=
0
)
{
ExecutorLite
exe
(
scope_
);
exe
.
Build
(
desc
,
preferred_place_
,
valid_places_
);
exe
.
Run
();
}
private:
std
::
shared_ptr
<
lite
::
Scope
>
scope_
;
Place
preferred_place_
;
std
::
vector
<
Place
>
valid_places_
;
// The training program.
ExecutorLite
main_program_executor_
;
};
}
// namespace lite
}
// namespace paddle
paddle/fluid/lite/api/cxx_api_bin.cc
浏览文件 @
e9f33320
...
...
@@ -20,7 +20,7 @@ namespace paddle {
namespace
lite
{
void
Run
(
const
char
*
model_dir
)
{
lite
::
CXXPredic
tor
predictor
;
lite
::
Execu
tor
predictor
;
#ifndef LITE_WITH_CUDA
std
::
vector
<
Place
>
valid_places
({
Place
{
TARGET
(
kHost
),
PRECISION
(
kFloat
)}});
#else
...
...
paddle/fluid/lite/api/cxx_api_test.cc
浏览文件 @
e9f33320
...
...
@@ -22,11 +22,15 @@
DEFINE_string
(
model_dir
,
""
,
""
);
DEFINE_string
(
optimized_model
,
""
,
""
);
// For training.
DEFINE_string
(
startup_program_path
,
""
,
""
);
DEFINE_string
(
main_program_path
,
""
,
""
);
namespace
paddle
{
namespace
lite
{
TEST
(
CXXApi
,
test
)
{
lite
::
CXXPredictor
predictor
;
lite
::
ExecutorLite
predictor
;
#ifndef LITE_WITH_CUDA
std
::
vector
<
Place
>
valid_places
({
Place
{
TARGET
(
kHost
),
PRECISION
(
kFloat
)}});
#else
...
...
@@ -64,14 +68,48 @@ TEST(CXXApi, test) {
#ifndef LITE_WITH_LIGHT_WEIGHT_FRAMEWORK
TEST
(
CXXApi
,
save_model
)
{
lite
::
CXXPredictor
predictor
;
lite
::
ExecutorLite
predictor
;
std
::
vector
<
Place
>
valid_places
({
Place
{
TARGET
(
kHost
),
PRECISION
(
kFloat
)}});
predictor
.
Build
(
FLAGS_model_dir
,
Place
{
TARGET
(
kCUDA
),
PRECISION
(
kFloat
)},
valid_places
);
predictor
.
SaveModel
(
FLAGS_optimized_model
);
}
#endif
#endif // LITE_WITH_LIGHT_WEIGHT_FRAMEWORK
#ifndef LITE_WITH_LIGHT_WEIGHT_FRAMEWORK
TEST
(
CXXTrainer
,
train
)
{
Place
prefer_place
({
TARGET
(
kHost
),
PRECISION
(
kFloat
),
DATALAYOUT
(
kNCHW
)});
std
::
vector
<
Place
>
valid_places
({
prefer_place
});
auto
scope
=
std
::
make_shared
<
lite
::
Scope
>
();
CXXTrainer
trainer
(
scope
,
prefer_place
,
valid_places
);
std
::
string
main_program_pb
,
startup_program_pb
;
ReadBinaryFile
(
FLAGS_main_program_path
,
&
main_program_pb
);
ReadBinaryFile
(
FLAGS_startup_program_path
,
&
startup_program_pb
);
framework
::
proto
::
ProgramDesc
main_program_desc
,
startup_program_desc
;
main_program_desc
.
ParseFromString
(
main_program_pb
);
startup_program_desc
.
ParseFromString
(
startup_program_pb
);
LOG
(
INFO
)
<<
main_program_desc
.
DebugString
();
for
(
const
auto
&
op
:
main_program_desc
.
blocks
(
0
).
ops
())
{
LOG
(
INFO
)
<<
"get op "
<<
op
.
type
();
}
return
;
trainer
.
RunStartupProgram
(
startup_program_desc
);
auto
&
exe
=
trainer
.
BuildMainProgramExecutor
(
main_program_desc
);
auto
*
tensor0
=
exe
.
GetInput
(
0
);
tensor0
->
Resize
(
std
::
vector
<
int64_t
>
({
100
,
100
}));
auto
*
data0
=
tensor0
->
mutable_data
<
float
>
();
data0
[
0
]
=
0
;
exe
.
Run
();
}
#endif // LITE_WITH_LIGHT_WEIGHT_FRAMEWORK
}
// namespace lite
}
// namespace paddle
...
...
paddle/fluid/lite/core/context.h
浏览文件 @
e9f33320
...
...
@@ -16,9 +16,13 @@
#include "paddle/fluid/lite/utils/any.h"
#ifdef LITE_WITH_CUDA
#include
<paddle/fluid/lite/cuda/blas.h>
#include
"paddle/fluid/lite/cuda/blas.h"
#include "paddle/fluid/lite/cuda/cuda_utils.h"
#endif
#ifdef LITE_WITH_X86
#include "paddle/fluid/framework/operator.h"
#include "paddle/fluid/platform/device_context.h"
#endif
#include <memory>
#include <set>
#include <vector>
...
...
@@ -54,6 +58,10 @@ struct X86Context {
// overall information
// kernel information
// legacy info.
std
::
unique_ptr
<::
paddle
::
platform
::
CPUDeviceContext
>
x86_device_context
;
std
::
unique_ptr
<::
paddle
::
framework
::
ExecutionContext
>
x86_execution_context
;
};
#endif
...
...
paddle/fluid/lite/core/hvy_tensor.h
浏览文件 @
e9f33320
...
...
@@ -29,7 +29,7 @@ namespace lite {
class
DDimHvy
:
public
DDimBase
<
DDimHvy
>
{
public:
DDimHvy
()
=
default
;
explicit
DDimHvy
(
const
std
::
vector
<
value_type
>&
x
)
:
DDimBase
<
DDimHvy
>
()
{
DDimHvy
(
const
std
::
vector
<
value_type
>&
x
)
:
DDimBase
<
DDimHvy
>
()
{
// NOLINT
ConstructFrom
(
x
);
}
explicit
DDimHvy
(
const
framework
::
DDim
&
x
)
:
data_
(
x
)
{}
...
...
@@ -47,6 +47,14 @@ class DDimHvy : public DDimBase<DDimHvy> {
size_t
size
()
const
{
return
data_
.
size
();
}
bool
empty
()
const
{
return
data_
.
size
()
==
0
;
}
bool
operator
==
(
const
DDimHvy
&
other
)
{
if
(
data_
.
size
()
!=
other
.
data_
.
size
())
return
false
;
for
(
int
i
=
0
;
i
<
data_
.
size
();
i
++
)
{
if
(
data_
[
i
]
!=
other
.
data_
[
i
])
return
false
;
}
return
true
;
}
private:
framework
::
DDim
data_
;
};
...
...
@@ -85,8 +93,7 @@ class TensorHvy : public TensorBase<TensorHvy> {
const
void
*
raw_data
()
const
{
return
data_
.
raw_data
();
}
template
<
typename
DimT
>
void
Resize
(
const
DimT
&
dims
)
{
void
Resize
(
const
DDimHvy
&
dims
)
{
LOG
(
INFO
)
<<
"dims.size "
<<
dims
.
size
();
data_
.
Resize
(
framework
::
make_ddim
(
dims
.
Vectorize
()));
}
...
...
@@ -103,6 +110,9 @@ class TensorHvy : public TensorBase<TensorHvy> {
const
framework
::
LoD
&
lod
()
const
{
return
data_
.
lod
();
}
framework
::
LoD
*
mutable_lod
()
{
return
data_
.
mutable_lod
();
}
const
framework
::
LoDTensor
&
raw_tensor
()
const
{
return
data_
;
}
framework
::
LoDTensor
&
raw_tensor
()
{
return
data_
;
}
private:
framework
::
LoDTensor
data_
;
};
...
...
paddle/fluid/lite/core/naive_test_model.py
0 → 100644
浏览文件 @
e9f33320
import
numpy
import
sys
,
os
import
numpy
as
np
import
paddle.fluid
as
fluid
from
paddle.fluid.backward
import
append_backward
a
=
fluid
.
layers
.
data
(
name
=
"a"
,
shape
=
[
100
],
dtype
=
'float32'
)
label
=
fluid
.
layers
.
data
(
name
=
"label"
,
shape
=
[
100
],
dtype
=
'float32'
)
a1
=
fluid
.
layers
.
fc
(
input
=
a
,
size
=
500
,
act
=
None
,
bias_attr
=
False
)
cost
=
fluid
.
layers
.
square_error_cost
(
a1
,
label
)
avg_cost
=
fluid
.
layers
.
mean
(
cost
)
optimizer
=
fluid
.
optimizer
.
SGD
(
learning_rate
=
0.001
)
optimizer
.
minimize
(
cost
)
cpu
=
fluid
.
core
.
CPUPlace
()
loss
=
exe
=
fluid
.
Executor
(
cpu
)
exe
.
run
(
fluid
.
default_startup_program
())
with
open
(
'startup_program.pb'
,
'wb'
)
as
f
:
f
.
write
(
fluid
.
default_startup_program
().
desc
.
serialize_to_string
())
data_1
=
np
.
array
(
numpy
.
random
.
random
([
100
,
100
]),
dtype
=
'float32'
)
#fluid.default_main_program().desc.
#prog = fluid.compiler.CompiledProgram(fluid.default_main_program())
prog
=
fluid
.
default_main_program
()
#append_backward(loss)
with
open
(
'main_program.pb'
,
'wb'
)
as
f
:
f
.
write
(
prog
.
desc
.
serialize_to_string
())
#outs = exe.run(program=prog, feed={'a':data_1, }, fetch_list=[cost])
sys
.
exit
(
0
)
fluid
.
io
.
save_inference_model
(
"./model2"
,
[
a
.
name
],
[
a1
],
exe
)
print
(
numpy
.
array
(
outs
))
paddle/fluid/lite/core/op_lite.cc
浏览文件 @
e9f33320
...
...
@@ -71,7 +71,7 @@ bool OpLite::Run() {
bool
OpLite
::
Attach
(
const
OpDesc
&
opdesc
,
lite
::
Scope
*
scope
)
{
// valid_places_.clear();
CHECK
(
scope
!=
nullptr
);
//
CHECK(!op_info_.get());
//CHECK(!op_info_.get());
scope_
=
scope
;
op_info_
.
reset
(
new
OpInfo
);
// Force clean the out-of-date infomation.
op_info_
->
Build
(
opdesc
.
ReadonlyProto
());
...
...
paddle/fluid/lite/core/op_lite.h
浏览文件 @
e9f33320
...
...
@@ -116,6 +116,22 @@ class OpLite : public Registry {
friend
class
mir
::
Node
;
friend
class
mir
::
SSAGraph
;
protected:
// some helper functions.
template
<
typename
T
>
const
T
*
GetVar
(
Scope
*
scope
,
const
std
::
string
&
name
)
{
auto
*
var
=
scope
->
FindVar
(
name
);
CHECK
(
var
)
<<
"No var found for "
<<
name
;
return
&
var
->
Get
<
T
>
();
}
template
<
typename
T
>
T
*
GetMutableVar
(
Scope
*
scope
,
const
std
::
string
&
name
)
{
auto
*
var
=
scope
->
FindVar
(
name
);
CHECK
(
var
)
<<
"No var found for "
<<
name
;
return
var
->
GetMutable
<
T
>
();
}
protected:
lite
::
Scope
*
scope_
{};
std
::
unique_ptr
<
KernelBase
>
kernel_
;
...
...
paddle/fluid/lite/core/program.h
浏览文件 @
e9f33320
...
...
@@ -62,13 +62,13 @@ struct Program {
// Build from a program and scope.
void
Build
(
const
framework
::
proto
::
ProgramDesc
&
program
)
{
CHECK
(
ops
.
empty
())
<<
"Executor duplicate Build found"
;
// Create operators.
for
(
const
auto
&
proto_op_desc
:
program
.
blocks
(
0
).
ops
())
{
lite
::
OpDesc
op_desc
(
proto_op_desc
);
auto
op_type
=
op_desc
.
Type
();
// if (op_type == "feed" || op_type == "fetch") continue;
VLOG
(
4
)
<<
"create Op ["
<<
op_type
<<
"]"
;
LOG
(
INFO
)
<<
"create Op ["
<<
op_type
<<
"]"
;
auto
op
=
LiteOpRegistry
::
Global
().
Create
(
op_type
);
CHECK
(
op
)
<<
"no Op found for "
<<
op_type
;
ops
.
emplace_back
(
std
::
move
(
op
));
...
...
@@ -86,6 +86,7 @@ struct Program {
tmp_vars
.
push_back
(
"feed"
);
tmp_vars
.
push_back
(
"fetch"
);
CHECK
(
!
program
.
blocks
().
empty
());
for
(
auto
proto_var_desc
:
program
.
blocks
(
0
).
vars
())
{
lite
::
VarDesc
var_desc
(
proto_var_desc
);
if
(
!
var_desc
.
Persistable
())
{
...
...
paddle/fluid/lite/kernels/CMakeLists.txt
浏览文件 @
e9f33320
...
...
@@ -3,3 +3,4 @@ set(lite_kernel_deps type_system kernel_lite op_lite op_registry_lite ${tensor_l
add_subdirectory
(
host
)
add_subdirectory
(
arm
)
add_subdirectory
(
cuda
)
add_subdirectory
(
x86
)
paddle/fluid/lite/kernels/x86/CMakeLists.txt
0 → 100644
浏览文件 @
e9f33320
if
(
NOT LITE_WITH_X86
)
return
()
endif
()
cc_library
(
activation_compute SRCS activation_compute.cc DEPS
${
lite_kernel_deps
}
activation_op
)
cc_library
(
elementwise_compute SRCS elementwise_compute.cc DEPS
${
lite_kernel_deps
}
elementwise_op
)
paddle/fluid/lite/kernels/x86/activation_compute.cc
0 → 100644
浏览文件 @
e9f33320
#include "paddle/fluid/framework/eigen.h"
#include "paddle/fluid/framework/operator.h"
#include "paddle/fluid/lite/core/kernel.h"
#include "paddle/fluid/lite/core/op_registry.h"
#include "paddle/fluid/operators/activation_op.h"
namespace
paddle
{
namespace
lite
{
namespace
kernels
{
namespace
x86
{
template
<
typename
Functor
>
void
Activate
(
const
platform
::
CPUDeviceContext
&
context
,
const
framework
::
LoDTensor
*
X
,
framework
::
LoDTensor
*
Out
)
{
using
T
=
typename
Functor
::
ELEMENT_TYPE
;
auto
*
place
=
context
.
eigen_device
();
auto
x
=
framework
::
EigenVector
<
T
>::
Flatten
(
paddle
::
operators
::
detail
::
Ref
(
X
));
auto
out
=
framework
::
EigenVector
<
T
>::
Flatten
(
paddle
::
operators
::
detail
::
Ref
(
Out
));
Functor
()(
*
place
,
x
,
out
);
}
template
<
typename
Functor
>
void
ActivateGrad
(
const
platform
::
CPUDeviceContext
&
context
,
const
framework
::
LoDTensor
*
X
,
const
framework
::
LoDTensor
*
Out
,
const
framework
::
LoDTensor
*
Out_grad
,
framework
::
LoDTensor
*
X_grad
)
{
using
T
=
typename
Functor
::
ELEMENT_TYPE
;
auto
*
place
=
context
.
eigen_device
();
auto
x
=
framework
::
EigenVector
<
T
>::
Flatten
(
paddle
::
operators
::
detail
::
Ref
(
X
));
auto
out
=
framework
::
EigenVector
<
T
>::
Flatten
(
paddle
::
operators
::
detail
::
Ref
(
Out
));
auto
x_grad
=
framework
::
EigenVector
<
T
>::
Flatten
(
paddle
::
operators
::
detail
::
Ref
(
X_grad
));
auto
out_grad
=
framework
::
EigenVector
<
T
>::
Flatten
(
paddle
::
operators
::
detail
::
Ref
(
Out_grad
));
Functor
()(
*
place
,
x
,
out
,
out_grad
,
x_grad
);
}
template
<
typename
T
>
class
SquareCompute
:
public
KernelLite
<
TARGET
(
kHost
),
PRECISION
(
kFloat
)
>
{
public:
using
param_t
=
operators
::
ActivationParam
;
void
Run
()
override
{
auto
&
context
=
context_
->
As
<
X86Context
>
();
auto
&
param
=
*
param_
.
get_mutable
<
operators
::
ActivationParam
>
();
CHECK
(
context
.
x86_device_context
);
param
.
Out
->
template
mutable_data
<
T
>();
Activate
<
paddle
::
operators
::
SquareFunctor
<
T
>>
(
*
context
.
x86_device_context
,
&
param
.
X
->
raw_tensor
(),
&
param
.
Out
->
raw_tensor
());
}
// TargetType target() const override;
// PrecisionType precision() const override;
virtual
~
SquareCompute
()
=
default
;
};
template
<
typename
T
>
class
SquareGradCompute
:
public
KernelLite
<
TARGET
(
kHost
),
PRECISION
(
kFloat
)
>
{
public:
using
param_t
=
operators
::
ActivationGradParam
;
void
Run
()
override
{
auto
&
context
=
context_
->
As
<
X86Context
>
();
auto
&
param
=
*
param_
.
get_mutable
<
operators
::
ActivationGradParam
>
();
CHECK
(
context
.
x86_device_context
);
param
.
X_grad
->
template
mutable_data
<
T
>();
ActivateGrad
<
paddle
::
operators
::
SquareGradFunctor
<
T
>>
(
*
context
.
x86_device_context
,
&
param
.
X
->
raw_tensor
(),
&
param
.
Out
->
raw_tensor
(),
&
param
.
Out_grad
->
raw_tensor
(),
&
param
.
X_grad
->
raw_tensor
());
}
// TargetType target() const override;
// PrecisionType precision() const override;
virtual
~
SquareGradCompute
()
=
default
;
};
}
// namespace x86
}
// namespace kernels
}
// namespace lite
}
// namespace paddle
// float
REGISTER_LITE_KERNEL
(
square
,
kX86
,
kFloat
,
kNCHW
,
paddle
::
lite
::
kernels
::
x86
::
SquareCompute
<
float
>
,
def
)
.
BindInput
(
"Input"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
BindInput
(
"Bias"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
BindInput
(
"W"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
BindOutput
(
"Out"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
Finalize
();
REGISTER_LITE_KERNEL
(
square_grad
,
kX86
,
kFloat
,
kNCHW
,
paddle
::
lite
::
kernels
::
x86
::
SquareGradCompute
<
float
>
,
def
)
.
BindInput
(
"Input"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
BindInput
(
"Bias"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
BindInput
(
"W"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
BindOutput
(
"Out"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kHost
))})
.
Finalize
();
paddle/fluid/lite/kernels/x86/elementwise_compute.cc
0 → 100644
浏览文件 @
e9f33320
#include "paddle/fluid/framework/eigen.h"
#include "paddle/fluid/framework/operator.h"
#include "paddle/fluid/lite/core/kernel.h"
#include "paddle/fluid/lite/core/op_registry.h"
#include "paddle/fluid/operators/activation_op.h"
#include "paddle/fluid/operators/elementwise/elementwise_op.h"
#include "paddle/fluid/operators/elementwise/elementwise_op_function.h"
namespace
paddle
{
namespace
lite
{
namespace
kernels
{
namespace
x86
{
template
<
typename
T
>
struct
SubFunctor
{
inline
HOSTDEVICE
T
operator
()(
T
a
,
T
b
)
const
{
return
a
-
b
;
}
};
template
<
typename
T
>
class
ElementwiseSubCompute
:
public
KernelLite
<
TARGET
(
kHost
),
PRECISION
(
kFloat
)
>
{
public:
using
param_t
=
operators
::
ElementwiseParam
;
void
Run
()
override
{
auto
&
param
=
*
param_
.
get_mutable
<
param_t
>
();
auto
&
context
=
context_
->
As
<
X86Context
>
();
CHECK
(
context
.
x86_device_context
);
param
.
Out
->
template
mutable_data
<
T
>();
paddle
::
operators
::
ElementwiseComputeEx
<
SubFunctor
<
T
>
,
platform
::
CPUDeviceContext
,
T
>
(
*
context
.
x86_execution_context
,
&
param
.
X
->
raw_tensor
(),
&
param
.
Y
->
raw_tensor
(),
param
.
axis
,
SubFunctor
<
T
>
(),
&
param
.
Out
->
raw_tensor
());
}
// TargetType target() const override;
// PrecisionType precision() const override;
virtual
~
ElementwiseSubCompute
()
=
default
;
};
}
// namespace x86
}
// namespace kernels
}
// namespace lite
}
// namespace paddle
// float
REGISTER_LITE_KERNEL
(
square
,
kHost
,
kFloat
,
kNCHW
,
paddle
::
lite
::
kernels
::
x86
::
ElementwiseSubCompute
<
float
>
,
def
)
.
BindInput
(
"X"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kX86
))})
.
BindInput
(
"Y"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kX86
))})
.
BindOutput
(
"Out"
,
{
LiteType
::
GetTensorTy
(
TARGET
(
kX86
))})
.
Finalize
();
paddle/fluid/lite/model_parser/model_parser.cc
浏览文件 @
e9f33320
...
...
@@ -114,7 +114,7 @@ void LoadLoDTensor(std::istream &is, Variable *var) {
void
ReadBinaryFile
(
const
std
::
string
&
filename
,
std
::
string
*
contents
)
{
std
::
ifstream
fin
(
filename
,
std
::
ios
::
in
|
std
::
ios
::
binary
);
CHECK
(
fin
.
is_open
())
<<
"Cannot open file "
<<
filename
;
CHECK
(
fin
.
is_open
())
<<
"Cannot open file
:
"
<<
filename
;
fin
.
seekg
(
0
,
std
::
ios
::
end
);
auto
size
=
fin
.
tellg
();
contents
->
clear
();
...
...
paddle/fluid/lite/model_parser/model_parser.h
浏览文件 @
e9f33320
...
...
@@ -47,5 +47,7 @@ void SerializeTensor(std::ostream& os, const lite::Scope& scope,
// LoDTensor to ostream
void
TensorToStream
(
std
::
ostream
&
os
,
const
lite
::
Tensor
&
tensor
);
void
ReadBinaryFile
(
const
std
::
string
&
filename
,
std
::
string
*
contents
);
}
// namespace lite
}
// namespace paddle
paddle/fluid/lite/operators/CMakeLists.txt
浏览文件 @
e9f33320
...
...
@@ -7,6 +7,8 @@ cc_library(scale_op_lite SRCS scale_op.cc DEPS ${op_DEPS})
cc_library
(
feed_op_lite SRCS feed_op.cc DEPS
${
op_DEPS
}
)
cc_library
(
fetch_op_lite SRCS fetch_op.cc DEPS
${
op_DEPS
}
)
cc_library
(
io_copy_op_lite SRCS io_copy_op.cc DEPS
${
op_DEPS
}
)
cc_library
(
activation_ops_lite SRCS activation_ops.cc DEPS
${
op_DEPS
}
)
cc_library
(
elementwise_ops_lite SRCS elementwise_ops.cc DEPS
${
op_DEPS
}
)
cc_library
(
op_params_lite SRCS op_params.cc DEPS
${
tensor_lite
}
)
set
(
ops_lite
...
...
paddle/fluid/lite/operators/activation_ops.cc
0 → 100644
浏览文件 @
e9f33320
#include "paddle/fluid/lite/core/op_lite.h"
#include "paddle/fluid/lite/core/op_registry.h"
namespace
paddle
{
namespace
lite
{
namespace
operators
{
class
ActivationOp
:
public
OpLite
{
public:
explicit
ActivationOp
(
const
std
::
string
&
type
)
:
OpLite
(
type
)
{}
bool
CheckShape
()
const
override
{
return
true
;
}
bool
InferShape
()
const
override
{
param_
.
Out
->
Resize
(
param_
.
X
->
dims
());
return
true
;
}
bool
AttachImpl
(
const
OpDesc
&
opdesc
,
lite
::
Scope
*
scope
)
override
{
auto
X_name
=
opdesc
.
Input
(
"X"
).
front
();
auto
Out_name
=
opdesc
.
Output
(
"Out"
).
front
();
param_
.
X
=
GetVar
<
lite
::
Tensor
>
(
scope
,
X_name
);
param_
.
Out
=
GetMutableVar
<
Tensor
>
(
scope
,
Out_name
);
}
void
AttachKernel
(
KernelBase
*
kernel
)
override
{
kernel
->
SetParam
(
param_
);
}
private:
mutable
ActivationParam
param_
;
};
}
// namespace operators
}
// namespace lite
}
// namespace paddle
REGISTER_LITE_OP
(
square
,
paddle
::
lite
::
operators
::
ActivationOp
);
paddle/fluid/lite/operators/elementwise_ops.cc
0 → 100644
浏览文件 @
e9f33320
#include "paddle/fluid/lite/core/op_lite.h"
#include "paddle/fluid/lite/core/op_registry.h"
namespace
paddle
{
namespace
lite
{
namespace
operators
{
class
ElementwiseOp
:
public
OpLite
{
public:
explicit
ElementwiseOp
(
const
std
::
string
&
type
)
:
OpLite
(
type
)
{}
bool
CheckShape
()
const
override
{
CHECK_OR_FALSE
(
param_
.
X
);
CHECK_OR_FALSE
(
param_
.
Y
);
CHECK_OR_FALSE
(
param_
.
Out
);
return
true
;
}
bool
InferShape
()
const
override
{
CHECK_OR_FALSE
(
param_
.
X
->
dims
()
==
param_
.
Y
->
dims
());
param_
.
Out
->
Resize
(
param_
.
X
->
dims
());
return
true
;
}
bool
AttachImpl
(
const
OpDesc
&
opdesc
,
lite
::
Scope
*
scope
)
override
{
CHECK_EQ
(
opdesc
.
Inputs
().
size
(),
2UL
);
auto
X_name
=
opdesc
.
Input
(
"X"
).
front
();
auto
Y_name
=
opdesc
.
Input
(
"Y"
).
front
();
auto
Out_name
=
opdesc
.
Output
(
"Out"
).
front
();
param_
.
X
=
GetVar
<
lite
::
Tensor
>
(
scope
,
X_name
);
param_
.
Y
=
GetVar
<
lite
::
Tensor
>
(
scope
,
Y_name
);
param_
.
Out
=
GetMutableVar
<
Tensor
>
(
scope
,
Out_name
);
param_
.
axis
=
boost
::
get
<
int
>
(
opdesc
.
GetAttr
(
"axis"
));
}
void
AttachKernel
(
KernelBase
*
kernel
)
override
{
kernel
->
SetParam
(
param_
);
}
private:
mutable
operators
::
ElementwiseParam
param_
;
};
}
// namespace operators
}
// namespace lite
}
// namespace paddle
REGISTER_LITE_OP
(
elementwise_sub
,
paddle
::
lite
::
operators
::
ElementwiseOp
);
paddle/fluid/lite/operators/feed_op.cc
浏览文件 @
e9f33320
...
...
@@ -31,7 +31,6 @@ class FeedOp : public OpLite {
bool
InferShape
()
const
override
{
return
true
;
}
protected:
void
AttachKernel
(
KernelBase
*
kernel
)
override
{
kernel
->
SetParam
(
param_
);
}
protected:
...
...
paddle/fluid/lite/operators/mul_op.h
浏览文件 @
e9f33320
...
...
@@ -41,9 +41,12 @@ class MulOpLite : public OpLite {
auto
input
=
op_desc
.
Input
(
"X"
).
front
();
auto
W
=
op_desc
.
Input
(
"Y"
).
front
();
auto
out
=
op_desc
.
Output
(
"Out"
).
front
();
param_
.
x
=
scope
->
FindVar
(
input
)
->
GetMutable
<
Tensor
>
();
param_
.
y
=
scope
->
FindVar
(
W
)
->
GetMutable
<
Tensor
>
();
auto
*
var
=
scope
->
FindVar
(
input
);
CHECK
(
var
);
param_
.
x
=
var
->
GetMutable
<
Tensor
>
();
var
=
scope
->
FindVar
(
W
);
CHECK
(
var
);
param_
.
y
=
var
->
GetMutable
<
Tensor
>
();
CHECK
(
scope
->
FindVar
(
out
));
param_
.
output
=
scope
->
FindVar
(
out
)
->
GetMutable
<
Tensor
>
();
param_
.
x_num_col_dims
=
GetAttr
<
int
>
(
op_desc
.
GetAttr
(
"x_num_col_dims"
));
...
...
paddle/fluid/lite/operators/op_params.h
浏览文件 @
e9f33320
...
...
@@ -25,6 +25,9 @@ namespace paddle {
namespace
lite
{
namespace
operators
{
using
param_t
=
Any
;
/// ----------------------- Functional operators ------------------------------
struct
FeedParam
{
const
std
::
vector
<
lite
::
Tensor
>*
feed_list
{};
lite
::
Tensor
*
out
{};
...
...
@@ -37,6 +40,14 @@ struct FetchParam {
int
col
;
};
// Helper op for lite framework
struct
IoCopyParam
{
const
lite
::
Tensor
*
x
{};
lite
::
Tensor
*
y
{};
};
/// -------------------------- NN operators ------------------------------------
struct
FcParam
{
lite
::
Tensor
*
input
{};
lite
::
Tensor
*
w
{};
...
...
@@ -71,13 +82,34 @@ struct ScaleParam {
bool
bias_after_scale
{
true
};
};
struct
IoCopyParam
{
const
lite
::
Tensor
*
x
{};
lite
::
Tensor
*
y
{};
/// ----------------------- element wise operators ----------------------
struct
ElementwiseParam
{
const
lite
::
Tensor
*
X
{};
const
lite
::
Tensor
*
Y
{};
lite
::
Tensor
*
Out
{};
int
axis
{
-
1
};
// for broadcasting.
};
struct
ElementwiseGradParam
{
const
lite
::
Tensor
*
X_grad
{};
const
lite
::
Tensor
*
Y_grad
{};
lite
::
Tensor
*
Out_grad
{};
int
axis
{
-
1
};
// for broadcasting.
};
using
param_t
=
variant
<
FeedParam
,
FetchParam
,
FcParam
,
ReluParam
,
MulParam
,
ScaleParam
,
IoCopyParam
>
;
/// ----------------------- activation operators ----------------------
struct
ActivationParam
{
const
lite
::
Tensor
*
X
{};
lite
::
Tensor
*
Out
{};
};
struct
ActivationGradParam
{
const
lite
::
Tensor
*
X
{};
const
lite
::
Tensor
*
Out
{};
// for backward
lite
::
Tensor
*
X_grad
{};
const
lite
::
Tensor
*
Out_grad
{};
};
}
// namespace operators
}
// namespace lite
...
...
paddle/fluid/lite/utils/all.h
浏览文件 @
e9f33320
...
...
@@ -21,3 +21,4 @@
#include "paddle/fluid/lite/utils/io.h"
#include "paddle/fluid/lite/utils/macros.h"
#include "paddle/fluid/lite/utils/varient.h"
#include "paddle/fluid/lite/utils/any.h"
paddle/fluid/lite/utils/factory.h
浏览文件 @
e9f33320
...
...
@@ -55,7 +55,10 @@ class Factory {
}
item_ptr_t
Create
(
const
std
::
string
&
op_type
)
const
{
return
std
::
move
(
Creates
(
op_type
).
front
());
auto
res
=
Creates
(
op_type
);
if
(
res
.
empty
())
return
nullptr
;
CHECK_EQ
(
res
.
size
(),
1UL
)
<<
"Get multiple Op for type "
<<
op_type
;
return
std
::
move
(
res
.
front
());
}
std
::
list
<
item_ptr_t
>
Creates
(
const
std
::
string
&
op_type
)
const
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录