Skip to content

Commit 3c536f2

Browse files
authored
[phi] move isnan_v2、isfinite_v2、isinf_v2 to phi (#40076)
* support isfinite for phi * mark v2 * fixed bugs * fixed include bugs * deal with comments * decoupling selected_rows * rm bfloat16 * fixed infermeta * fixed code style * rm useless code * replace pt by pd
1 parent f876320 commit 3c536f2

File tree

14 files changed

+419
-121
lines changed

14 files changed

+419
-121
lines changed

paddle/fluid/operators/isfinite_v2_op.cc

Lines changed: 18 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#include "paddle/fluid/operators/isfinite_v2_op.h"
16-
1715
#include <string>
1816

17+
#include "paddle/fluid/framework/infershape_utils.h"
18+
#include "paddle/fluid/framework/op_registry.h"
1919
#include "paddle/fluid/operators/common_infer_shape_functions.h"
20+
#include "paddle/phi/core/infermeta_utils.h"
21+
#include "paddle/phi/infermeta/unary.h"
2022

2123
namespace paddle {
2224
namespace framework {
@@ -49,11 +51,6 @@ class OverflowV2Op : public framework::OperatorWithKernel {
4951
const framework::VariableNameMap &outputs,
5052
const framework::AttributeMap &attrs)
5153
: OperatorWithKernel(type, inputs, outputs, attrs) {}
52-
void InferShape(framework::InferShapeContext *ctx) const override {
53-
OP_INOUT_CHECK(ctx->HasInput("X"), "Input", "X", "isfinitev2");
54-
OP_INOUT_CHECK(ctx->HasOutput("Out"), "Output", "Out", "isfinitev2");
55-
UnaryOpUnchangedInferShape(ctx);
56-
}
5754

5855
protected:
5956
framework::OpKernelType GetExpectedKernelType(
@@ -104,6 +101,14 @@ element of X as a tensor.
104101
} // namespace paddle
105102

106103
namespace ops = paddle::operators;
104+
DECLARE_INFER_SHAPE_FUNCTOR(isinf_v2, IsinfInferShapeFunctor,
105+
PD_INFER_META(phi::IsfiniteInferMeta));
106+
107+
DECLARE_INFER_SHAPE_FUNCTOR(isnan_v2, IsnanInferShapeFunctor,
108+
PD_INFER_META(phi::IsfiniteInferMeta));
109+
110+
DECLARE_INFER_SHAPE_FUNCTOR(isfinite_v2, IsfiniteInferShapeFunctor,
111+
PD_INFER_META(phi::IsfiniteInferMeta));
107112

108113
#define REGISTER_V2OP_MAKER(op_type, comment) \
109114
namespace paddle { \
@@ -124,50 +129,17 @@ REGISTER_V2OP_MAKER(isfinite_v2, "isfinitev2(X)");
124129
REGISTER_OPERATOR(
125130
isinf_v2, ops::OverflowV2Op, ops::_isinf_v2OverflowV2OpMaker,
126131
paddle::framework::EmptyGradOpMaker<paddle::framework::OpDesc>,
127-
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>);
132+
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>,
133+
IsinfInferShapeFunctor);
128134

129135
REGISTER_OPERATOR(
130136
isnan_v2, ops::OverflowV2Op, ops::_isnan_v2OverflowV2OpMaker,
131137
paddle::framework::EmptyGradOpMaker<paddle::framework::OpDesc>,
132-
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>);
138+
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>,
139+
IsnanInferShapeFunctor);
133140

134141
REGISTER_OPERATOR(
135142
isfinite_v2, ops::OverflowV2Op, ops::_isfinite_v2OverflowV2OpMaker,
136143
paddle::framework::EmptyGradOpMaker<paddle::framework::OpDesc>,
137-
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>);
138-
139-
REGISTER_OP_CPU_KERNEL(isnan_v2,
140-
ops::OverflowKernel<paddle::platform::CPUDeviceContext,
141-
int, ops::NANV2Functor>,
142-
ops::OverflowKernel<paddle::platform::CPUDeviceContext,
143-
int64_t, ops::NANV2Functor>,
144-
ops::OverflowKernel<paddle::platform::CPUDeviceContext,
145-
float, ops::NANV2Functor>,
146-
ops::OverflowKernel<paddle::platform::CPUDeviceContext,
147-
double, ops::NANV2Functor>,
148-
ops::OverflowKernel<paddle::platform::CPUDeviceContext,
149-
plat::float16, ops::NANV2Functor>);
150-
151-
REGISTER_OP_CPU_KERNEL(
152-
isinf_v2, ops::OverflowKernel<paddle::platform::CPUDeviceContext, int,
153-
ops::InfinityV2Functor>,
154-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, int64_t,
155-
ops::InfinityV2Functor>,
156-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, float,
157-
ops::InfinityV2Functor>,
158-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, double,
159-
ops::InfinityV2Functor>,
160-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, plat::float16,
161-
ops::InfinityV2Functor>);
162-
163-
REGISTER_OP_CPU_KERNEL(
164-
isfinite_v2, ops::OverflowKernel<paddle::platform::CPUDeviceContext, int,
165-
ops::IsfiniteV2Functor>,
166-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, int64_t,
167-
ops::IsfiniteV2Functor>,
168-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, float,
169-
ops::IsfiniteV2Functor>,
170-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, double,
171-
ops::IsfiniteV2Functor>,
172-
ops::OverflowKernel<paddle::platform::CPUDeviceContext, plat::float16,
173-
ops::IsfiniteV2Functor>);
144+
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>,
145+
IsfiniteInferShapeFunctor);

paddle/fluid/operators/isfinite_v2_op.cu

Lines changed: 0 additions & 55 deletions
This file was deleted.

paddle/phi/core/compat/op_utils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ const std::unordered_set<std::string> standard_kernel_suffixs({
4040
const std::unordered_set<std::string> deprecated_op_names({"diag",
4141
"flatten",
4242
"flatten_grad",
43+
"isinf",
44+
"isnan",
45+
"isfinite",
4346
"matmul",
4447
"matmul_grad",
4548
"matmul_grad_grad",

paddle/phi/infermeta/unary.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,11 @@ void SizeInferMeta(const MetaTensor& input, MetaTensor* out) {
10071007
out->set_dims({1});
10081008
}
10091009

1010+
void IsfiniteInferMeta(const MetaTensor& x, MetaTensor* out) {
1011+
out->set_dims(x.dims());
1012+
out->set_dtype(DataType::BOOL);
1013+
}
1014+
10101015
void PixelShuffleInferMeta(const MetaTensor& x,
10111016
int upscale_factor,
10121017
const std::string& data_format,

paddle/phi/infermeta/unary.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ void PixelShuffleInferMeta(const MetaTensor& x,
157157
const std::string& data_format,
158158
MetaTensor* out);
159159

160+
void IsfiniteInferMeta(const MetaTensor& input, MetaTensor* out);
161+
160162
void TransposeInferMeta(const MetaTensor& x,
161163
const std::vector<int>& axis,
162164
MetaTensor* out);
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include "paddle/phi/kernels/isfinite_kernel.h"
16+
17+
#include "paddle/phi/backends/cpu/cpu_context.h"
18+
#include "paddle/phi/core/kernel_registry.h"
19+
#include "paddle/phi/kernels/impl/isfinite_kernel_impl.h"
20+
21+
namespace phi {
22+
23+
template <typename T, typename Context, typename Functor>
24+
inline void IsfiniteKernelImpl(const Context& dev_ctx,
25+
const DenseTensor& x,
26+
DenseTensor* out) {
27+
dev_ctx.template Alloc<T>(out);
28+
Functor functor;
29+
functor(x, out);
30+
}
31+
32+
} // namespace phi
33+
34+
PD_REGISTER_KERNEL(isinf,
35+
CPU,
36+
ALL_LAYOUT,
37+
phi::IsinfKernel,
38+
float,
39+
double,
40+
phi::dtype::float16,
41+
int,
42+
int64_t) {}
43+
44+
PD_REGISTER_KERNEL(isnan,
45+
CPU,
46+
ALL_LAYOUT,
47+
phi::IsnanKernel,
48+
float,
49+
double,
50+
phi::dtype::float16,
51+
int,
52+
int64_t) {}
53+
54+
PD_REGISTER_KERNEL(isfinite,
55+
CPU,
56+
ALL_LAYOUT,
57+
phi::IsfiniteKernel,
58+
float,
59+
double,
60+
phi::dtype::float16,
61+
int,
62+
int64_t) {}
Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
1+
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -14,39 +14,32 @@
1414

1515
#pragma once
1616

17-
#include <vector>
18-
19-
#include "paddle/fluid/framework/eigen.h"
2017
#include "paddle/fluid/framework/op_registry.h"
2118
#include "paddle/fluid/framework/tensor_util.h"
22-
#include "paddle/fluid/operators/isfinite_op.h"
23-
#include "paddle/fluid/platform/float16.h"
24-
#include "paddle/fluid/platform/transform.h"
19+
#include "paddle/phi/common/scalar.h"
20+
#include "paddle/phi/core/dense_tensor.h"
21+
#include "paddle/phi/infermeta/unary.h"
2522

2623
namespace phi {
27-
class DenseTensor;
28-
} // namespace phi
29-
30-
namespace paddle {
31-
namespace operators {
24+
namespace funcs {
3225

3326
struct InfinityV2Functor {
34-
void operator()(const framework::Tensor& tensor, framework::Tensor* out) {
35-
framework::TensorContainsInfV2(tensor, out);
27+
void operator()(const DenseTensor& tensor, DenseTensor* out) {
28+
paddle::framework::TensorContainsInfV2(tensor, out);
3629
}
3730
};
3831

3932
struct NANV2Functor {
40-
void operator()(const framework::Tensor& tensor, framework::Tensor* out) {
41-
framework::TensorContainsNANV2(tensor, out);
33+
void operator()(const DenseTensor& tensor, DenseTensor* out) {
34+
paddle::framework::TensorContainsNANV2(tensor, out);
4235
}
4336
};
4437

4538
struct IsfiniteV2Functor {
46-
void operator()(const framework::Tensor& tensor, framework::Tensor* out) {
47-
framework::TensorIsfiniteV2(tensor, out);
39+
void operator()(const DenseTensor& tensor, DenseTensor* out) {
40+
paddle::framework::TensorIsfiniteV2(tensor, out);
4841
}
4942
};
5043

51-
} // namespace operators
52-
} // namespace paddle
44+
} // namespace funcs
45+
} // namespace phi
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include "paddle/phi/backends/gpu/gpu_context.h"
16+
#include "paddle/phi/core/kernel_registry.h"
17+
#include "paddle/phi/kernels/impl/isfinite_kernel_impl.h"
18+
#include "paddle/phi/kernels/isfinite_kernel.h"
19+
20+
namespace phi {
21+
22+
template <typename T, typename Context, typename Functor>
23+
inline void IsfiniteKernelImpl(const Context& dev_ctx,
24+
const DenseTensor& x,
25+
DenseTensor* out) {
26+
dev_ctx.template Alloc<T>(out);
27+
Functor functor;
28+
functor(x, out);
29+
}
30+
31+
} // namespace phi
32+
33+
PD_REGISTER_KERNEL(isinf,
34+
GPU,
35+
ALL_LAYOUT,
36+
phi::IsinfKernel,
37+
float,
38+
double,
39+
phi::dtype::float16,
40+
int,
41+
int64_t) {}
42+
43+
PD_REGISTER_KERNEL(isnan,
44+
GPU,
45+
ALL_LAYOUT,
46+
phi::IsnanKernel,
47+
float,
48+
double,
49+
phi::dtype::float16,
50+
int,
51+
int64_t) {}
52+
53+
PD_REGISTER_KERNEL(isfinite,
54+
GPU,
55+
ALL_LAYOUT,
56+
phi::IsfiniteKernel,
57+
float,
58+
double,
59+
phi::dtype::float16,
60+
int,
61+
int64_t) {}

0 commit comments

Comments
 (0)