Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
9b3a41b1
P
Paddle
项目概览
PaddlePaddle
/
Paddle
大约 2 年 前同步成功
通知
2325
Star
20933
Fork
5424
代码
文件
提交
分支
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看板
未验证
提交
9b3a41b1
编写于
2月 07, 2023
作者:
C
cyber-pioneer
提交者:
GitHub
2月 07, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add batch_norm composite rule (#49894)
move composite test case remove unuseful var add composite op blacklist
上级
755049f2
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
766 addition
and
17 deletion
+766
-17
paddle/phi/api/yaml/op_compat.yaml
paddle/phi/api/yaml/op_compat.yaml
+6
-0
python/paddle/fluid/core.py
python/paddle/fluid/core.py
+24
-0
python/paddle/fluid/tests/unittests/CMakeLists.txt
python/paddle/fluid/tests/unittests/CMakeLists.txt
+0
-1
python/paddle/fluid/tests/unittests/prim/CMakeLists.txt
python/paddle/fluid/tests/unittests/prim/CMakeLists.txt
+1
-0
python/paddle/fluid/tests/unittests/prim/composite_ops/CMakeLists.txt
...e/fluid/tests/unittests/prim/composite_ops/CMakeLists.txt
+5
-0
python/paddle/fluid/tests/unittests/prim/composite_ops/test_composite_batch_norm.py
...unittests/prim/composite_ops/test_composite_batch_norm.py
+262
-0
python/paddle/fluid/tests/unittests/prim/composite_ops/test_composite_batch_norm_grad.py
...ests/prim/composite_ops/test_composite_batch_norm_grad.py
+273
-0
python/paddle/fluid/tests/unittests/prim/composite_ops/test_composite_softmax.py
...ts/unittests/prim/composite_ops/test_composite_softmax.py
+0
-0
python/paddle/fluid/tests/unittests/prim/composite_ops/test_composite_softmax_grad.py
...ittests/prim/composite_ops/test_composite_softmax_grad.py
+0
-0
python/paddle/fluid/tests/unittests/prim/composite_ops/utils.py
.../paddle/fluid/tests/unittests/prim/composite_ops/utils.py
+18
-4
python/paddle/fluid/tests/unittests/prim/model/test_resnet_prim_cinn.py
...fluid/tests/unittests/prim/model/test_resnet_prim_cinn.py
+2
-0
python/paddle/fluid/tests/unittests/prim/prim/flags/test_prim_flags.py
.../fluid/tests/unittests/prim/prim/flags/test_prim_flags.py
+72
-0
python/paddle/incubate/autograd/composite_rules.py
python/paddle/incubate/autograd/composite_rules.py
+62
-0
python/paddle/incubate/autograd/generate_op_map.py
python/paddle/incubate/autograd/generate_op_map.py
+2
-2
python/paddle/incubate/autograd/primapi.py
python/paddle/incubate/autograd/primapi.py
+2
-1
python/paddle/incubate/autograd/primitives.py
python/paddle/incubate/autograd/primitives.py
+18
-1
python/paddle/incubate/autograd/primx.py
python/paddle/incubate/autograd/primx.py
+19
-8
未找到文件。
paddle/phi/api/yaml/op_compat.yaml
浏览文件 @
9b3a41b1
...
...
@@ -139,6 +139,12 @@
-
op
:
batch_norm
backward
:
batch_norm_grad
inputs
:
x
:
X
mean
:
Mean
variance
:
Variance
scale
:
Scale
bias
:
Bias
extra
:
attrs
:
[
bool use_mkldnn = false
,
bool fuse_with_relu = false
]
...
...
python/paddle/fluid/core.py
浏览文件 @
9b3a41b1
...
...
@@ -448,6 +448,30 @@ def _test_use_sync(value):
__sync_stat_with_flag
(
value
)
# ops in forward_blacklisk will not be replaced by composite ops.
prim_config
=
{
"forward_blacklist"
:
[]}
def
_set_prim_forward_blacklist
(
ops
=
None
):
if
ops
is
None
:
prim_config
[
"forward_blacklist"
]
=
[]
elif
isinstance
(
ops
,
str
):
prim_config
[
"forward_blacklist"
].
append
(
ops
)
elif
isinstance
(
ops
,
(
list
,
tuple
)):
for
item
in
ops
:
if
not
isinstance
(
item
,
str
):
raise
TypeError
(
"ops set in forward_blacklist must belong to [str, str of tuple or list]"
)
else
:
prim_config
[
"forward_blacklist"
].
append
(
item
)
else
:
raise
TypeError
(
"ops set in forward_blacklist must belong to [str, str of tuple or list]"
)
return
def
_set_prim_backward_enabled
(
value
):
__set_bwd_prim_enabled
(
bool
(
value
))
print
(
"backward prim enabled: "
,
bool
(
_is_bwd_prim_enabled
()))
...
...
python/paddle/fluid/tests/unittests/CMakeLists.txt
浏览文件 @
9b3a41b1
...
...
@@ -838,7 +838,6 @@ add_subdirectory(sequence)
add_subdirectory
(
dygraph_to_static
)
add_subdirectory
(
rnn
)
add_subdirectory
(
autograd
)
add_subdirectory
(
composite_ops
)
add_subdirectory
(
distribution
)
add_subdirectory
(
prim
)
...
...
python/paddle/fluid/tests/unittests/prim/CMakeLists.txt
浏览文件 @
9b3a41b1
...
...
@@ -10,3 +10,4 @@ endforeach()
add_subdirectory
(
prim
)
add_subdirectory
(
model
)
add_subdirectory
(
composite_ops
)
python/paddle/fluid/tests/unittests/composite_ops/CMakeLists.txt
→
python/paddle/fluid/tests/unittests/
prim/
composite_ops/CMakeLists.txt
浏览文件 @
9b3a41b1
...
...
@@ -18,3 +18,8 @@ endif()
foreach
(
TEST_OP
${
TEST_OPS
}
)
py_test_modules
(
${
TEST_OP
}
MODULES
${
TEST_OP
}
ENVS
${
GC_ENVS
}
)
endforeach
()
set_tests_properties
(
test_composite_batch_norm PROPERTIES TIMEOUT 120
)
if
(
LINUX
)
set_tests_properties
(
test_composite_batch_norm_grad PROPERTIES TIMEOUT 120
)
endif
()
python/paddle/fluid/tests/unittests/prim/composite_ops/test_composite_batch_norm.py
0 → 100644
浏览文件 @
9b3a41b1
# 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
unittest
import
numpy
as
np
from
utils
import
SUB_TOLERANCE
import
paddle
import
paddle.nn.functional
as
F
from
paddle.fluid
import
core
np
.
random
.
seed
(
2023
)
def
generate_data
(
shape
,
dtype
=
"float32"
):
np_data
=
np
.
random
.
random
(
shape
).
astype
(
dtype
)
return
np_data
class
Attr
:
def
__init__
(
self
)
->
None
:
self
.
dtype
=
"float32"
self
.
shape
=
[
4
,
6
,
12
,
24
]
self
.
training
=
True
self
.
momentum
=
0.9
self
.
epsilon
=
1e-05
self
.
data_format
=
"NCHW"
self
.
use_global_stats
=
None
def
set_dtype
(
self
,
dtype
)
->
None
:
self
.
dtype
=
dtype
return
def
set_shape
(
self
,
shape
)
->
None
:
self
.
shape
=
shape
return
def
set_training
(
self
,
training
)
->
None
:
self
.
training
=
training
return
def
set_momentum
(
self
,
momentum
)
->
None
:
self
.
momentum
=
momentum
return
def
set_epsilon
(
self
,
epsilon
)
->
None
:
self
.
epsilon
=
epsilon
return
def
set_data_format
(
self
,
data_format
)
->
None
:
self
.
data_format
=
data_format
return
def
set_use_global_stats
(
self
,
use_global_stats
)
->
None
:
self
.
use_global_stats
=
use_global_stats
return
def
get_rtol
(
self
,
flag
):
rtol
=
SUB_TOLERANCE
[
self
.
dtype
][
flag
].
get
(
"rtol"
)
return
rtol
def
get_atol
(
self
,
flag
):
atol
=
SUB_TOLERANCE
[
self
.
dtype
][
flag
].
get
(
"atol"
)
return
atol
attrs
=
Attr
()
def
fn
(
x
,
running_mean
,
running_variance
,
weight
,
bias
,
training
,
momentum
,
epsilon
,
data_format
,
use_global_stats
,
):
z
=
F
.
batch_norm
(
x
,
running_mean
,
running_variance
,
weight
,
bias
,
training
=
training
,
momentum
=
momentum
,
epsilon
=
epsilon
,
data_format
=
data_format
,
use_global_stats
=
use_global_stats
,
)
return
z
def
expect_forward
(
inputs
,
running_mean
,
running_variance
,
weight
,
bias
,
training
,
momentum
,
epsilon
,
data_format
,
use_global_stats
,
):
return
fn
(
inputs
,
running_mean
,
running_variance
,
weight
,
bias
,
training
,
momentum
,
epsilon
,
data_format
,
use_global_stats
,
)
class
TestCompositeBatchNorm
(
unittest
.
TestCase
):
def
setUp
(
self
):
self
.
dtypes
=
[
"float32"
,
"float64"
]
self
.
training
=
[
False
,
True
]
self
.
shapes
=
[[
8
,
8
,
16
,
16
],
[
2
,
1
,
2
,
3
]]
self
.
momentum
=
[
0.1
,
0.9
]
self
.
data_formats
=
[
"NCHW"
,
"NHWC"
]
self
.
use_global_stats
=
[
None
,
True
,
False
]
def
cal_composite
(
self
,
inputs
,
running_mean
,
running_variance
,
weight
,
bias
):
paddle
.
enable_static
()
core
.
_set_prim_all_enabled
(
True
)
startup_program
=
paddle
.
static
.
Program
()
main_program
=
paddle
.
static
.
Program
()
with
paddle
.
static
.
program_guard
(
main_program
,
startup_program
):
x1
=
paddle
.
static
.
data
(
'x1'
,
shape
=
inputs
.
shape
,
dtype
=
str
(
inputs
.
dtype
)
)
x2
=
paddle
.
static
.
data
(
'x2'
,
shape
=
running_mean
.
shape
,
dtype
=
str
(
running_mean
.
dtype
)
)
x3
=
paddle
.
static
.
data
(
'x3'
,
shape
=
running_variance
.
shape
,
dtype
=
str
(
running_variance
.
dtype
),
)
x4
=
paddle
.
static
.
data
(
'x4'
,
shape
=
weight
.
shape
,
dtype
=
str
(
weight
.
dtype
)
)
x5
=
paddle
.
static
.
data
(
'x5'
,
shape
=
bias
.
shape
,
dtype
=
str
(
bias
.
dtype
)
)
y
=
fn
(
x1
,
x2
,
x3
,
x4
,
x5
,
attrs
.
training
,
attrs
.
momentum
,
attrs
.
epsilon
,
attrs
.
data_format
,
attrs
.
use_global_stats
,
)
blocks
=
main_program
.
blocks
paddle
.
incubate
.
autograd
.
to_prim
(
blocks
)
exe
=
paddle
.
static
.
Executor
()
exe
.
run
(
startup_program
)
res
=
exe
.
run
(
main_program
,
feed
=
{
'x1'
:
inputs
,
'x2'
:
running_mean
,
'x3'
:
running_variance
,
'x4'
:
weight
,
'x5'
:
bias
,
},
fetch_list
=
[
y
],
)
paddle
.
disable_static
()
core
.
_set_prim_all_enabled
(
False
)
return
res
def
compare_forward
(
self
):
np_data
=
generate_data
(
attrs
.
shape
,
attrs
.
dtype
)
tensor_data
=
paddle
.
to_tensor
(
np_data
)
if
attrs
.
data_format
==
'NCHW'
:
C
=
np_data
.
shape
[
1
]
elif
attrs
.
data_format
==
'NHWC'
:
C
=
np_data
.
shape
[
-
1
]
else
:
raise
TypeError
running_mean
=
paddle
.
zeros
(
C
,
dtype
=
attrs
.
dtype
)
running_variance
=
paddle
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
weight
=
paddle
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
*
2
bias
=
paddle
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
expect
=
expect_forward
(
tensor_data
,
running_mean
,
running_variance
,
weight
,
bias
,
attrs
.
training
,
attrs
.
momentum
,
attrs
.
epsilon
,
attrs
.
data_format
,
attrs
.
use_global_stats
,
).
numpy
()
np_running_mean
=
np
.
zeros
(
C
,
dtype
=
attrs
.
dtype
)
np_running_variance
=
np
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
np_weight
=
np
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
*
2
np_bias
=
np
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
actual
=
self
.
cal_composite
(
np_data
,
np_running_mean
,
np_running_variance
,
np_weight
,
np_bias
)[
0
]
assert
expect
.
dtype
==
actual
.
dtype
np
.
testing
.
assert_allclose
(
expect
,
actual
,
rtol
=
attrs
.
get_rtol
(
"forward"
),
atol
=
attrs
.
get_atol
(
"forward"
),
)
def
test_forward
(
self
):
for
i
in
self
.
training
:
for
j
in
self
.
dtypes
:
for
m
in
self
.
momentum
:
attrs
.
set_training
(
i
)
attrs
.
set_dtype
(
j
)
attrs
.
set_momentum
(
m
)
self
.
compare_forward
()
for
n
in
self
.
shapes
:
for
s
in
self
.
data_formats
:
for
t
in
self
.
use_global_stats
:
attrs
.
set_shape
(
n
)
attrs
.
set_data_format
(
s
)
attrs
.
set_use_global_stats
(
t
)
self
.
compare_forward
()
if
__name__
==
'__main__'
:
unittest
.
main
()
python/paddle/fluid/tests/unittests/prim/composite_ops/test_composite_batch_norm_grad.py
0 → 100644
浏览文件 @
9b3a41b1
# 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
unittest
import
numpy
as
np
from
utils
import
SUB_TOLERANCE
import
paddle
import
paddle.nn.functional
as
F
from
paddle.fluid
import
core
np
.
random
.
seed
(
2023
)
class
Arg
:
dout
=
None
def
generate_data
(
shape
,
dtype
=
"float32"
):
np_data
=
np
.
random
.
random
(
shape
).
astype
(
dtype
)
return
np_data
class
Attr
:
def
__init__
(
self
)
->
None
:
self
.
dtype
=
"float32"
self
.
shape
=
[
8
,
8
,
16
,
16
]
self
.
training
=
True
self
.
momentum
=
0.9
self
.
epsilon
=
1e-05
self
.
data_format
=
"NCHW"
self
.
use_global_stats
=
None
def
set_dtype
(
self
,
dtype
)
->
None
:
self
.
dtype
=
dtype
return
def
set_shape
(
self
,
shape
)
->
None
:
self
.
shape
=
shape
return
def
set_training
(
self
,
training
)
->
None
:
self
.
training
=
training
return
def
set_momentum
(
self
,
momentum
)
->
None
:
self
.
momentum
=
momentum
return
def
set_epsilon
(
self
,
epsilon
)
->
None
:
self
.
epsilon
=
epsilon
return
def
set_data_format
(
self
,
data_format
)
->
None
:
self
.
data_format
=
data_format
return
def
set_use_global_stats
(
self
,
use_global_stats
)
->
None
:
self
.
use_global_stats
=
use_global_stats
return
def
get_rtol
(
self
,
flag
):
rtol
=
SUB_TOLERANCE
[
self
.
dtype
][
flag
].
get
(
"rtol"
)
return
rtol
def
get_atol
(
self
,
flag
):
atol
=
SUB_TOLERANCE
[
self
.
dtype
][
flag
].
get
(
"atol"
)
return
atol
attrs
=
Attr
()
def
fn
(
x
,
running_mean
,
running_variance
,
weight
,
bias
,
training
,
momentum
,
epsilon
,
data_format
,
use_global_stats
,
):
z
=
F
.
batch_norm
(
x
,
running_mean
,
running_variance
,
weight
,
bias
,
training
=
training
,
momentum
=
momentum
,
epsilon
=
epsilon
,
data_format
=
data_format
,
use_global_stats
=
use_global_stats
,
)
out
=
z
*
paddle
.
to_tensor
(
Arg
.
dout
)
res
=
paddle
.
mean
(
out
)
return
res
def
expect_grad
(
x
,
running_mean
,
running_variance
,
weight
,
bias
,
training
,
momentum
,
epsilon
,
data_format
,
use_global_stats
,
):
x
.
stop_gradient
=
False
res
=
fn
(
x
,
running_mean
,
running_variance
,
weight
,
bias
,
training
,
momentum
,
epsilon
,
data_format
,
use_global_stats
,
)
gradients
=
paddle
.
grad
(
res
,
x
)
return
gradients
class
TestCompositeBatchNorm
(
unittest
.
TestCase
):
def
setUp
(
self
):
self
.
dtypes
=
[
"float32"
]
self
.
training
=
[
False
,
True
]
self
.
shapes
=
[[
8
,
8
,
16
,
16
],
[
2
,
1
,
2
,
3
]]
self
.
momentum
=
[
0.1
,
0.9
]
self
.
epsilon
=
[
1e-05
,
2e-05
]
self
.
data_formats
=
[
"NCHW"
]
self
.
use_global_stats
=
[
None
,
True
,
False
]
def
cal_composite
(
self
,
inputs
,
running_mean
,
running_variance
,
weight
,
bias
):
paddle
.
enable_static
()
core
.
_set_prim_all_enabled
(
True
)
startup_program
=
paddle
.
static
.
Program
()
main_program
=
paddle
.
static
.
Program
()
with
paddle
.
static
.
program_guard
(
main_program
,
startup_program
):
x1
=
paddle
.
static
.
data
(
'x1'
,
shape
=
inputs
.
shape
,
dtype
=
str
(
inputs
.
dtype
)
)
x1
.
stop_gradient
=
False
x2
=
paddle
.
static
.
data
(
'x2'
,
shape
=
running_mean
.
shape
,
dtype
=
str
(
running_mean
.
dtype
)
)
x3
=
paddle
.
static
.
data
(
'x3'
,
shape
=
running_variance
.
shape
,
dtype
=
str
(
running_variance
.
dtype
),
)
x4
=
paddle
.
static
.
data
(
'x4'
,
shape
=
weight
.
shape
,
dtype
=
str
(
weight
.
dtype
)
)
x5
=
paddle
.
static
.
data
(
'x5'
,
shape
=
bias
.
shape
,
dtype
=
str
(
bias
.
dtype
)
)
y
=
fn
(
x1
,
x2
,
x3
,
x4
,
x5
,
attrs
.
training
,
attrs
.
momentum
,
attrs
.
epsilon
,
attrs
.
data_format
,
attrs
.
use_global_stats
,
)
blocks
=
main_program
.
blocks
paddle
.
incubate
.
autograd
.
to_prim
(
blocks
)
z
=
paddle
.
static
.
gradients
([
y
],
[
x1
])
exe
=
paddle
.
static
.
Executor
()
exe
.
run
(
startup_program
)
res
=
exe
.
run
(
main_program
,
feed
=
{
'x1'
:
inputs
,
'x2'
:
running_mean
,
'x3'
:
running_variance
,
'x4'
:
weight
,
'x5'
:
bias
,
},
fetch_list
=
[
z
],
)
paddle
.
disable_static
()
core
.
_set_prim_all_enabled
(
False
)
return
res
def
compare_backward
(
self
):
if
attrs
.
training
is
True
and
attrs
.
use_global_stats
is
False
:
# in this case, origin bn grad kernel is not the same as forward kernel.
return
np_data
=
generate_data
(
attrs
.
shape
,
attrs
.
dtype
)
tensor_data
=
paddle
.
to_tensor
(
np_data
)
Arg
.
dout
=
np
.
random
.
random
(
np_data
.
shape
).
astype
(
attrs
.
dtype
)
C
=
np_data
.
shape
[
1
]
running_mean
=
paddle
.
zeros
(
C
,
dtype
=
attrs
.
dtype
)
running_variance
=
paddle
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
weight
=
paddle
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
*
2
bias
=
paddle
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
expect
=
expect_grad
(
tensor_data
,
running_mean
,
running_variance
,
weight
,
bias
,
attrs
.
training
,
attrs
.
momentum
,
attrs
.
epsilon
,
attrs
.
data_format
,
attrs
.
use_global_stats
,
)[
0
].
numpy
()
np_running_mean
=
np
.
zeros
(
C
,
dtype
=
attrs
.
dtype
)
np_running_variance
=
np
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
np_weight
=
np
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
*
2
np_bias
=
np
.
ones
(
C
,
dtype
=
attrs
.
dtype
)
actual
=
self
.
cal_composite
(
np_data
,
np_running_mean
,
np_running_variance
,
np_weight
,
np_bias
)[
0
]
assert
expect
.
dtype
==
actual
.
dtype
np
.
testing
.
assert_allclose
(
expect
,
actual
,
rtol
=
attrs
.
get_rtol
(
"backward"
),
atol
=
attrs
.
get_atol
(
"backward"
),
)
def
test_backward
(
self
):
for
i
in
self
.
training
:
for
j
in
self
.
dtypes
:
for
m
in
self
.
momentum
:
attrs
.
set_training
(
i
)
attrs
.
set_dtype
(
j
)
attrs
.
set_momentum
(
m
)
self
.
compare_backward
()
for
n
in
self
.
shapes
:
for
t
in
self
.
use_global_stats
:
attrs
.
set_shape
(
n
)
attrs
.
set_use_global_stats
(
t
)
self
.
compare_backward
()
if
__name__
==
'__main__'
:
unittest
.
main
()
python/paddle/fluid/tests/unittests/composite_ops/test_composite_softmax.py
→
python/paddle/fluid/tests/unittests/
prim/
composite_ops/test_composite_softmax.py
浏览文件 @
9b3a41b1
文件已移动
python/paddle/fluid/tests/unittests/composite_ops/test_composite_softmax_grad.py
→
python/paddle/fluid/tests/unittests/
prim/
composite_ops/test_composite_softmax_grad.py
浏览文件 @
9b3a41b1
文件已移动
python/paddle/fluid/tests/unittests/composite_ops/utils.py
→
python/paddle/fluid/tests/unittests/
prim/
composite_ops/utils.py
浏览文件 @
9b3a41b1
...
...
@@ -12,16 +12,30 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# default tolerance
TOLERANCE
=
{
"float32"
:
{
"forward"
:
{
"rtol"
:
1e-
7
,
"atol"
:
1e-7
},
"backward"
:
{
"rtol"
:
1e-
7
,
"atol"
:
1e-7
},
"forward"
:
{
"rtol"
:
1e-
6
,
"atol"
:
1e-6
},
"backward"
:
{
"rtol"
:
1e-
6
,
"atol"
:
1e-6
},
"prim_backward"
:
{
"rtol"
:
1e-6
,
"atol"
:
1e-6
},
},
"float64"
:
{
"forward"
:
{
"rtol"
:
1e-1
6
,
"atol"
:
1e-16
},
"forward"
:
{
"rtol"
:
1e-1
5
,
"atol"
:
1e-15
},
"backward"
:
{
"rtol"
:
1e-15
,
"atol"
:
1e-15
},
"prim_backward"
:
{
"rtol"
:
1e-15
,
"atol"
:
1e-15
},
},
}
# this tolerance is for big composite ops like batch_norm.
SUB_TOLERANCE
=
{
"float32"
:
{
"forward"
:
{
"rtol"
:
1e-5
,
"atol"
:
1e-5
},
"backward"
:
{
"rtol"
:
1e-5
,
"atol"
:
1e-5
},
"prim_backward"
:
{
"rtol"
:
1e-5
,
"atol"
:
1e-5
},
},
"float64"
:
{
"forward"
:
{
"rtol"
:
1e-13
,
"atol"
:
1e-13
},
"backward"
:
{
"rtol"
:
1e-13
,
"atol"
:
1e-13
},
"prim_backward"
:
{
"rtol"
:
1e-13
,
"atol"
:
1e-13
},
},
}
python/paddle/fluid/tests/unittests/prim/model/test_resnet_prim_cinn.py
浏览文件 @
9b3a41b1
...
...
@@ -140,6 +140,8 @@ class TestResnet(unittest.TestCase):
cls
.
dy2st
=
train
(
to_static
=
True
,
enable_prim
=
False
,
enable_cinn
=
False
)
def
test_prim
(
self
):
# todo: to be removed after adjust of rtol
core
.
_set_prim_forward_blacklist
(
"batch_norm"
)
dy2st_prim
=
train
(
to_static
=
True
,
enable_prim
=
True
,
enable_cinn
=
False
)
# NOTE: Now dy2st is equal to dy2st_prim. With the splitting of kernels, the threshold here may need to be adjusted
np
.
testing
.
assert_allclose
(
self
.
dy2st
,
dy2st_prim
,
rtol
=
1e-6
)
...
...
python/paddle/fluid/tests/unittests/prim/prim/flags/test_prim_flags.py
浏览文件 @
9b3a41b1
...
...
@@ -15,6 +15,10 @@
import
os
import
unittest
import
numpy
as
np
import
paddle
import
paddle.nn.functional
as
F
from
paddle.fluid
import
core
...
...
@@ -58,5 +62,73 @@ class TestPrimFlags(unittest.TestCase):
core
.
_test_use_sync
(
"aaaa"
)
class
TestPrimBlacklistFlags
(
unittest
.
TestCase
):
def
not_in_blacklist
(
self
):
inputs
=
np
.
random
.
random
([
2
,
3
,
4
]).
astype
(
"float32"
)
paddle
.
enable_static
()
core
.
_set_prim_forward_enabled
(
True
)
startup_program
=
paddle
.
static
.
Program
()
main_program
=
paddle
.
static
.
Program
()
with
paddle
.
static
.
program_guard
(
main_program
,
startup_program
):
x
=
paddle
.
static
.
data
(
'x'
,
shape
=
inputs
.
shape
,
dtype
=
str
(
inputs
.
dtype
)
)
y
=
F
.
softmax
(
x
)
blocks
=
main_program
.
blocks
fwd_ops
=
[
op
.
type
for
op
in
blocks
[
0
].
ops
]
# Ensure that softmax in original block
self
.
assertTrue
(
'softmax'
in
fwd_ops
)
paddle
.
incubate
.
autograd
.
to_prim
(
blocks
)
fwd_ops_new
=
[
op
.
type
for
op
in
blocks
[
0
].
ops
]
# Ensure that softmax is splitted into small ops
self
.
assertTrue
(
'softmax'
not
in
fwd_ops_new
)
exe
=
paddle
.
static
.
Executor
()
exe
.
run
(
startup_program
)
_
=
exe
.
run
(
main_program
,
feed
=
{
'x'
:
inputs
},
fetch_list
=
[
y
])
paddle
.
disable_static
()
core
.
_set_prim_forward_enabled
(
False
)
return
def
in_blacklist
(
self
):
inputs
=
np
.
random
.
random
([
2
,
3
,
4
]).
astype
(
"float32"
)
paddle
.
enable_static
()
core
.
_set_prim_forward_enabled
(
True
)
startup_program
=
paddle
.
static
.
Program
()
main_program
=
paddle
.
static
.
Program
()
with
paddle
.
static
.
program_guard
(
main_program
,
startup_program
):
x
=
paddle
.
static
.
data
(
'x'
,
shape
=
inputs
.
shape
,
dtype
=
str
(
inputs
.
dtype
)
)
y
=
F
.
softmax
(
x
)
blocks
=
main_program
.
blocks
fwd_ops
=
[
op
.
type
for
op
in
blocks
[
0
].
ops
]
# Ensure that softmax in original block
self
.
assertTrue
(
'softmax'
in
fwd_ops
)
paddle
.
incubate
.
autograd
.
to_prim
(
blocks
)
fwd_ops_new
=
[
op
.
type
for
op
in
blocks
[
0
].
ops
]
# Ensure that softmax is splitted into small ops
self
.
assertTrue
(
'softmax'
in
fwd_ops_new
)
exe
=
paddle
.
static
.
Executor
()
exe
.
run
(
startup_program
)
_
=
exe
.
run
(
main_program
,
feed
=
{
'x'
:
inputs
},
fetch_list
=
[
y
])
paddle
.
disable_static
()
core
.
_set_prim_forward_enabled
(
False
)
return
def
test_prim_forward_blackward
(
self
):
# self.not_in_blacklist()
core
.
_set_prim_forward_blacklist
(
"softmax"
)
self
.
in_blacklist
()
if
__name__
==
'__main__'
:
unittest
.
main
()
python/paddle/incubate/autograd/composite_rules.py
浏览文件 @
9b3a41b1
...
...
@@ -17,6 +17,7 @@
# 2. The name and args of target op must be corresponding with standard description of op in
# ops.yaml or legacy_ops.yaml.
from
.primitives
import
*
# noqa: F403
from
.primreg
import
REGISTER_COMPOSITE
,
lookup_composite
...
...
@@ -35,3 +36,64 @@ def softmax_composite(x, axis):
denominator
=
sum
(
molecular
,
axis
=
axis
,
keepdim
=
True
)
res
=
divide
(
molecular
,
denominator
)
return
res
@
REGISTER_COMPOSITE
(
'batch_norm'
)
def
composite_batchnorm
(
x
,
run_mean
,
run_var
,
scale
,
bias
,
is_test
,
momentum
,
epsilon
,
data_layout
,
use_global_stats
,
trainable_statistics
,
):
"""define composite rule of op batch_norm"""
feature_axis
=
(
1
if
data_layout
in
(
'NC'
,
'NCL'
,
'NCHW'
,
'NCHWD'
)
else
len
(
x
.
shape
)
-
1
)
if
use_global_stats
is
None
:
use_global_stats
=
is_test
trainable_statistics
=
False
else
:
trainable_statistics
=
not
use_global_stats
use_run_stat
=
(
is_test
and
(
not
trainable_statistics
))
or
use_global_stats
reduce_axes
=
tuple
(
i
for
i
in
range
(
len
(
x
.
shape
))
if
i
!=
feature_axis
)
stats_shape
=
tuple
(
1
if
i
in
reduce_axes
else
s
for
i
,
s
in
enumerate
(
x
.
shape
)
)
batch_mean
=
zeros
(
run_mean
.
shape
,
run_mean
.
dtype
)
batch_var
=
zeros
(
run_var
.
shape
,
run_var
.
dtype
)
if
not
use_run_stat
:
batch_mean
=
mean
(
x
,
reduce_axes
,
keepdim
=
True
)
temp
=
mean
(
x
*
x
,
reduce_axes
,
keepdim
=
True
)
batch_var
=
temp
-
batch_mean
*
batch_mean
x_hat
=
(
x
-
reshape
(
batch_mean
,
stats_shape
))
/
sqrt
(
reshape
(
batch_var
,
stats_shape
)
+
epsilon
)
run_mean
=
momentum
*
run_mean
+
(
1
-
momentum
)
*
batch_mean
run_var
=
momentum
*
run_var
+
(
1
-
momentum
)
*
batch_var
else
:
x_hat
=
(
x
-
reshape
(
run_mean
,
stats_shape
))
/
sqrt
(
reshape
(
run_var
,
stats_shape
)
+
epsilon
)
y
=
reshape
(
scale
,
stats_shape
)
*
x_hat
+
reshape
(
bias
,
stats_shape
)
# add op assign to detach tensor in void unsafe change outside the rule.
batch_mean_
=
assign
(
batch_mean
)
batch_var_
=
assign
(
batch_var
)
run_mean_
=
assign
(
run_mean
)
run_var_
=
assign
(
run_var
)
if
trainable_statistics
or
not
is_test
:
return
run_mean_
,
None
,
batch_mean_
,
batch_var_
,
run_var_
,
y
else
:
return
run_mean_
,
batch_mean_
,
batch_var_
,
run_var_
,
y
python/paddle/incubate/autograd/generate_op_map.py
浏览文件 @
9b3a41b1
...
...
@@ -58,11 +58,12 @@ def generate_code(
Generate dictiorary and save to file phi_ops_map.py. The target file records gap
of description between current op and standard ones.
"""
dct
=
{}
map_dct
=
{}
for
op_path
in
[
ops_yaml_path
,
ops_legacy_yaml_path
]:
pattern
=
re
.
compile
(
r
'[(](.*)[)]'
,
re
.
S
)
with
open
(
op_path
,
"rt"
)
as
f
:
ops
=
yaml
.
safe_load
(
f
)
dct
=
{}
for
item
in
ops
:
key
=
item
[
'op'
]
if
key
in
dct
:
...
...
@@ -74,7 +75,6 @@ def generate_code(
with
open
(
ops_compat_yaml_path
,
"rt"
)
as
f
:
ops_compat
=
yaml
.
safe_load
(
f
)
map_dct
=
{}
for
item
in
ops_compat
:
key
=
item
[
'op'
]
if
key
.
endswith
(
")"
):
...
...
python/paddle/incubate/autograd/primapi.py
浏览文件 @
9b3a41b1
...
...
@@ -17,6 +17,7 @@ import typing
import
paddle
from
paddle.fluid
import
backward
,
core
,
framework
from
paddle.fluid.core
import
prim_config
from
paddle.incubate.autograd
import
primx
,
utils
...
...
@@ -236,5 +237,5 @@ def to_prim(blocks):
)
with
framework
.
program_guard
(
main_program
):
print
(
"Running lowering for forward..."
)
primx
.
_lower_composite
(
blocks
)
primx
.
_lower_composite
(
blocks
,
prim_config
[
"forward_blacklist"
]
)
return
python/paddle/incubate/autograd/primitives.py
浏览文件 @
9b3a41b1
...
...
@@ -11,8 +11,9 @@
# 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
paddle.fluid.layers.tensor
import
assign
# noqa: F401
from
paddle.fluid.layers.tensor
import
cast
# noqa: F401
from
paddle.fluid.layers.tensor
import
fill_constant
# noqa: F401
from
paddle.tensor
import
abs
# noqa: F401
from
paddle.tensor
import
acos
# noqa: F401
from
paddle.tensor
import
acosh
# noqa: F401
...
...
@@ -40,17 +41,22 @@ from paddle.tensor import logcumsumexp # noqa: F401
from
paddle.tensor
import
logit
# noqa: F401
from
paddle.tensor
import
logsumexp
# noqa: F401
from
paddle.tensor
import
max
# noqa: F401
from
paddle.tensor
import
mean
# noqa: F401
from
paddle.tensor
import
min
# noqa: F401
from
paddle.tensor
import
multiply
# noqa: F401
from
paddle.tensor
import
ones
# noqa: F401
from
paddle.tensor
import
pow
# noqa: F401
from
paddle.tensor
import
prod
# noqa: F401
from
paddle.tensor
import
reshape
# noqa: F401
from
paddle.tensor
import
sign
# noqa: F401
from
paddle.tensor
import
sin
# noqa: F401
from
paddle.tensor
import
sinh
# noqa: F401
from
paddle.tensor
import
sqrt
# noqa: F401
from
paddle.tensor
import
subtract
# noqa: F401
from
paddle.tensor
import
sum
# noqa: F401
from
paddle.tensor
import
tan
# noqa: F401
from
paddle.tensor
import
tanh
# noqa: F401
from
paddle.tensor
import
zeros
# noqa: F401
math_op
=
[
'add'
,
...
...
@@ -94,14 +100,25 @@ trigonometric_op = [
'atanh'
,
]
sub_prim
=
[
'mean'
,
'ones'
,
'zeros'
,
'sqrt'
,
]
others
=
[
'cast'
,
'broadcast_to'
,
'assign'
,
'fill_constant'
,
'reshape'
,
]
__all__
=
[]
__all__
.
extend
(
math_op
)
__all__
.
extend
(
trigonometric_op
)
__all__
.
extend
(
sub_prim
)
__all__
.
extend
(
others
)
__all__
.
sort
()
python/paddle/incubate/autograd/primx.py
浏览文件 @
9b3a41b1
...
...
@@ -593,6 +593,9 @@ def _lower_composite(block, blacklist=[]):
ops_to_remove
=
[]
vars_to_remove
=
set
()
# if output var of composite rule is None, this means this var is not needed
none_vars_to_remove
=
set
()
# Step2: Process all ops in the target block
for
op_idx
in
range
(
len
(
block
.
ops
)):
op
=
block
.
ops
[
op_idx
]
...
...
@@ -605,13 +608,16 @@ def _lower_composite(block, blacklist=[]):
expand_nested_list
(
get_output_var_list
(
op
)),
expand_nested_list
(
as_tensors
(
lower_fn
(
op
,
*
input_args
))),
):
assert
not
(
orig_out
is
None
)
^
(
new_out
is
None
),
"orig_out and new_out should match."
vars_to_remove
.
add
(
new_out
.
name
)
value_table
[
new_out
.
name
]
=
new_out
to_bind
[
orig_out
.
name
]
=
new_out
.
name
to_bind_rev
[
new_out
.
name
]
=
orig_out
.
name
if
new_out
is
not
None
:
assert
not
(
orig_out
is
None
)
^
(
new_out
is
None
),
"orig_out and new_out should match."
vars_to_remove
.
add
(
new_out
.
name
)
value_table
[
new_out
.
name
]
=
new_out
to_bind
[
orig_out
.
name
]
=
new_out
.
name
to_bind_rev
[
new_out
.
name
]
=
orig_out
.
name
else
:
none_vars_to_remove
.
add
(
orig_out
.
name
)
else
:
inputs
=
{}
for
i
in
range
(
len
(
op
.
input_names
)):
...
...
@@ -664,11 +670,16 @@ def _lower_composite(block, blacklist=[]):
block
.
desc
.
_remove_var
(
var_name
.
encode
())
del
block
.
vars
[
var_name
]
block
.
_sync_with_cpp
()
for
var_name
in
sorted
(
none_vars_to_remove
):
block
.
desc
.
_remove_var
(
var_name
.
encode
())
del
block
.
vars
[
var_name
]
block
.
_sync_with_cpp
()
return
elif
isinstance
(
block
,
typing
.
Sequence
):
for
item
in
block
:
_lower_composite
(
item
)
_lower_composite
(
item
,
blacklist
)
return
else
:
raise
TypeError
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录