Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
FluidDoc
提交
c1377e33
F
FluidDoc
项目概览
PaddlePaddle
/
FluidDoc
通知
5
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
23
列表
看板
标记
里程碑
合并请求
111
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FluidDoc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
23
Issue
23
列表
看板
标记
里程碑
合并请求
111
合并请求
111
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
c1377e33
编写于
2月 03, 2020
作者:
Q
qingqing01
提交者:
GitHub
2月 03, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix custom_op doc (#1750)
* Fix custom_op doc * Add compling notes
上级
269f7908
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
20 addition
and
22 deletion
+20
-22
doc/fluid/advanced_usage/development/new_op/custom_op.md
doc/fluid/advanced_usage/development/new_op/custom_op.md
+20
-22
未找到文件。
doc/fluid/advanced_usage/development/new_op/custom_op.md
浏览文件 @
c1377e33
...
...
@@ -72,18 +72,19 @@ class Relu2Kernel : public framework::OpKernel<T> {
};
// 定义反向OP的输入Y和dY、输出dX、属性:
class Relu2GradMaker : public framework::SingleGradOpDescMaker {
template <typename T>
class Relu2GradMaker : public framework::SingleGradOpMaker<T> {
public:
using framework::SingleGradOp
DescMaker::SingleGradOpDesc
Maker;
using framework::SingleGradOp
Maker<T>::SingleGradOp
Maker;
std::unique_ptr<
framework::OpDesc
> Apply() const override {
auto* op = new
framework::OpDesc
();
std::unique_ptr<
T
> 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<
framework::OpDesc
>(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<
T
>(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<paddle::framework::OpDesc>,
ops::Relu2GradMaker<paddle::imperative::OpBase>);
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版本相同。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录