From 0a8ebb0d593820491843c6b57897fead530981cb Mon Sep 17 00:00:00 2001 From: cucuzg Date: Tue, 2 Mar 2021 09:34:00 +0800 Subject: [PATCH] add clip_by_norm on kunlun, *test=kunlun (#30862) (#31331) --- cmake/external/xpu.cmake | 2 +- paddle/fluid/operators/clip_by_norm_op_xpu.cc | 74 ++++++++++++++++++ .../unittests/xpu/test_clip_by_norm_op_xpu.py | 77 +++++++++++++++++++ 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 paddle/fluid/operators/clip_by_norm_op_xpu.cc create mode 100644 python/paddle/fluid/tests/unittests/xpu/test_clip_by_norm_op_xpu.py diff --git a/cmake/external/xpu.cmake b/cmake/external/xpu.cmake index 344518c9600..d072d1eb202 100644 --- a/cmake/external/xpu.cmake +++ b/cmake/external/xpu.cmake @@ -13,7 +13,7 @@ if(NOT XPU_SDK_ROOT) elseif(WITH_SUNWAY) SET(XPU_URL "https://baidu-kunlun-public.su.bcebos.com/paddle_depence/sunway/xpu_2021_01_13.tar.gz" CACHE STRING "" FORCE) else() - SET(XPU_URL "https://baidu-kunlun-public.su.bcebos.com/paddle_depence/xpu_2021_01_13.tar.gz" CACHE STRING "" FORCE) + SET(XPU_URL "https://baidu-kunlun-public.su.bcebos.com/paddle_depence/xpu_2021_02_03.tar.gz" CACHE STRING "" FORCE) endif() SET(XPU_SOURCE_DIR "${THIRD_PARTY_PATH}/xpu") diff --git a/paddle/fluid/operators/clip_by_norm_op_xpu.cc b/paddle/fluid/operators/clip_by_norm_op_xpu.cc new file mode 100644 index 00000000000..7c91f06a8d7 --- /dev/null +++ b/paddle/fluid/operators/clip_by_norm_op_xpu.cc @@ -0,0 +1,74 @@ +/* Copyright (c) 2016 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. */ + +#ifdef PADDLE_WITH_XPU +#include "paddle/fluid/operators/clip_by_norm_op.h" +#include + +namespace paddle { +namespace operators { + +template +class XPUClipByNormKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& context) const override { + auto max_norm = context.Attr("max_norm"); + auto in_var = context.InputVar("X"); + + Tensor* output = nullptr; + const Tensor* input = nullptr; + if (in_var->IsType()) { + input = context.Input("X"); + + output = context.Output("Out"); + output->mutable_data(context.GetPlace()); + } else { + PADDLE_THROW(platform::errors::InvalidArgument( + "Invalid input variable type, only support LodTensor" + "type, but got type is %s.", + framework::ToTypeName(in_var->Type()))); + } + + PADDLE_ENFORCE_NOT_NULL(input, + platform::errors::InvalidArgument( + "Input(X) of ClipByNormOp should not be null. " + "Please check if it is created correctly.")); + auto& dev_ctx = context.template device_context(); + const auto& x_dims = input->dims(); + std::vector xshape(x_dims.size()); + std::vector rdims(x_dims.size()); + for (int i = 0; i < x_dims.size(); i++) { + xshape[i] = x_dims[i]; + rdims[i] = i; + } + int r = xpu::clip_by_norm(dev_ctx.x_context(), input->data(), + output->data(), max_norm, xshape, rdims); + PADDLE_ENFORCE_EQ( + r, XPU_SUCCESS, + platform::errors::External("XPU API(clip_by_norm) return " + "wrong value[%d], please check whether " + "Baidu Kunlun Card is properly installed.", + r)); + } +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +REGISTER_OP_XPU_KERNEL( + clip_by_norm, + ops::XPUClipByNormKernel); + +#endif // PADDLE_WITH_XPU diff --git a/python/paddle/fluid/tests/unittests/xpu/test_clip_by_norm_op_xpu.py b/python/paddle/fluid/tests/unittests/xpu/test_clip_by_norm_op_xpu.py new file mode 100644 index 00000000000..8698df9e7ee --- /dev/null +++ b/python/paddle/fluid/tests/unittests/xpu/test_clip_by_norm_op_xpu.py @@ -0,0 +1,77 @@ +# Copyright (c) 2020 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 sys +sys.path.append("..") +import unittest +import numpy as np +import paddle.fluid.core as core +import paddle.fluid as fluid +from op_test_xpu import OpTest, XPUOpTest +import paddle +from paddle.fluid import Program, program_guard + + +class TestXPUClipByNormOp(XPUOpTest): + def setUp(self): + self.op_type = "clip_by_norm" + self.dtype = np.float32 + self.use_xpu = True + self.max_relative_error = 0.006 + self.initTestCase() + input = np.random.random(self.shape).astype("float32") + input[np.abs(input) < self.max_relative_error] = 0.5 + self.inputs = {'X': input, } + self.attrs = {} + self.attrs['max_norm'] = self.max_norm + norm = np.sqrt(np.sum(np.square(input))) + if norm > self.max_norm: + output = self.max_norm * input / norm + else: + output = input + self.outputs = {'Out': output} + + def test_check_output(self): + if paddle.is_compiled_with_xpu(): + paddle.enable_static() + place = paddle.XPUPlace(0) + self.check_output_with_place(place) + + def initTestCase(self): + self.shape = (100, ) + self.max_norm = 1.0 + + +class TestCase1(TestXPUClipByNormOp): + def initTestCase(self): + self.shape = (100, ) + self.max_norm = 1e20 + + +class TestCase2(TestXPUClipByNormOp): + def initTestCase(self): + self.shape = (16, 16) + self.max_norm = 0.1 + + +class TestCase3(TestXPUClipByNormOp): + def initTestCase(self): + self.shape = (4, 8, 16) + self.max_norm = 1.0 + + +if __name__ == "__main__": + unittest.main() -- GitLab