Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
csdn_franckjun
Paddle
提交
851ea04d
P
Paddle
项目概览
csdn_franckjun
/
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
851ea04d
编写于
2月 25, 2019
作者:
K
Krzysztof Binias
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add UTs to check whether primitives for activations and softmax already exist in backward
test=develop
上级
a6e3cd5e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
146 addition
and
65 deletion
+146
-65
python/paddle/fluid/tests/unittests/mkldnn/mkldnn_op_test.py
python/paddle/fluid/tests/unittests/mkldnn/mkldnn_op_test.py
+72
-0
python/paddle/fluid/tests/unittests/mkldnn/test_activation_mkldnn_op.py
...fluid/tests/unittests/mkldnn/test_activation_mkldnn_op.py
+17
-55
python/paddle/fluid/tests/unittests/mkldnn/test_softmax_mkldnn_op.py
...le/fluid/tests/unittests/mkldnn/test_softmax_mkldnn_op.py
+57
-0
python/paddle/fluid/tests/unittests/test_softmax_op.py
python/paddle/fluid/tests/unittests/test_softmax_op.py
+0
-10
未找到文件。
python/paddle/fluid/tests/unittests/mkldnn/mkldnn_op_test.py
0 → 100644
浏览文件 @
851ea04d
# Copyright (c) 2019 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.
from
__future__
import
print_function
import
numpy
as
np
import
paddle.fluid.core
as
core
import
paddle.fluid
as
fluid
def
check_if_mkldnn_primitives_exist_in_bwd
(
test_case
,
op_type
,
x
,
out
,
out_grad
,
x_grad
):
def
__assert_close
(
tensor
,
np_array
,
msg
,
atol
=
1e-4
):
test_case
.
assertTrue
(
np
.
allclose
(
np
.
array
(
tensor
),
np_array
,
atol
=
atol
),
msg
)
place
=
core
.
CPUPlace
()
var_dict
=
{
'x'
:
x
,
'out'
:
out
,
'out@GRAD'
:
out_grad
,
'x@GRAD'
:
x_grad
}
var_names
=
list
(
var_dict
.
keys
())
ground_truth
=
{
name
:
var_dict
[
name
]
for
name
in
var_names
}
program
=
fluid
.
Program
()
with
fluid
.
program_guard
(
program
):
block
=
program
.
global_block
()
for
name
in
ground_truth
:
block
.
create_var
(
name
=
name
,
dtype
=
np
.
float32
,
shape
=
ground_truth
[
name
].
shape
)
op
=
block
.
append_op
(
type
=
op_type
,
inputs
=
{
'X'
:
block
.
var
(
'x'
),
},
outputs
=
{
'Out'
:
block
.
var
(
'out'
)},
attrs
=
{
'use_mkldnn'
:
True
})
# Generate backward op_desc
grad_op_desc_list
,
op_grad_to_var
=
core
.
get_grad_op_desc
(
op
.
desc
,
set
(),
[])
grad_op_desc
=
grad_op_desc_list
[
0
]
new_op_desc
=
block
.
desc
.
append_op
()
new_op_desc
.
copy_from
(
grad_op_desc
)
for
var_name
in
grad_op_desc
.
output_arg_names
():
block
.
desc
.
var
(
var_name
.
encode
(
'ascii'
))
grad_op_desc
.
infer_var_type
(
block
.
desc
)
grad_op_desc
.
infer_shape
(
block
.
desc
)
for
arg
in
grad_op_desc
.
output_arg_names
():
grad_var
=
block
.
desc
.
find_var
(
arg
.
encode
(
'ascii'
))
grad_var
.
set_dtype
(
core
.
VarDesc
.
VarType
.
FP32
)
exe
=
fluid
.
Executor
(
place
)
# Do at least 2 iterations
for
i
in
range
(
2
):
out
=
exe
.
run
(
program
,
feed
=
{
name
:
var_dict
[
name
]
for
name
in
[
'x'
,
'out@GRAD'
]},
fetch_list
=
[
'x@GRAD'
,
'out'
])
__assert_close
(
x_grad
,
out
[
0
],
'x@GRAD'
)
python/paddle/fluid/tests/unittests/mkldnn/test_activation_mkldnn_op.py
浏览文件 @
851ea04d
...
...
@@ -19,7 +19,7 @@ import numpy as np
import
paddle.fluid.core
as
core
from
paddle.fluid.tests.unittests.op_test
import
OpTest
from
paddle.fluid.tests.unittests.test_activation_op
import
TestRelu
,
TestTanh
,
TestSqrt
,
TestAbs
import
paddle.fluid
as
flui
d
from
mkldnn_op_test
import
check_if_mkldnn_primitives_exist_in_bw
d
class
TestMKLDNNReluDim2
(
TestRelu
):
...
...
@@ -98,62 +98,24 @@ class TestMKLDNNAbsDim4(TestAbs):
# Check if primitives already exist in backward
class
TestMKLDNNReluPrimitivesAlreadyExist
(
unittest
.
TestCase
):
def
__assert_close
(
self
,
tensor
,
np_array
,
msg
,
atol
=
1e-4
):
self
.
assertTrue
(
np
.
allclose
(
np
.
array
(
tensor
),
np_array
,
atol
=
atol
),
msg
)
def
test_check_forward_backward
(
self
):
place
=
core
.
CPUPlace
()
class
TestMKLDNNAbsPrimitivesAlreadyExist
(
unittest
.
TestCase
):
def
setUp
(
self
):
super
(
TestMKLDNNAbsPrimitivesAlreadyExist
,
self
).
setUp
()
np
.
random
.
seed
(
123
)
x
=
np
.
random
.
uniform
(
-
1
,
1
,
[
2
,
2
]).
astype
(
np
.
float32
)
out
=
np
.
abs
(
x
)
out_grad
=
np
.
random
.
random_sample
(
x
.
shape
).
astype
(
np
.
float32
)
x_grad
=
out_grad
*
np
.
sign
(
x
)
# Abs grad calculation
var_dict
=
{
'x'
:
x
,
'out'
:
out
,
'out@GRAD'
:
out_grad
,
'x@GRAD'
:
x_grad
}
var_names
=
list
(
var_dict
.
keys
())
ground_truth
=
{
name
:
var_dict
[
name
]
for
name
in
var_names
}
program
=
fluid
.
Program
()
with
fluid
.
program_guard
(
program
):
block
=
program
.
global_block
()
for
name
in
ground_truth
:
block
.
create_var
(
name
=
name
,
dtype
=
'float32'
,
shape
=
ground_truth
[
name
].
shape
)
relu_op
=
block
.
append_op
(
type
=
"abs"
,
inputs
=
{
"X"
:
block
.
var
(
'x'
),
},
outputs
=
{
"Out"
:
block
.
var
(
'out'
)},
attrs
=
{
"use_mkldnn"
:
True
})
# Generate backward op_desc
grad_op_desc_list
,
op_grad_to_var
=
core
.
get_grad_op_desc
(
relu_op
.
desc
,
set
(),
[])
grad_op_desc
=
grad_op_desc_list
[
0
]
new_op_desc
=
block
.
desc
.
append_op
()
new_op_desc
.
copy_from
(
grad_op_desc
)
for
var_name
in
grad_op_desc
.
output_arg_names
():
block
.
desc
.
var
(
var_name
.
encode
(
"ascii"
))
grad_op_desc
.
infer_var_type
(
block
.
desc
)
grad_op_desc
.
infer_shape
(
block
.
desc
)
for
arg
in
grad_op_desc
.
output_arg_names
():
grad_var
=
block
.
desc
.
find_var
(
arg
.
encode
(
"ascii"
))
grad_var
.
set_dtype
(
core
.
VarDesc
.
VarType
.
FP32
)
exe
=
fluid
.
Executor
(
place
)
# Do at least 2 iterations
for
i
in
range
(
2
):
out
=
exe
.
run
(
program
,
feed
=
{
name
:
var_dict
[
name
]
for
name
in
[
'x'
,
'out@GRAD'
]},
fetch_list
=
[
'x@GRAD'
])
self
.
__assert_close
(
x_grad
,
out
[
0
],
"x@GRAD"
)
self
.
op_type
=
'abs'
self
.
x
=
np
.
random
.
uniform
(
-
1
,
1
,
[
2
,
2
]).
astype
(
np
.
float32
)
self
.
out
=
np
.
abs
(
self
.
x
)
self
.
out_grad
=
np
.
random
.
random_sample
(
self
.
x
.
shape
).
astype
(
np
.
float32
)
self
.
x_grad
=
self
.
__abs_bwd
(
self
.
x
,
self
.
out_grad
)
# Abs grad calculation
def
__abs_bwd
(
self
,
x
,
out_grad
):
return
out_grad
*
np
.
sign
(
x
)
def
test_check
(
self
):
check_if_mkldnn_primitives_exist_in_bwd
(
self
,
self
.
op_type
,
self
.
x
,
self
.
out
,
self
.
out_grad
,
self
.
x_grad
)
if
__name__
==
'__main__'
:
...
...
python/paddle/fluid/tests/unittests/mkldnn/test_softmax_mkldnn_op.py
0 → 100644
浏览文件 @
851ea04d
# Copyright (c) 2019 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.
from
__future__
import
print_function
import
unittest
import
numpy
as
np
from
paddle.fluid.tests.unittests.op_test
import
OpTest
import
paddle.fluid.core
as
core
from
paddle.fluid.tests.unittests.test_softmax_op
import
TestSoftmaxOp
,
stable_softmax
from
mkldnn_op_test
import
check_if_mkldnn_primitives_exist_in_bwd
class
TestSoftmaxMKLDNNOp
(
TestSoftmaxOp
):
def
init_kernel_type
(
self
):
self
.
use_mkldnn
=
True
class
TestSoftmaxMKLDNNOp2
(
TestSoftmaxMKLDNNOp
):
def
get_x_shape
(
self
):
return
[
2
,
3
,
4
,
5
]
# Check if primitives already exist in backward
class
TestSoftmaxMKLDNNPrimitivesAlreadyExist
(
unittest
.
TestCase
):
def
setUp
(
self
):
super
(
TestSoftmaxMKLDNNPrimitivesAlreadyExist
,
self
).
setUp
()
np
.
random
.
seed
(
123
)
self
.
op_type
=
'softmax'
self
.
x
=
np
.
random
.
uniform
(
-
1
,
1
,
2
).
astype
(
np
.
float32
)
self
.
out
=
stable_softmax
(
self
.
x
)
self
.
out_grad
=
np
.
random
.
random_sample
(
self
.
x
.
shape
).
astype
(
np
.
float32
)
self
.
x_grad
=
self
.
__softmax_bwd
(
self
.
out
,
self
.
out_grad
)
# Softmax grad calculation
def
__softmax_bwd
(
self
,
out
,
out_grad
):
return
out
*
(
out_grad
-
np
.
dot
(
out
,
out_grad
))
def
test_check
(
self
):
check_if_mkldnn_primitives_exist_in_bwd
(
self
,
self
.
op_type
,
self
.
x
,
self
.
out
,
self
.
out_grad
,
self
.
x_grad
)
if
__name__
==
'__main__'
:
unittest
.
main
()
python/paddle/fluid/tests/unittests/test_softmax_op.py
浏览文件 @
851ea04d
...
...
@@ -144,15 +144,5 @@ class TestSoftmaxFP16CUDNNOp2(TestSoftmaxFP16CUDNNOp):
return
[
2
,
3
,
4
,
5
]
class
TestSoftmaxMKLDNNOp
(
TestSoftmaxOp
):
def
init_kernel_type
(
self
):
self
.
use_mkldnn
=
True
class
TestSoftmaxMKLDNNOp2
(
TestSoftmaxMKLDNNOp
):
def
get_x_shape
(
self
):
return
[
2
,
3
,
4
,
5
]
if
__name__
==
"__main__"
:
unittest
.
main
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录