From c1377e33a8e9a6f873d7993e3b4b8b12fae45fec Mon Sep 17 00:00:00 2001 From: qingqing01 Date: Mon, 3 Feb 2020 15:50:48 +0800 Subject: [PATCH] Fix custom_op doc (#1750) * Fix custom_op doc * Add compling notes --- .../development/new_op/custom_op.md | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/doc/fluid/advanced_usage/development/new_op/custom_op.md b/doc/fluid/advanced_usage/development/new_op/custom_op.md index 7abc548c4..17a652b6f 100644 --- a/doc/fluid/advanced_usage/development/new_op/custom_op.md +++ b/doc/fluid/advanced_usage/development/new_op/custom_op.md @@ -72,18 +72,19 @@ class Relu2Kernel : public framework::OpKernel { }; // 定义反向OP的输入Y和dY、输出dX、属性: -class Relu2GradMaker : public framework::SingleGradOpDescMaker { +template +class Relu2GradMaker : public framework::SingleGradOpMaker { public: - using framework::SingleGradOpDescMaker::SingleGradOpDescMaker; + using framework::SingleGradOpMaker::SingleGradOpMaker; - std::unique_ptr Apply() const override { - auto* op = new framework::OpDesc(); + std::unique_ptr Apply() const override { + auto* op = new T(); op->SetType("relu2_grad"); - op->SetInput("Y", Output("Y")); - op->SetInput(framework::GradVarName("Y"), OutputGrad("Y")); - op->SetAttrMap(Attrs()); - op->SetOutput(framework::GradVarName("X"), InputGrad("X")); - return std::unique_ptr(op); + op->SetInput("Y", this->Output("Y")); + op->SetInput(framework::GradVarName("Y"), this->OutputGrad("Y")); + op->SetAttrMap(this->Attrs()); + op->SetOutput(framework::GradVarName("X"), this->InputGrad("X")); + return std::unique_ptr(op); } }; @@ -124,7 +125,11 @@ namespace ops = paddle::operators; using CPU = paddle::platform::CPUDeviceContext; // 注册前向和反向op // 为了和框架内部的relu区分,这里注册的OP type为relu2 -REGISTER_OPERATOR(relu2, ops::Relu2Op, ops::Relu2OpMaker, ops::Relu2GradMaker); +REGISTER_OPERATOR(relu2, + ops::Relu2Op, + ops::Relu2OpMaker, + ops::Relu2GradMaker, + ops::Relu2GradMaker); REGISTER_OPERATOR(relu2_grad, ops::Relu2GradOp); // 注册CPU的Kernel REGISTER_OP_CPU_KERNEL(relu2, @@ -252,24 +257,15 @@ echo $include_dir echo $lib_dir # PaddlePaddel >=1.6.1, 仅需要include ${include_dir} 和 ${include_dir}/third_party -nvcc relu_op.cu -c -o relu_op.cu.o -ccbin cc -DPADDLE_WITH_CUDA -DEIGEN_USE_GPU -DPADDLE_USE_DSO -Xcompiler -fPIC -std=c++11 -Xcompiler -fPIC -w --expt-relaxed-constexpr -O3 -DNVCC \ +nvcc relu_op.cu -c -o relu_op.cu.o -ccbin cc -DPADDLE_WITH_CUDA -DEIGEN_USE_GPU -DPADDLE_USE_DSO -DPADDLE_WITH_MKLDNN -Xcompiler -fPIC -std=c++11 -Xcompiler -fPIC -w --expt-relaxed-constexpr -O3 -DNVCC \ -I ${include_dir} \ -I ${include_dir}/third_party \ -g++ relu_op.cc relu_op.cu.o -o relu2_op.so -shared -fPIC -std=c++11 -O3 \ +g++ relu_op.cc relu_op.cu.o -o relu2_op.so -shared -fPIC -std=c++11 -O3 -DPADDLE_WITH_MKLDNN \ -I ${include_dir} \ -I ${include_dir}/third_party \ -L /usr/local/cuda/lib64 \ -L ${lib_dir} -lpaddle_framework -lcudart - -# PaddlePaddel 1.6.0, 需要include的third_party如下: -# -I ${include_dir}/third_party/install/protobuf/include \ -# -I ${include_dir}/third_party/install/glog/include \ -# -I ${include_dir}/third_party/install/gflags/include \ -# -I ${include_dir}/third_party/install/xxhash/include \ -# -I ${include_dir}/third_party/boost \ -# -I ${include_dir}/third_party/eigen3 \ -# -I ${include_dir}/third_party/dlpack/include \ ``` @@ -277,7 +273,9 @@ g++ relu_op.cc relu_op.cu.o -o relu2_op.so -shared -fPIC -std=c++11 -O3 \ 注意点: 1. NVCC编译GPU OP的cu文件时,需要加 `-DPADDLE_WITH_CUDA -DEIGEN_USE_GPU -DPADDLE_USE_DSO` 。 -2. 可多个OP编译到同一个动态库中。 +2. 如果安装的PaddlePaddle不包含MKLDNN,则需要去掉编译选项`-DPADDLE_WITH_MKLDNN`。默认的安装包已包含MKLDNN。 +3. 可多个OP编译到同一个动态库中。 +4. 通过pip方式安装的PaddlePaddle由GCC 4.8编译得到,由于GCC 4.8和GCC 5以上**C++11 ABI不兼容**,您编写的自定义OP,需要通过GCC 4.8编译。若是GCC 5及以上的环境上使用自定义OP,推荐使用[Docker安装PaddlePaddle](https://www.paddlepaddle.org.cn/install/doc/docker),使得编Paddle和编译自定义OP的GCC版本相同。 -- GitLab