Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
csdn_franckjun
Paddle
提交
7d86737c
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,发现更多精彩内容 >>
未验证
提交
7d86737c
编写于
8月 23, 2021
作者:
P
pangyoki
提交者:
GitHub
8月 23, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add fill_constant_batch_size_like npu op (#34563)
上级
aefec228
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
86 addition
and
13 deletion
+86
-13
paddle/fluid/operators/fill_constant_batch_size_like_op_npu.cc
...e/fluid/operators/fill_constant_batch_size_like_op_npu.cc
+21
-13
python/paddle/fluid/tests/unittests/npu/test_fill_constant_batch_size_like_op_npu.py
...nittests/npu/test_fill_constant_batch_size_like_op_npu.py
+65
-0
未找到文件。
paddle/fluid/operators/fill_constant_batch_size_like_op_npu.cc
浏览文件 @
7d86737c
...
...
@@ -32,19 +32,26 @@ class FillConstantBatchSizeLikeOpNPUKernel : public framework::OpKernel<T> {
auto
force_cpu
=
ctx
.
Attr
<
bool
>
(
"force_cpu"
);
auto
*
out
=
ctx
.
Output
<
Tensor
>
(
"Out"
);
auto
*
in
put
=
ctx
.
Input
<
Tensor
>
(
"Input"
);
if
(
&
ctx
.
Attr
<
int
>
(
"input_dim_idx"
)
==
0
)
{
// set the correct batch size.
auto
*
in
=
ctx
.
Input
<
framework
::
LoD
Tensor
>
(
"Input"
);
if
(
in
->
lod
().
size
()
&&
ctx
.
Attr
<
int
>
(
"input_dim_idx"
)
==
0
)
{
// set the correct batch size
for the LoDTensor
.
auto
odims
=
out
->
dims
();
int
input_dim_idx
=
ctx
.
Attr
<
int
>
(
"input_dim_idx"
);
int
output_dim_idx
=
ctx
.
Attr
<
int
>
(
"output_dim_idx"
);
odims
[
output_dim_idx
]
=
input
->
dims
()[
input_dim_idx
]
;
odims
[
output_dim_idx
]
=
static_cast
<
int
>
(
in
->
lod
().
back
().
size
())
-
1
;
out
->
mutable_data
<
T
>
(
odims
,
ctx
.
GetPlace
());
}
T
value
;
if
(
str_value
.
empty
())
{
value
=
static_cast
<
T
>
(
float_value
);
}
else
{
// handle NaN/Inf first, which cannot be read from stream.
if
(
str_value
==
"inf"
)
{
value
=
static_cast
<
T
>
(
std
::
numeric_limits
<
double
>::
infinity
());
}
else
if
(
str_value
==
"-inf"
)
{
value
=
static_cast
<
T
>
(
-
std
::
numeric_limits
<
double
>::
infinity
());
}
else
if
(
str_value
==
"nan"
)
{
value
=
static_cast
<
T
>
(
std
::
numeric_limits
<
double
>::
quiet_NaN
());
}
else
{
std
::
stringstream
convert_stream
(
str_value
);
if
(
std
::
is_same
<
int64_t
,
T
>::
value
)
{
...
...
@@ -57,6 +64,7 @@ class FillConstantBatchSizeLikeOpNPUKernel : public framework::OpKernel<T> {
value
=
static_cast
<
T
>
(
tmp_value
);
}
}
}
platform
::
DeviceContextPool
&
pool
=
platform
::
DeviceContextPool
::
Instance
();
auto
&
dev_ctx
=
*
pool
.
Get
(
ctx
.
GetPlace
());
...
...
python/paddle/fluid/tests/unittests/npu/test_fill_constant_batch_size_like_op_npu.py
浏览文件 @
7d86737c
...
...
@@ -99,6 +99,22 @@ class TestFillConstantBatchSizeLike3(TestFillConstantBatchSizeLike):
self
.
output_value
=
4.5
class
TestFillConstantBatchSizeLike4
(
TestFillConstantBatchSizeLike
):
def
init_value
(
self
):
# str_value = 'inf'
self
.
value
=
3.8
self
.
str_value
=
'inf'
self
.
output_value
=
float
(
'inf'
)
class
TestFillConstantBatchSizeLike5
(
TestFillConstantBatchSizeLike
):
def
init_value
(
self
):
# str_value = '-inf'
self
.
value
=
3.8
self
.
str_value
=
'-inf'
self
.
output_value
=
-
float
(
'inf'
)
class
TestFillConstantBatchSizeLike6
(
TestFillConstantBatchSizeLike
):
def
init_dtype
(
self
):
self
.
dtype
=
core
.
VarDesc
.
VarType
.
FP16
...
...
@@ -130,5 +146,54 @@ class TestFillConstantBatchSizeLike9(TestFillConstantBatchSizeLike):
self
.
output_dim_idx
=
1
class
TestFillConstantBatchSizeLikeLodTensor
(
TestFillConstantBatchSizeLike
):
# test LodTensor
def
setUp
(
self
):
self
.
set_npu
()
self
.
place
=
paddle
.
NPUPlace
(
0
)
self
.
op_type
=
"fill_constant_batch_size_like"
self
.
init_shape
()
self
.
init_value
()
self
.
init_dtype
()
self
.
init_force_cpu
()
self
.
init_dim_idx
()
lod
=
[[
3
,
2
,
5
]]
self
.
inputs
=
{
'Input'
:
(
np
.
random
.
random
(
self
.
input_shape
).
astype
(
"float32"
),
lod
)
}
self
.
attrs
=
{
'shape'
:
self
.
shape
,
'value'
:
self
.
value
,
'str_value'
:
self
.
str_value
,
'dtype'
:
self
.
dtype
,
'force_cpu'
:
self
.
force_cpu
,
'input_dim_idx'
:
self
.
input_dim_idx
,
'output_dim_idx'
:
self
.
output_dim_idx
}
self
.
outputs
=
{
'Out'
:
np
.
full
(
self
.
output_shape
,
self
.
output_value
,
self
.
output_dtype
)
}
def
init_shape
(
self
):
self
.
input_shape
=
[
10
,
20
]
self
.
shape
=
[
123
,
92
]
self
.
output_shape
=
(
3
,
92
)
class
TestFillConstantBatchSizeLikeLodTensor2
(
TestFillConstantBatchSizeLikeLodTensor
):
# test LodTensor with 'input_dim_idx' != 0
def
init_shape
(
self
):
self
.
input_shape
=
[
10
,
20
]
self
.
shape
=
[
123
,
92
]
self
.
output_shape
=
(
20
,
92
)
def
init_dim_idx
(
self
):
self
.
input_dim_idx
=
1
self
.
output_dim_idx
=
0
if
__name__
==
'__main__'
:
unittest
.
main
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录