Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Crayon鑫
Paddle
提交
0fb0484e
P
Paddle
项目概览
Crayon鑫
/
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看板
提交
0fb0484e
编写于
8月 03, 2017
作者:
T
tensor-tang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refine doc
上级
fee7c8b3
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
39 addition
and
35 deletion
+39
-35
doc/design/mkldnn/README.MD
doc/design/mkldnn/README.MD
+39
-35
未找到文件。
doc/design/mkldnn/README.MD
浏览文件 @
0fb0484e
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
我们计划将Intel深度神经网络数学库(
**MKL-DNN**
\[
[
1
](
#references
)
\]
)集成到PaddlePaddle,充分展现英特尔平台的优势,有效提升PaddlePaddle在英特尔架构上的性能。
我们计划将Intel深度神经网络数学库(
**MKL-DNN**
\[
[
1
](
#references
)
\]
)集成到PaddlePaddle,充分展现英特尔平台的优势,有效提升PaddlePaddle在英特尔架构上的性能。
我
的
短期内的基本目标是:
我
们
短期内的基本目标是:
-
完成常用layer的MKLDNN实现。
-
完成常用layer的MKLDNN实现。
-
完成常见深度神经网络VGG,GoogLeNet 和 ResNet的MKLDNN实现。
-
完成常见深度神经网络VGG,GoogLeNet 和 ResNet的MKLDNN实现。
...
@@ -10,17 +10,17 @@
...
@@ -10,17 +10,17 @@
## Contents
## Contents
-
[
Overall
](
#
O
verall
)
-
[
Overall
](
#
o
verall
)
-
[
Cmake
](
#
C
make
)
-
[
Cmake
](
#
c
make
)
-
[
Layer
](
#
L
ayer
)
-
[
Layer
](
#
l
ayer
)
-
[
Activation
](
#
Activations
)
-
[
Activation
](
#
activation
)
-
[
Unit Test
](
#
Unit-T
est
)
-
[
Unit Test
](
#
unit-t
est
)
-
[
Proto
](
#
P
roto
)
-
[
Proto
](
#
p
roto
)
-
[
Python API
](
#
Python-API
)
-
[
Python API
](
#
python-api
)
-
[
Demo
](
#
D
emo
)
-
[
Demo
](
#
d
emo
)
-
[
Benchmark
](
#
B
enchmark
)
-
[
Benchmark
](
#
b
enchmark
)
-
[
Others
](
#
O
thers
)
-
[
Others
](
#
o
thers
)
-
[
Optimized Design
](
#
Optimized-D
esign
)
-
[
Optimized Design
](
#
optimized-d
esign
)
-
[
New
](
#new
)
-
[
New
](
#new
)
-
[
Add
](
#add
)
-
[
Add
](
#add
)
...
@@ -29,37 +29,37 @@
...
@@ -29,37 +29,37 @@
整体上,我们粗略的把集成方案分为了如下几个方面。
整体上,我们粗略的把集成方案分为了如下几个方面。
### C
am
ke
### C
ma
ke
我们会在
`CMakeLists.txt`
中会添加
`WITH_MKLDNN`
的选项,当设置这个值为
`ON`
的时候会启用编译MKLDNN功能。同时会自动开启
`OpenMP`
用于提高MKLDNN的性能。
我们会在
`CMakeLists.txt`
中会添加
`WITH_MKLDNN`
的选项,当设置这个值为
`ON`
的时候会启用编译MKLDNN功能。同时会自动开启
`OpenMP`
用于提高MKLDNN的性能。
为了让PaddlePaddle更好的发挥MKLDNN的性能,我们还会引入
了
`WITH_MKLML`
的选项,用于选择是否用MKLDNN自带的MKL cblas
的安装包。这个安装包可以独立于MKLDNN使用,但是建议在开启MKLDNN的同时也打开MKLML的开关,这样才能发挥最好的性能。
为了让PaddlePaddle更好的发挥MKLDNN的性能,我们还会引入
`WITH_MKLML`
的选项,用于选择是否用MKLDNN自带的MKLML
的安装包。这个安装包可以独立于MKLDNN使用,但是建议在开启MKLDNN的同时也打开MKLML的开关,这样才能发挥最好的性能。
所以,我们会在
`cmake\external`
新建
一个
`MKLDNN.cmake`
和
`MKLML.cmake`
文件,并作为第三方库安装到PaddlePaddle的third party目录中。
所以,我们会在
`cmake\external`
新建
`MKLDNN.cmake`
和
`MKLML.cmake`
文件,并作为第三方库安装到PaddlePaddle的third party目录中。
**备注**
:当
`WITH_MKLML=ON`
的时候,会优先使用这个包作为PaddlePaddle的Cblas和Lapack库,所以会稍微改动
`cmake\cblas.cmake`
中的逻辑。
**备注**
:当
`WITH_MKLML=ON`
的时候,会优先使用这个包作为PaddlePaddle的Cblas和Lapack库,所以会稍微改动
`cmake\cblas.cmake`
中的逻辑。
### Layer
### Layer
所有的layer相关的C++代码
会在安装
PaddlePaddle的目录结构存放在
所有的layer相关的C++代码
,都会在按照
PaddlePaddle的目录结构存放在
`paddle\gserver\layers`
中,文件名以
*Mkldnn*
开头。
`paddle\gserver\layers`
中,文件名以
*Mkldnn*
开头。
并且有可能会在Layer.h和Layer.cpp里面添加少量的code,用宏定义
`PADDLE_USE_MKLDNN`
隔开。
并且有可能会在Layer.h和Layer.cpp里面添加少量的code,用宏定义
`PADDLE_USE_MKLDNN`
隔开。
所有MKLDNN的Layer都会继承
一个MKLDNN的父类layer,这个父类mkldnnlayer继承
Paddle的基类layer。
所有MKLDNN的Layer都会继承
于一个MKLDNN的父类layer,这个父类mkldnnlayer继承于
Paddle的基类layer。
### Activation
### Activation
由于在PaddlePaddle中,激活函数是独立于layer概念的,所以会在
`paddle\gserver\activations`
目录下添加一个
`MkldnnActivation.h`
文件定义一些用于M
kldnn
的接口,实现方法还是在
`ActivationFunction.cpp`
里面
由于在PaddlePaddle中,激活函数是独立于layer概念的,所以会在
`paddle\gserver\activations`
目录下添加一个
`MkldnnActivation.h`
文件定义一些用于M
KLDNN
的接口,实现方法还是在
`ActivationFunction.cpp`
里面
### Unit Test
### Unit Test
会在
`paddle\gserver\test`
里面
添加
`test_Mkldnn.cpp`
和
`MkldnnTester.*`
用于mkldnn的测试。
会在
`paddle\gserver\test`
目录下
添加
`test_Mkldnn.cpp`
和
`MkldnnTester.*`
用于mkldnn的测试。
Activation的测试
会在Paddle原有基础
上直接添加测试type。
Activation的测试
,计划在Paddle原有的测试文件
上直接添加测试type。
### Proto
### Proto
根据具体layer的需求
会在
`proto\ModelConfig.proto`
里面添加必要的选项
根据具体layer的需求
可能会在
`proto\ModelConfig.proto`
里面添加必要的选项。
### Python API
### Python API
目前只考虑
**v1 API**
。
目前只考虑
**v1 API**
。
所有layer相关的会
在
`python/paddle/trainer/config_parser.py`
里面添加
`use_mkldnn`
这个选择,方便user选择使用mkldnn的layers。
计划
在
`python/paddle/trainer/config_parser.py`
里面添加
`use_mkldnn`
这个选择,方便user选择使用mkldnn的layers。
具体实现方式比如:
具体实现方式比如:
...
@@ -68,34 +68,38 @@ Activation的测试会在Paddle原有基础上直接添加测试type。
...
@@ -68,34 +68,38 @@ Activation的测试会在Paddle原有基础上直接添加测试type。
if use_mkldnn
if use_mkldnn
self.layer_type = mkldnn_*
self.layer_type = mkldnn_*
所有mkldnn的type我会以"mkldnn_"开头。
所有mkldnn的type会以"mkldnn_"开头,以示区分。
并且可能在
`python/paddle/trainer_config_helper`
目录下的
`activations.py `
和
`layers.py`
里面添加必要的mkldnn的接口。
并且可能在
`python/paddle/trainer_config_helper`
目录下的
`activations.py `
和
`layers.py`
里面添加必要的mkldnn的接口。
### Demo
### Demo
会在
`v1_api_demo`
目录下添加一个
`mkldnn`
的文件夹,里面放入一些用于mkldnn测试的demo
model
。
会在
`v1_api_demo`
目录下添加一个
`mkldnn`
的文件夹,里面放入一些用于mkldnn测试的demo
脚本
。
### Benchmark
### Benchmark
会考虑
改变(或者添加)
在
`benchmark\paddle\image\run.sh`
,添加使用mkldnn的测试。
会考虑
添加部分逻辑
在
`benchmark\paddle\image\run.sh`
,添加使用mkldnn的测试。
### Others
### Others
1.
如果
使用MKLDNN的情况下,会把cpu的allocate的align
为64。
1.
如果
在使用MKLDNN的情况下,会把CPU的Buffer对齐
为64。
2.
深入PaddlePaddle,
找到
其他可以优化的可能,进一步优化。比如可能会用
`OpenMP`
改进SGD的更新性能。
2.
深入PaddlePaddle,
寻找有没有
其他可以优化的可能,进一步优化。比如可能会用
`OpenMP`
改进SGD的更新性能。
## Optimized Design
## Optimized Design
为了更好的符合PaddlePaddle的代码风格,决定尽可能少的在PaddlePaddle的父类Layer中添加变量或者函数。
为了更好的符合PaddlePaddle的代码风格,同时又尽可能少的牺牲MKLDNN的性能。
使用已有的
`deviceId_`
变量来区分layer的属性,定义
`-2`
为MkldnnLayer特有的设备值。
我们决定尽可能少的在PaddlePaddle的父类Layer中添加变量或者函数,改用已有的
`deviceId_`
变量来区分layer的属性,定义
`-2`
为MkldnnLayer特有的设备ID。
### New
### New
1.
创建
**MkldnnLayer**
,并override父类Layer的
init函数,修改deviceId_为
`-2`
代表这个layer是用于跑在MKLDNN的环境下。
1.
创建
**MkldnnLayer**
,并override父类Layer的
`init`
函数,修改
`deviceId_`
为
`-2`
,
代表这个layer是用于跑在MKLDNN的环境下。
2.
创建
**MkldnnMatrix**
,用于管理MKLDNN会用到的
各种
memory函数和接口。
2.
创建
**MkldnnMatrix**
,用于管理MKLDNN会用到的
相关
memory函数和接口。
3.
创建
**MkldnnBase**
,定义一些除了layer和memory相关的类和函数。包括MKLDNN会用到Stream和CpuEngine,和未来可能还会用到FPGAEngine等。
3.
创建
**MkldnnBase**
,定义一些除了layer和memory相关的类和函数。包括MKLDNN会用到Stream和CpuEngine,和未来可能还会用到FPGAEngine等。
### Add
### Add
1.
在现有的
**Argument**
里面添加两个
**MkldnnMatrixPtr**
,取名为mkldnnValue和mkldnnGrad,用于存放MkldnnLayer会用到的memory buffer。 并且添加函数cvt(会改一个更加合适的函数名),用于处理CPU device和MKLDNN device之间memory的相互转化。
1.
在现有的
**Argument**
里面添加两个
**MkldnnMatrixPtr**
,取名为mkldnnValue和mkldnnGrad,用于存放MkldnnLayer会用到的memory buffer。 并且添加函数cvt(会修改为一个更加合适的函数名),用于处理"CPU device"和"MKLDNN device"之间memory的相互转化。
2.
在父类Layer中的
`getOutput`
函数中添加一段逻辑,用于判断
`deviceId`
,并针对device在MKLDNN和CPU之间不统一的情况,做一个提前转换。 也就是调用Argument的cvt函数把output统一到需要的device上。
2.
在父类Layer中的
`getOutput`
函数中添加一段逻辑,用于判断
`deviceId`
,并针对device在MKLDNN和CPU之间不统一的情况,做一个前期转换。 也就是调用
`Argument`
的cvt函数把output统一到需要的device上。
3.
在原来的Flag中添加一个
`use_mkldnn`
的flag,用于选择是否只使用MKLDNN的功能。
3.
在原来的
`FLAGS`
中添加一个
`use_mkldnn`
的flag,用于选择是否使用MKLDNN的相关功能。
## References
## References
1.
[
Intel Math Kernel Library for Deep Neural Networks (Intel MKL-DNN)
](
https://github.com/01org/mkl-dnn
"Intel MKL-DNN"
)
1.
[
Intel Math Kernel Library for Deep Neural Networks (Intel MKL-DNN)
](
https://github.com/01org/mkl-dnn
"Intel MKL-DNN"
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录