Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
b3ff125d
P
Paddle
项目概览
机器未来
/
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看板
提交
b3ff125d
编写于
9月 05, 2017
作者:
C
caoying03
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
follow comments.
上级
efd40b66
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
17 deletion
+25
-17
doc/howto/dev/new_op_cn.md
doc/howto/dev/new_op_cn.md
+25
-17
未找到文件。
doc/howto/dev/new_op_cn.md
浏览文件 @
b3ff125d
...
@@ -28,16 +28,18 @@
...
@@ -28,16 +28,18 @@
内容 | 定义位置
内容 | 定义位置
-------------- | :----------------------
-------------- | :----------------------
OpProtoMake定义 |
`*_op.cc`
文件,Backward Op不需要定义OpProtoMake
OpProtoMake定义 |
`.cc`
文件,Backward Op不需要定义OpProtoMake
Op定义 |
`*_op.cc`
文件
Op定义 |
`.cc`
文件
Kernel实现 | CPU、GPU共享Kernel在
`*_op.h`
文件,否则,CPU可以在
`*_op.cc`
文件,GPU可在
`*_op.cu`
文件。
Kernel实现 | CPU、GPU共享Kernel在
`.h`
文件,否则,CPU可以在
`.cc`
文件,GPU可在
`.cu`
文件。
注册Op | Op注册在
`*_op.cc`
文件;Kernel注册CPU在
`*_op.cc`
文件,GPU在
`*_op.cu`
文件
注册Op | Op注册在
`.cc`
文件;Kernel注册CPU在
`.cc`
文件,GPU在
`.cu`
文件
实现新的op都添加至目录
[
paddle/operators
](
https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/operators
)
下,文件命名以
`*_op.h`
(如有) 、
`*_op.cc`
、
`*_op.cu`
(如有)结尾。
实现新的op都添加至目录
[
paddle/operators
](
https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/operators
)
下,文件命名以
`*_op.h`
(如有) 、
`*_op.cc`
、
`*_op.cu`
(如有)结尾。
下面以矩阵乘操作,即
[
MulOp
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/mul_op.cc
)
为例来介绍如何写带Kernel的Operator。
下面以矩阵乘操作,即
[
MulOp
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/mul_op.cc
)
为例来介绍如何写带Kernel的Operator。
## 实现C++类
## 实现C++类
...
@@ -200,13 +202,18 @@ REGISTER_OP_GPU_KERNEL(mul_grad,
...
@@ -200,13 +202,18 @@ REGISTER_OP_GPU_KERNEL(mul_grad,
### 5. 编译
### 5. 编译
无需修改
[
paddle/operators/CMakeLists.txt
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/CMakeLists.txt
)
文件,
`paddle/operators`
目录下新增的
`*_op.cc`
文件会被自动加入编译。
-
简单
**无特殊依赖**
的OP无需修改CMakeList.txt文件。
[
paddle/operators/CMakeLists.txt
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/CMakeLists.txt
)
会自动将
`paddle/operators`
目录下新增的
`*_op.cc`
文件加入编译。
-
较为复杂、
**有额外依赖**
的operator仍需要修改
[
paddle/operators/CMakeLists.txt
](
https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/CMakeLists.txt
)
。如,
`mul_op`
依赖
`math_function`
,需要在
`CMakeLists.txt`
中添加如下内容:
直接执行下面命令可进行编译:
```
op_library(mul_op SRCS mul_op.cc mul_op.cu DEPS math_function) +
```
```
-
运行下面命令可以进行编译:
make mul_op
```
```
make mul_op
```
## 绑定Python
## 绑定Python
...
@@ -235,13 +242,13 @@ make mul_op
...
@@ -235,13 +242,13 @@ make mul_op
- 生成库
- 生成库
无需修改 [`
paddle/pybind/CMakeLists.txt
`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/pybind/CMakeLists.txt)文件,`
paddle/operators
` 目录下新增的 `
*
_op.cc
` 文件会
被自动被添加链接至
生成的lib库中。
无需修改 [`
paddle/pybind/CMakeLists.txt
`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/pybind/CMakeLists.txt)文件,`
paddle/operators
` 目录下新增的 `
*
_op.cc
` 文件会
自动被添加链接到
生成的lib库中。
## 实现单元测试
## 实现单元测试
单测包括对比前向Op不同设备(CPU、GPU)的实现、对比反向OP不同设备(CPU、GPU)的实现、反向Op的梯度测试。下面介绍介绍[`
MulOp
`的单测](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/framework/tests/test_mul_op.py)。
单测包括对比前向Op不同设备(CPU、GPU)的实现、对比反向OP不同设备(CPU、GPU)的实现、反向Op的梯度测试。下面介绍介绍[`
MulOp
`的单测](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/framework/tests/test_mul_op.py)。
### 前向Operator单
测
### 前向Operator单
元测试
前向Op单测继承自`
unittest.TestCase
`,并定义元类`
__metaclass__
= OpTestMeta
`,具体单测流程在`
OpTestMeta
`里完成。需在`
setUp
`函数定义输入输出和属性参数,以及Python对比的输出值。
前向Op单测继承自`
unittest.TestCase
`,并定义元类`
__metaclass__
= OpTestMeta
`,具体单测流程在`
OpTestMeta
`里完成。需在`
setUp
`函数定义输入输出和属性参数,以及Python对比的输出值。
...
@@ -269,7 +276,7 @@ class TestMulOp(unittest.TestCase):
...
@@ -269,7 +276,7 @@ class TestMulOp(unittest.TestCase):
- `
self.outputs
` : 定义输出,并得到Python结算结果。
- `
self.outputs
` : 定义输出,并得到Python结算结果。
### 反向Operator单
测
### 反向Operator单
元测试
反向Op单测继承自`
GradientChecker
`,而`
GradientChecker
`集成自`
unittest.TestCase
`,所以反向单测函数需要`
test_
`开头。
反向Op单测继承自`
GradientChecker
`,而`
GradientChecker
`集成自`
unittest.TestCase
`,所以反向单测函数需要`
test_
`开头。
...
@@ -297,21 +304,22 @@ class TestMulOp(unittest.TestCase):
...
@@ -297,21 +304,22 @@ class TestMulOp(unittest.TestCase):
- 第四个参数`
"Out"
` : 指定前向网络最终的输出目标变量`
Out
`
- 第四个参数`
"Out"
` : 指定前向网络最终的输出目标变量`
Out
`
### 编译和执行
### 编译和执行
单元测试
单测完成之后,在[`
python/paddle/v2/framework/tests/CMakeLists.txt
`](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/framework/tests/CMakeLists.txt)里添加
编译
:
单测完成之后,在[`
python/paddle/v2/framework/tests/CMakeLists.txt
`](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/framework/tests/CMakeLists.txt)里添加
以下内容将单测加入工程中
:
```
```
py_test(test_mul_op SRCS test_mul_op.py)
py_test(test_mul_op SRCS test_mul_op.py)
```
```
编译时需要打开`
WITH_TESTING
`, 即 `
cmake paddle_dir -DWITH_TESTING=ON
`,编译成功之后执行单测命令为
:
请注意,**不同于Op的编译测试,运行单元测试测时需要编译整个工程**,并且编译时需要打开`
WITH_TESTING
`, 即`
cmake paddle_dir -DWITH_TESTING=ON
`。编译成功后,执行下面的命令来运行单测
:
```
```
bash
make test ARGS="-R test_mul_op -V"
make test ARGS="-R test_mul_op -V"
```
```
或者:
或者:
```
```
bash
ctest -R test_mul_op
ctest -R test_mul_op
``
`
``
`
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录