Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Crayon鑫
Paddle
提交
33f21d05
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看板
提交
33f21d05
编写于
8月 11, 2017
作者:
H
hedaoyuan
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' of
https://github.com/baidu/Paddle
into convolution
上级
da616a6f
01e9e443
变更
63
隐藏空白更改
内联
并排
Showing
63 changed file
with
1643 addition
and
183 deletion
+1643
-183
CMakeLists.txt
CMakeLists.txt
+9
-7
Dockerfile
Dockerfile
+16
-1
cmake/configure.cmake
cmake/configure.cmake
+1
-1
cmake/cpplint.cmake
cmake/cpplint.cmake
+1
-1
cmake/flags.cmake
cmake/flags.cmake
+6
-4
cmake/generic.cmake
cmake/generic.cmake
+1
-1
cmake/package.cmake
cmake/package.cmake
+1
-1
cmake/util.cmake
cmake/util.cmake
+2
-2
cmake/version.cmake
cmake/version.cmake
+1
-1
doc/templates/conf.py.cn.in
doc/templates/conf.py.cn.in
+3
-3
doc/templates/conf.py.en.in
doc/templates/conf.py.en.in
+3
-3
go/pserver/client/c/test/test_train.py
go/pserver/client/c/test/test_train.py
+2
-4
paddle/api/CMakeLists.txt
paddle/api/CMakeLists.txt
+7
-7
paddle/api/ParameterUpdater.cpp
paddle/api/ParameterUpdater.cpp
+1
-1
paddle/capi/Arguments.cpp
paddle/capi/Arguments.cpp
+12
-0
paddle/capi/arguments.h
paddle/capi/arguments.h
+14
-0
paddle/capi/examples/model_inference/common/common.h
paddle/capi/examples/model_inference/common/common.h
+11
-8
paddle/capi/gradient_machine.cpp
paddle/capi/gradient_machine.cpp
+25
-0
paddle/capi/gradient_machine.h
paddle/capi/gradient_machine.h
+12
-0
paddle/capi/tests/CMakeLists.txt
paddle/capi/tests/CMakeLists.txt
+2
-2
paddle/framework/CMakeLists.txt
paddle/framework/CMakeLists.txt
+5
-0
paddle/framework/attribute.h
paddle/framework/attribute.h
+1
-1
paddle/framework/ddim.h
paddle/framework/ddim.h
+1
-1
paddle/framework/operator.h
paddle/framework/operator.h
+1
-1
paddle/framework/tensor.h
paddle/framework/tensor.h
+2
-2
paddle/framework/tensor_impl.h
paddle/framework/tensor_impl.h
+11
-5
paddle/gserver/CMakeLists.txt
paddle/gserver/CMakeLists.txt
+11
-0
paddle/gserver/layers/MKLDNNBase.h
paddle/gserver/layers/MKLDNNBase.h
+97
-0
paddle/gserver/layers/MKLDNNFcLayer.cpp
paddle/gserver/layers/MKLDNNFcLayer.cpp
+282
-0
paddle/gserver/layers/MKLDNNFcLayer.h
paddle/gserver/layers/MKLDNNFcLayer.h
+80
-0
paddle/gserver/layers/MKLDNNLayer.h
paddle/gserver/layers/MKLDNNLayer.h
+132
-0
paddle/gserver/tests/CMakeLists.txt
paddle/gserver/tests/CMakeLists.txt
+21
-12
paddle/gserver/tests/MKLDNNTester.cpp
paddle/gserver/tests/MKLDNNTester.cpp
+369
-0
paddle/gserver/tests/MKLDNNTester.h
paddle/gserver/tests/MKLDNNTester.h
+120
-0
paddle/gserver/tests/test_KmaxSeqScore.cpp
paddle/gserver/tests/test_KmaxSeqScore.cpp
+6
-1
paddle/gserver/tests/test_MKLDNN.cpp
paddle/gserver/tests/test_MKLDNN.cpp
+76
-0
paddle/math/CMakeLists.txt
paddle/math/CMakeLists.txt
+4
-4
paddle/math/CpuSparseMatrix.h
paddle/math/CpuSparseMatrix.h
+4
-0
paddle/math/SparseMatrix.h
paddle/math/SparseMatrix.h
+3
-0
paddle/operators/gaussian_random_op.cu
paddle/operators/gaussian_random_op.cu
+5
-4
paddle/operators/uniform_random_op.cu
paddle/operators/uniform_random_op.cu
+2
-1
paddle/platform/dynload/cublas.h
paddle/platform/dynload/cublas.h
+7
-7
paddle/platform/dynload/curand.h
paddle/platform/dynload/curand.h
+1
-0
paddle/platform/place.h
paddle/platform/place.h
+1
-1
paddle/platform/variant.h
paddle/platform/variant.h
+32
-0
paddle/pserver/test/CMakeLists.txt
paddle/pserver/test/CMakeLists.txt
+3
-3
paddle/scripts/docker/build.sh
paddle/scripts/docker/build.sh
+4
-4
paddle/trainer/NewRemoteParameterUpdater.cpp
paddle/trainer/NewRemoteParameterUpdater.cpp
+81
-17
paddle/trainer/TrainerConfigHelper.cpp
paddle/trainer/TrainerConfigHelper.cpp
+4
-0
paddle/trainer/tests/CMakeLists.txt
paddle/trainer/tests/CMakeLists.txt
+24
-24
paddle/utils/Flags.cpp
paddle/utils/Flags.cpp
+8
-0
paddle/utils/Flags.h
paddle/utils/Flags.h
+2
-0
paddle/utils/tests/CMakeLists.txt
paddle/utils/tests/CMakeLists.txt
+1
-1
proto/CMakeLists.txt
proto/CMakeLists.txt
+2
-2
python/CMakeLists.txt
python/CMakeLists.txt
+9
-9
python/paddle/trainer/config_parser.py
python/paddle/trainer/config_parser.py
+22
-2
python/paddle/trainer_config_helpers/tests/CMakeLists.txt
python/paddle/trainer_config_helpers/tests/CMakeLists.txt
+7
-7
python/paddle/v2/framework/.gitignore
python/paddle/v2/framework/.gitignore
+1
-0
python/paddle/v2/framework/tests/CMakeLists.txt
python/paddle/v2/framework/tests/CMakeLists.txt
+1
-2
python/paddle/v2/optimizer.py
python/paddle/v2/optimizer.py
+19
-5
python/paddle/v2/parameters.py
python/paddle/v2/parameters.py
+42
-11
python/paddle/v2/trainer.py
python/paddle/v2/trainer.py
+2
-2
python/setup.py.in
python/setup.py.in
+7
-7
未找到文件。
CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -14,8 +14,8 @@
cmake_minimum_required
(
VERSION 3.0
)
set
(
CMAKE_MODULE_PATH
${
CMAKE_MODULE_PATH
}
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/cmake"
)
set
(
P
ROJ_ROOT
${
CMAKE_CURRENT_SOURCE_DIR
}
)
set
(
P
ROJ_BINARY_ROOT
${
CMAKE_CURRENT_BINARY_DIR
}
)
set
(
P
ADDLE_SOURCE_DIR
${
CMAKE_CURRENT_SOURCE_DIR
}
)
set
(
P
ADDLE_BINARY_DIR
${
CMAKE_CURRENT_BINARY_DIR
}
)
include
(
system
)
...
...
@@ -36,8 +36,8 @@ include(simd)
################################ Configurations #######################################
option
(
WITH_GPU
"Compile PaddlePaddle with NVIDIA GPU"
${
CUDA_FOUND
}
)
option
(
WITH_AVX
"Compile PaddlePaddle with AVX intrinsics"
${
AVX_FOUND
}
)
option
(
WITH_MKLDNN
"Compile PaddlePaddle with mkl-dnn support."
${
AVX_FOUND
}
)
option
(
WITH_MKLML
"Compile PaddlePaddle with mklml package."
${
AVX_FOUND
}
)
option
(
WITH_MKLDNN
"Compile PaddlePaddle with mkl-dnn support."
OFF
)
option
(
WITH_MKLML
"Compile PaddlePaddle with mklml package."
OFF
)
option
(
WITH_DSO
"Compile PaddlePaddle with dynamic linked CUDA"
ON
)
option
(
WITH_TESTING
"Compile PaddlePaddle with unit testing"
ON
)
option
(
WITH_SWIG_PY
"Compile PaddlePaddle with inference api"
ON
)
...
...
@@ -121,8 +121,8 @@ include(version) # set PADDLE_VERSION
include
(
coveralls
)
# set code coverage
include_directories
(
"
${
P
ROJ_ROOT
}
"
)
include_directories
(
"
${
P
ROJ_ROOT
}
/paddle/cuda/include"
)
include_directories
(
"
${
P
ADDLE_SOURCE_DIR
}
"
)
include_directories
(
"
${
P
ADDLE_SOURCE_DIR
}
/paddle/cuda/include"
)
include_directories
(
"
${
CMAKE_CURRENT_BINARY_DIR
}
/proto"
)
include_directories
(
"
${
CMAKE_CURRENT_BINARY_DIR
}
/go/pserver/client/c"
)
include_directories
(
${
Boost_INCLUDE_DIRS
}
)
...
...
@@ -144,7 +144,7 @@ if(WITH_GPU)
endif
(
WITH_GPU
)
if
(
WITH_MKLDNN
)
list
(
APPEND EXTERNAL_LIBS
${
MKLDNN_LIB
RARY
}
${
MKLDNN_IOMP_LIB
}
)
list
(
APPEND EXTERNAL_LIBS
${
MKLDNN_LIB
}
${
MKLDNN_IOMP_LIB
}
)
endif
()
if
(
USE_NNPACK
)
...
...
@@ -164,10 +164,12 @@ if(WITH_GOLANG)
add_subdirectory
(
go
)
endif
(
WITH_GOLANG
)
set
(
PADDLE_PYTHON_BUILD_DIR
"
${
CMAKE_CURRENT_BINARY_DIR
}
/python/build"
)
add_subdirectory
(
paddle
)
if
(
WITH_PYTHON
)
add_subdirectory
(
python
)
endif
()
if
(
WITH_DOC
)
add_subdirectory
(
doc
)
endif
()
Dockerfile
浏览文件 @
33f21d05
...
...
@@ -64,13 +64,28 @@ RUN pip install --upgrade pip && \
pip
install
-U
sphinx-rtd-theme
==
0.1.9 recommonmark
&&
\
pip
install
pre-commit
'requests==2.9.2'
'ipython==5.3.0'
&&
\
pip
install
'ipykernel==4.6.0'
'jupyter==1.0.0'
&&
\
pip
install
rarfile
pip
install
opencv-python rarfile
'scipy>=0.19.0'
'nltk>=3.2.2'
# To fix https://github.com/PaddlePaddle/Paddle/issues/1954, we use
# the solution in https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2
RUN
apt-get
install
-y
libssl-dev libffi-dev
RUN
pip
install
certifi urllib3[secure]
# TODO(qijun) The template library Eigen doesn't work well with GCC 5
# coming with the default Docker image, so we switch to use GCC 4.8
# by default. And I will check Eigen library later.
RUN
ln
-sf
gcc-4.8 /usr/bin/gcc
&&
\
ln
-sf
gcc-ar-4.8 /usr/bin/gcc-ar
&&
\
ln
-sf
gcc-nm-4.8 /usr/bin/gcc-nm
&&
\
ln
-sf
gcc-ranlib-4.8 /usr/bin/gcc-ranlib
&&
\
ln
-sf
gcc-4.8 /usr/bin/x86_64-linux-gnu-gcc
&&
\
ln
-sf
gcc-ar-4.8 /usr/bin/x86_64-linux-gnu-gcc-ar
&&
\
ln
-sf
gcc-nm-4.8 /usr/bin/x86_64-linux-gnu-gcc-nm
&&
\
ln
-sf
gcc-ranlib-4.8 /usr/bin/x86_64-linux-gnu-gcc-ranlib
&&
\
ln
-sf
g++-4.8 /usr/bin/g++
&&
\
ln
-sf
g++-4.8 /usr/bin/x86_64-linux-gnu-g++
# Install woboq_codebrowser to /woboq
RUN
git clone https://github.com/woboq/woboq_codebrowser /woboq
&&
\
(
cd
/woboq
\
...
...
cmake/configure.cmake
浏览文件 @
33f21d05
...
...
@@ -129,7 +129,7 @@ if(WITH_GOLANG)
add_custom_command
(
OUTPUT
${
CMAKE_BINARY_DIR
}
/glide
COMMAND env GOPATH=
${
GOPATH
}
${
GLIDE
}
install
COMMAND touch
${
CMAKE_BINARY_DIR
}
/glide
DEPENDS
${
P
ROJ_ROOT
}
/go/glide.lock
DEPENDS
${
P
ADDLE_SOURCE_DIR
}
/go/glide.lock
WORKING_DIRECTORY
"
${
PADDLE_IN_GOPATH
}
/go"
)
...
...
cmake/cpplint.cmake
浏览文件 @
33f21d05
...
...
@@ -52,7 +52,7 @@ macro(add_style_check_target TARGET_NAME)
if
(
SOURCES_LIST
)
add_custom_command
(
TARGET
${
TARGET_NAME
}
POST_BUILD
COMMAND
"
${
PYTHON_EXECUTABLE
}
"
"
${
P
ROJ_ROOT
}
/paddle/scripts/cpplint.py"
COMMAND
"
${
PYTHON_EXECUTABLE
}
"
"
${
P
ADDLE_SOURCE_DIR
}
/paddle/scripts/cpplint.py"
"--filter=
${
STYLE_FILTER
}
"
${
SOURCES_LIST
}
COMMENT
"cpplint: Checking source code style"
...
...
cmake/flags.cmake
浏览文件 @
33f21d05
...
...
@@ -9,10 +9,12 @@ function(CheckCompilerCXX11Flag)
if
(
${
CMAKE_CXX_COMPILER_VERSION
}
VERSION_LESS 4.8
)
message
(
FATAL_ERROR
"Unsupported GCC version. GCC >= 4.8 required."
)
endif
()
# TODO(qijun) gcc 4.9 or later versions raise SEGV due to the optimization problem.
# Use Debug mode instead for now.
if
(
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.9
)
set
(
CMAKE_BUILD_TYPE
"Debug"
CACHE STRING
""
FORCE
)
if
(
NOT ANDROID
)
# TODO(qijun) gcc 4.9 or later versions raise SEGV due to the optimization problem.
# Use Debug mode instead for now.
if
(
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.9
)
set
(
CMAKE_BUILD_TYPE
"Debug"
CACHE STRING
""
FORCE
)
endif
()
endif
()
elseif
(
CMAKE_CXX_COMPILER_ID STREQUAL
"AppleClang"
OR CMAKE_CXX_COMPILER_ID STREQUAL
"Clang"
)
# cmake >= 3.0 compiler id "AppleClang" on Mac OS X, otherwise "Clang"
...
...
cmake/generic.cmake
浏览文件 @
33f21d05
...
...
@@ -411,7 +411,7 @@ function(py_test TARGET_NAME)
set
(
multiValueArgs SRCS DEPS
)
cmake_parse_arguments
(
py_test
"
${
options
}
"
"
${
oneValueArgs
}
"
"
${
multiValueArgs
}
"
${
ARGN
}
)
add_test
(
NAME
${
TARGET_NAME
}
COMMAND env PYTHONPATH=
${
PADDLE_PYTHON_
PACKAGE_DIR
}
COMMAND env PYTHONPATH=
${
PADDLE_PYTHON_
BUILD_DIR
}
/lib-python
python2
${
py_test_SRCS
}
WORKING_DIRECTORY
${
CMAKE_CURRENT_SOURCE_DIR
}
)
endif
()
...
...
cmake/package.cmake
浏览文件 @
33f21d05
...
...
@@ -12,7 +12,7 @@ set(CPACK_PACKAGE_DESCRIPTION "")
set
(
CPACK_DEBIAN_PACKAGE_DEPENDS
"libpython2.7-dev, libstdc++6, python-pip, curl, libgfortran3, python-pip-whl"
)
set
(
CPACK_DEBIAN_PACKAGE_SECTION Devel
)
set
(
CPACK_DEBIAN_PACKAGE_VERSION
${
PADDLE_VERSION
}
)
set
(
CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
"
${
P
ROJ_ROOT
}
/paddle/scripts/deb/postinst"
)
set
(
CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
"
${
P
ADDLE_SOURCE_DIR
}
/paddle/scripts/deb/postinst"
)
#set(CPACK_GENERATOR "DEB")
# Start cpack
include
(
CMakePackageConfigHelpers
)
...
...
cmake/util.cmake
浏览文件 @
33f21d05
...
...
@@ -141,8 +141,8 @@ endmacro()
function
(
create_resources res_file output_file
)
add_custom_command
(
OUTPUT
${
output_file
}
COMMAND python ARGS
${
P
ROJ_ROOT
}
/cmake/make_resource.py
${
res_file
}
${
output_file
}
DEPENDS
${
res_file
}
${
P
ROJ_ROOT
}
/cmake/make_resource.py
)
COMMAND python ARGS
${
P
ADDLE_SOURCE_DIR
}
/cmake/make_resource.py
${
res_file
}
${
output_file
}
DEPENDS
${
res_file
}
${
P
ADDLE_SOURCE_DIR
}
/cmake/make_resource.py
)
endfunction
()
...
...
cmake/version.cmake
浏览文件 @
33f21d05
...
...
@@ -4,7 +4,7 @@ set(tmp_version "HEAD")
while
(
"
${
PADDLE_VERSION
}
"
STREQUAL
""
)
execute_process
(
COMMAND
${
GIT_EXECUTABLE
}
describe --tags --abbrev=0
${
tmp_version
}
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
OUTPUT_VARIABLE GIT_TAG_NAME
RESULT_VARIABLE GIT_RESULT
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
...
...
doc/templates/conf.py.cn.in
浏览文件 @
33f21d05
...
...
@@ -13,7 +13,7 @@
# serve to show the default.
import sys
import os, subprocess
sys.path.insert(0, os.path.abspath('@P
ROJ_ROOT
@/python'))
sys.path.insert(0, os.path.abspath('@P
ADDLE_SOURCE_DIR
@/python'))
import shlex
from recommonmark import parser, transform
import paddle
...
...
@@ -24,7 +24,7 @@ AutoStructify = transform.AutoStructify
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
templates_path = ["@P
ROJ_ROOT
@/doc_theme/templates"]
templates_path = ["@P
ADDLE_SOURCE_DIR
@/doc_theme/templates"]
# -- General configuration ------------------------------------------------
...
...
@@ -120,7 +120,7 @@ html_theme = 'sphinx_rtd_theme'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['@P
ROJ_ROOT
@/doc_theme/static']
html_static_path = ['@P
ADDLE_SOURCE_DIR
@/doc_theme/static']
# Output file base name for HTML help builder.
htmlhelp_basename = project + 'doc'
...
...
doc/templates/conf.py.en.in
浏览文件 @
33f21d05
...
...
@@ -13,7 +13,7 @@
# serve to show the default.
import sys
import os, subprocess
sys.path.insert(0, os.path.abspath('@P
ROJ_ROOT
@/python'))
sys.path.insert(0, os.path.abspath('@P
ADDLE_SOURCE_DIR
@/python'))
import shlex
from recommonmark import parser, transform
import paddle
...
...
@@ -25,7 +25,7 @@ AutoStructify = transform.AutoStructify
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
templates_path = ["@P
ROJ_ROOT
@/doc_theme/templates"]
templates_path = ["@P
ADDLE_SOURCE_DIR
@/doc_theme/templates"]
# -- General configuration ------------------------------------------------
...
...
@@ -120,7 +120,7 @@ html_theme = 'sphinx_rtd_theme'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['@P
ROJ_ROOT
@/doc_theme/static']
html_static_path = ['@P
ADDLE_SOURCE_DIR
@/doc_theme/static']
# Output file base name for HTML help builder.
htmlhelp_basename = project + 'doc'
...
...
go/pserver/client/c/test/test_train.py
浏览文件 @
33f21d05
...
...
@@ -17,12 +17,10 @@ def main():
# network config
x
=
paddle
.
layer
.
data
(
name
=
'x'
,
type
=
paddle
.
data_type
.
dense_vector
(
13
))
y_predict
=
paddle
.
layer
.
fc
(
input
=
x
,
param_attr
=
paddle
.
attr
.
Param
(
name
=
'w'
,
learning_rate
=
1e-3
),
param_attr
=
paddle
.
attr
.
Param
(
name
=
'w'
),
size
=
1
,
act
=
paddle
.
activation
.
Linear
(),
bias_attr
=
paddle
.
attr
.
Param
(
name
=
'b'
,
learning_rate
=
1e-3
))
bias_attr
=
paddle
.
attr
.
Param
(
name
=
'b'
))
y
=
paddle
.
layer
.
data
(
name
=
'y'
,
type
=
paddle
.
data_type
.
dense_vector
(
1
))
cost
=
paddle
.
layer
.
mse_cost
(
input
=
y_predict
,
label
=
y
)
...
...
paddle/api/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -19,9 +19,9 @@ add_library(paddle_api STATIC ${API_SOURCES})
add_dependencies
(
paddle_api paddle_proto paddle_trainer_lib
)
INCLUDE
(
${
SWIG_USE_FILE
}
)
INCLUDE_DIRECTORIES
(
${
P
ROJ_ROOT
}
/paddle
)
INCLUDE_DIRECTORIES
(
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
FILE
(
GLOB PY_PADDLE_PYTHON_FILES
${
P
ROJ_ROOT
}
/paddle/py_paddle/*.py
)
FILE
(
GLOB PY_PADDLE_PYTHON_FILES
${
P
ADDLE_SOURCE_DIR
}
/paddle/py_paddle/*.py
)
SET_SOURCE_FILES_PROPERTIES
(
Paddle.i PROPERTIES CPLUSPLUS ON
)
...
...
@@ -79,16 +79,16 @@ SWIG_LINK_LIBRARIES(swig_paddle
${
START_END
}
)
add_custom_command
(
OUTPUT
${
P
ROJ_ROOT
}
/paddle/py_paddle/_swig_paddle.so
COMMAND cp
${
CMAKE_CURRENT_BINARY_DIR
}
/swig_paddle.py
${
P
ROJ_ROOT
}
/paddle/py_paddle
COMMAND cp
${
CMAKE_CURRENT_BINARY_DIR
}
/_swig_paddle.so
${
P
ROJ_ROOT
}
/paddle/py_paddle
add_custom_command
(
OUTPUT
${
P
ADDLE_SOURCE_DIR
}
/paddle/py_paddle/_swig_paddle.so
COMMAND cp
${
CMAKE_CURRENT_BINARY_DIR
}
/swig_paddle.py
${
P
ADDLE_SOURCE_DIR
}
/paddle/py_paddle
COMMAND cp
${
CMAKE_CURRENT_BINARY_DIR
}
/_swig_paddle.so
${
P
ADDLE_SOURCE_DIR
}
/paddle/py_paddle
COMMAND
${
CMAKE_COMMAND
}
-E touch .timestamp
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
DEPENDS _swig_paddle
)
# TODO(yuyang18) : make wheel name calculated by cmake
add_custom_target
(
python_api_wheel ALL DEPENDS
${
P
ROJ_ROOT
}
/paddle/py_paddle/_swig_paddle.so
)
add_custom_target
(
python_api_wheel ALL DEPENDS
${
P
ADDLE_SOURCE_DIR
}
/paddle/py_paddle/_swig_paddle.so
)
if
(
WITH_TESTING
)
IF
(
NOT PY_PIP_FOUND
)
...
...
paddle/api/ParameterUpdater.cpp
浏览文件 @
33f21d05
...
...
@@ -41,7 +41,7 @@ ParameterUpdater *ParameterUpdater::createNewRemoteUpdater(
config
->
m
->
getConfig
(),
pserverSpec
,
useEtcd
));
return
updater
;
#else
throw
UnsupportError
();
throw
UnsupportError
(
"not compiled with WITH_GOLANG"
);
#endif
}
...
...
paddle/capi/Arguments.cpp
浏览文件 @
33f21d05
...
...
@@ -90,6 +90,18 @@ paddle_error paddle_arguments_set_ids(paddle_arguments args,
return
kPD_NO_ERROR
;
}
paddle_error
paddle_arguments_set_frame_shape
(
paddle_arguments
args
,
uint64_t
ID
,
uint64_t
frameHeight
,
uint64_t
frameWidth
)
{
if
(
args
==
nullptr
)
return
kPD_NULLPTR
;
auto
a
=
castArg
(
args
);
if
(
ID
>=
a
->
args
.
size
())
return
kPD_OUT_OF_RANGE
;
a
->
args
[
ID
].
setFrameHeight
(
frameHeight
);
a
->
args
[
ID
].
setFrameWidth
(
frameWidth
);
return
kPD_NO_ERROR
;
}
paddle_error
paddle_arguments_set_sequence_start_pos
(
paddle_arguments
args
,
uint64_t
ID
,
uint32_t
nestedLevel
,
...
...
paddle/capi/arguments.h
浏览文件 @
33f21d05
...
...
@@ -111,6 +111,20 @@ PD_API paddle_error paddle_arguments_set_ids(paddle_arguments args,
uint64_t
ID
,
paddle_ivector
ids
);
/**
* @brief paddle_arguments_set_frame_shape Set the fram size of one argument
* in array, which index is `ID`.
* @param [in] args arguments array
* @param [in] ID array index
* @param [in] frameHeight maximum height of input images
* @param [in] frameWidth maximum width of input images
* @return paddle_error
*/
PD_API
paddle_error
paddle_arguments_set_frame_shape
(
paddle_arguments
args
,
uint64_t
ID
,
uint64_t
frameHeight
,
uint64_t
frameWidth
);
/**
* @brief PDArgsSetSequenceStartPos Set sequence start position vector of one
* argument in array, which index is `ID`.
...
...
paddle/capi/examples/model_inference/common/common.h
浏览文件 @
33f21d05
...
...
@@ -3,18 +3,21 @@
#include <stdio.h>
#include <stdlib.h>
#define CHECK(stmt) \
do { \
paddle_error __err__ = stmt; \
if (__err__ != kPD_NO_ERROR) { \
fprintf(stderr, "Invoke paddle error %d
\n" #stmt
, __err__); \
exit(__err__); \
} \
#define CHECK(stmt)
\
do {
\
paddle_error __err__ = stmt;
\
if (__err__ != kPD_NO_ERROR) {
\
fprintf(stderr, "Invoke paddle error %d
in " #stmt "\n"
, __err__); \
exit(__err__);
\
}
\
} while (0)
void
*
read_config
(
const
char
*
filename
,
long
*
size
)
{
FILE
*
file
=
fopen
(
filename
,
"r"
);
if
(
file
==
NULL
)
return
NULL
;
if
(
file
==
NULL
)
{
fprintf
(
stderr
,
"Open %s error
\n
"
,
filename
);
return
NULL
;
}
fseek
(
file
,
0L
,
SEEK_END
);
*
size
=
ftell
(
file
);
fseek
(
file
,
0L
,
SEEK_SET
);
...
...
paddle/capi/gradient_machine.cpp
浏览文件 @
33f21d05
...
...
@@ -54,6 +54,31 @@ paddle_error paddle_gradient_machine_create_for_inference(
return
kPD_NO_ERROR
;
}
paddle_error
paddle_gradient_machine_create_for_inference_with_parameters
(
paddle_gradient_machine
*
machine
,
void
*
mergedModel
,
uint64_t
size
)
{
if
(
mergedModel
==
nullptr
)
return
kPD_NULLPTR
;
std
::
istringstream
is
(
std
::
string
(
static_cast
<
char
*>
(
mergedModel
),
size
));
int64_t
modelConfigSize
=
0
;
is
.
read
((
char
*
)(
&
modelConfigSize
),
sizeof
(
modelConfigSize
));
std
::
string
modelConfigProtobuf
;
modelConfigProtobuf
.
resize
(
modelConfigSize
);
is
.
read
(
&
modelConfigProtobuf
[
0
],
modelConfigSize
);
paddle
::
TrainerConfig
config
;
if
(
!
config
.
ParseFromString
(
modelConfigProtobuf
)
||
!
config
.
IsInitialized
())
{
return
kPD_PROTOBUF_ERROR
;
}
auto
ptr
=
new
paddle
::
capi
::
CGradientMachine
();
ptr
->
machine
.
reset
(
paddle
::
GradientMachine
::
create
(
config
.
model_config
(),
CREATE_MODE_TESTING
,
{
paddle
::
PARAMETER_VALUE
}));
std
::
vector
<
paddle
::
ParameterPtr
>&
parameters
=
ptr
->
machine
->
getParameters
();
for
(
auto
&
para
:
parameters
)
{
para
->
load
(
is
);
}
*
machine
=
ptr
;
return
kPD_NO_ERROR
;
}
paddle_error
paddle_gradient_machine_destroy
(
paddle_gradient_machine
machine
)
{
delete
cast
(
machine
);
return
kPD_NO_ERROR
;
...
...
paddle/capi/gradient_machine.h
浏览文件 @
33f21d05
...
...
@@ -36,6 +36,18 @@ typedef void* paddle_gradient_machine;
PD_API
paddle_error
paddle_gradient_machine_create_for_inference
(
paddle_gradient_machine
*
machine
,
void
*
modelConfigProtobuf
,
int
size
);
/**
* @brief Create a gradient machine used for model inference, using config with
* parameters which is generated by `paddle merge_model`.
* @param [out] machine that used for model inference.
* @param [in] mergedModel
* @param [in] size
* @return paddle_error
*/
PD_API
paddle_error
paddle_gradient_machine_create_for_inference_with_parameters
(
paddle_gradient_machine
*
machine
,
void
*
mergedModel
,
uint64_t
size
);
/**
* @brief Load parameter from disk.
* @param machine Gradient Machine.
...
...
paddle/capi/tests/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -10,5 +10,5 @@ target_include_directories(capi_test_gradientMachine PUBLIC
${
PADDLE_CAPI_INC_PATH
}
)
target_link_libraries
(
capi_test_gradientMachine paddle_capi
)
add_test
(
NAME capi_test_gradientMachine
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/capi_test_gradientMachine
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/capi/tests
)
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/capi_test_gradientMachine
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/capi/tests
)
paddle/framework/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -35,6 +35,11 @@ py_proto_compile(framework_py_proto SRCS attribute.proto op_proto.proto op_desc.
# Generate an empty __init__.py to make framework_py_proto as a valid python module.
add_custom_target
(
framework_py_proto_init ALL COMMAND
${
CMAKE_COMMAND
}
-E touch __init__.py
)
add_dependencies
(
framework_py_proto framework_py_proto_init
)
add_custom_command
(
TARGET framework_py_proto POST_BUILD
COMMAND
${
CMAKE_COMMAND
}
-E make_directory
${
PROJ_ROOT
}
/python/paddle/v2/framework/proto
COMMAND cp *.py
${
PROJ_ROOT
}
/python/paddle/v2/framework/proto/
COMMENT
"Copy generated python proto into directory paddle/v2/framework/proto."
WORKING_DIRECTORY
${
CMAKE_CURRENT_BINARY_DIR
}
)
cc_library
(
backward SRCS backward.cc DEPS net_op
)
cc_test
(
backward_test SRCS backward_test.cc DEPS backward
)
...
...
paddle/framework/attribute.h
浏览文件 @
33f21d05
...
...
@@ -14,7 +14,6 @@ limitations under the License. */
#pragma once
#include <boost/variant.hpp>
#include <functional>
#include <string>
#include <unordered_map>
...
...
@@ -24,6 +23,7 @@ limitations under the License. */
#include "paddle/framework/attribute.pb.h"
#include "paddle/framework/op_desc.pb.h"
#include "paddle/platform/enforce.h"
#include "paddle/platform/variant.h"
namespace
paddle
{
namespace
framework
{
...
...
paddle/framework/ddim.h
浏览文件 @
33f21d05
...
...
@@ -14,12 +14,12 @@ limitations under the License. */
#pragma once
#include <boost/variant.hpp>
#include <initializer_list>
#include <stdexcept>
#include <vector>
#include "paddle/framework/dim.h"
#include "paddle/platform/enforce.h"
#include "paddle/platform/variant.h"
#include "unsupported/Eigen/CXX11/Tensor"
namespace
paddle
{
...
...
paddle/framework/operator.h
浏览文件 @
33f21d05
...
...
@@ -15,7 +15,6 @@ limitations under the License. */
#pragma once
#include <algorithm>
#include <boost/variant.hpp>
#include <string>
#include <unordered_map>
#include <vector>
...
...
@@ -27,6 +26,7 @@ limitations under the License. */
#include "paddle/framework/tensor.h"
#include "paddle/platform/device_context.h"
#include "paddle/platform/place.h"
#include "paddle/platform/variant.h"
#include "paddle/utils/Error.h"
namespace
paddle
{
...
...
paddle/framework/tensor.h
浏览文件 @
33f21d05
...
...
@@ -79,11 +79,11 @@ class Tensor {
inline
const
DDim
&
dims
()
const
;
/*! Resize the dimensions of the memory block. */
inline
void
Resize
(
const
DDim
&
dims
);
inline
Tensor
&
Resize
(
const
DDim
&
dims
);
/*! The internal of two tensors share the same memory block. */
template
<
typename
T
>
inline
void
ShareDataWith
(
const
Tensor
&
src
);
inline
Tensor
&
ShareDataWith
(
const
Tensor
&
src
);
/**
* @brief Copy the content of external tensor to a new place.
...
...
paddle/framework/tensor_impl.h
浏览文件 @
33f21d05
...
...
@@ -23,9 +23,11 @@ template <typename T>
inline
void
Tensor
::
check_memory_size
()
const
{
PADDLE_ENFORCE_NOT_NULL
(
holder_
,
"Tenosr holds no memory. Call Tensor::mutable_data first."
);
PADDLE_ENFORCE_GE
(
holder_
->
size
(),
product
(
dims_
)
*
sizeof
(
T
)
+
offset_
,
"Tensor's dims_ is out of bound. Call Tensor::mutable_data "
"first to re-allocate memory."
);
PADDLE_ENFORCE_GE
(
holder_
->
size
(),
product
(
dims_
)
*
sizeof
(
T
)
+
offset_
,
"Tensor's dims_ is out of bound. Call Tensor::mutable_data "
"first to re-allocate memory.
\n
"
"or maybe the required data-type mismatches the data already stored."
);
}
template
<
typename
T
>
...
...
@@ -78,9 +80,10 @@ inline T* Tensor::mutable_data(platform::Place place) {
}
template
<
typename
T
>
inline
void
Tensor
::
ShareDataWith
(
const
Tensor
&
src
)
{
inline
Tensor
&
Tensor
::
ShareDataWith
(
const
Tensor
&
src
)
{
src
.
check_memory_size
<
T
>
();
*
this
=
src
;
return
*
this
;
}
template
<
typename
T
>
...
...
@@ -136,7 +139,10 @@ inline Tensor Tensor::Slice(const int& begin_idx, const int& end_idx) const {
return
dst
;
}
inline
void
Tensor
::
Resize
(
const
DDim
&
dims
)
{
dims_
=
dims
;
}
inline
Tensor
&
Tensor
::
Resize
(
const
DDim
&
dims
)
{
dims_
=
dims
;
return
*
this
;
}
inline
const
DDim
&
Tensor
::
dims
()
const
{
return
dims_
;
}
...
...
paddle/gserver/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -23,6 +23,17 @@ endmacro()
filter_test
(
GSERVER_HEADER
)
filter_test
(
GSERVER_SOURCES
)
if
(
NOT WITH_MKLDNN
)
file
(
GLOB_RECURSE DNN_HEADER RELATIVE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
"
"MKLDNN*.h"
)
file
(
GLOB_RECURSE DNN_SOURCES RELATIVE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
"
"MKLDNN*.cpp"
)
list
(
REMOVE_ITEM GSERVER_HEADER
${
DNN_HEADER
}
)
list
(
REMOVE_ITEM GSERVER_SOURCES
${
DNN_SOURCES
}
)
message
(
STATUS
"Skip compiling with MKLDNNLayers and MKLDNNActivations"
)
else
()
message
(
STATUS
"Compile with MKLDNNLayers and MKLDNNActivations"
)
endif
()
if
(
NOT WITH_GPU
)
list
(
REMOVE_ITEM GSERVER_HEADER
layers/CudnnConvBaseLayer.h
...
...
paddle/gserver/layers/MKLDNNBase.h
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2017 PaddlePaddle Authors. All Rights Reserve.
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. */
#pragma once
#include "mkldnn.hpp"
namespace
paddle
{
typedef
enum
{
MKLDNN_BASE
=
1
,
// basical info of MKLDNN
MKLDNN_TESTS
=
1
,
// gtest info of MKLDNN
MKLDNN_SIZES
=
2
,
// size info of MKLDNN
MKLDNN_FMTS
=
3
,
// format info of MKLDNN
MKLDNN_ALL
=
4
,
// show all info of MKLDNN
}
MKLDNN_LOG_LEVEL
;
/**
* @brief MKLDNN CPU engine.
*
*/
class
CPUEngine
{
public:
static
CPUEngine
&
Instance
()
{
// Thread-safe in C++11.
static
CPUEngine
myInstance
;
return
myInstance
;
}
// Disallow copy or move
CPUEngine
(
const
CPUEngine
&
)
=
delete
;
// Copy constructor
CPUEngine
(
CPUEngine
&&
)
=
delete
;
// Move constructor
CPUEngine
&
operator
=
(
const
CPUEngine
&
)
=
delete
;
// Copy assignment
CPUEngine
&
operator
=
(
CPUEngine
&&
)
=
delete
;
// Move assignment
mkldnn
::
engine
&
getEngine
()
{
return
cpuEngine_
;
}
protected:
CPUEngine
()
:
cpuEngine_
(
mkldnn
::
engine
::
cpu
,
0
)
{}
// CPUEngine() : cpuEngine_(mkldnn::engine::cpu_lazy, 0) {}
~
CPUEngine
()
{}
private:
mkldnn
::
engine
cpuEngine_
;
};
/**
* @brief MKLDNN Stream.
*
*/
class
MKLDNNStream
{
public:
MKLDNNStream
()
:
ready_
(
false
)
{
resetState
();
}
virtual
~
MKLDNNStream
()
{}
/**
* @brief Submit stream
* @param prims The primitives vector
* @param block Waiting for the stream to complete
*/
void
submit
(
std
::
vector
<
mkldnn
::
primitive
>&
prims
,
bool
block
=
true
)
{
resetState
();
stream_
->
submit
(
prims
).
wait
(
block
);
ready_
=
false
;
}
/**
* @brief Reset the mkldnn stream
*/
void
resetState
()
{
if
(
ready_
)
{
return
;
}
// TODO(TJ): change me when mkldnn have method to reset this state
// stream_.reset(new mkldnn::stream(mkldnn::stream::kind::lazy));
stream_
.
reset
(
new
mkldnn
::
stream
(
mkldnn
::
stream
::
kind
::
eager
));
ready_
=
true
;
}
private:
bool
ready_
;
std
::
shared_ptr
<
mkldnn
::
stream
>
stream_
;
};
}
// namespace paddle
paddle/gserver/layers/MKLDNNFcLayer.cpp
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2017 PaddlePaddle Authors. All Rights Reserve.
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. */
#include "MKLDNNFcLayer.h"
#include "paddle/utils/Logging.h"
#include "paddle/utils/Stat.h"
using
namespace
mkldnn
;
// NOLINT
typedef
memory
::
format
format
;
typedef
inner_product_forward
fc_fwd
;
typedef
inner_product_backward_weights
fc_bwdWgt
;
typedef
inner_product_backward_data
fc_bwdData
;
namespace
paddle
{
REGISTER_LAYER
(
mkldnn_fc
,
MKLDNNFcLayer
);
bool
MKLDNNFcLayer
::
init
(
const
LayerMap
&
layerMap
,
const
ParameterMap
&
parameterMap
)
{
if
(
!
MKLDNNLayer
::
init
(
layerMap
,
parameterMap
))
{
return
false
;
}
CHECK_EQ
(
inputLayers_
.
size
(),
1
)
<<
"Only support one input layer yet"
;
CHECK_EQ
(
inputLayers_
.
size
(),
parameters_
.
size
());
CHECK
(
!
parameters_
[
0
]
->
isSparse
())
<<
"Do not support sparse yet"
;
// output size, cat not be changed
oc_
=
getSize
();
oh_
=
1
;
ow_
=
1
;
// input size can not change in FC
iLayerSize_
=
inputLayers_
[
0
]
->
getSize
();
CHECK_EQ
(
parameters_
[
0
]
->
getSize
(),
iLayerSize_
*
oc_
);
// create weight
weight_
=
std
::
unique_ptr
<
Weight
>
(
new
Weight
(
oc_
,
iLayerSize_
,
parameters_
[
0
],
0
));
// create biases
if
(
biasParameter_
.
get
()
!=
NULL
)
{
biases_
=
std
::
unique_ptr
<
Weight
>
(
new
Weight
(
1
,
oc_
,
biasParameter_
));
}
return
true
;
}
void
MKLDNNFcLayer
::
convertWeightsFromPaddle
()
{
if
(
FLAGS_use_mkldnn_wgt
)
{
return
;
}
if
(
hasInitedWgt_
)
{
return
;
}
// The weight_ is transposed from initial paddle weight
MatrixPtr
paddleWgt
=
Matrix
::
create
(
weight_
->
getW
()
->
getData
(),
iLayerSize_
,
oc_
,
false
,
false
);
// TODO(TJ): remove this print when do not need differ weights
std
::
ostringstream
ostr
;
paddleWgt
->
print
(
ostr
);
VLOG
(
MKLDNN_ALL
)
<<
"Initial Weight from paddle: "
<<
std
::
endl
<<
ostr
.
str
();
// The mkldnn weight is transposed from initial paddle matrix
MatrixPtr
paddleWgtT
;
paddleWgt
->
transpose
(
paddleWgtT
,
true
);
weight_
->
getW
()
->
copyFrom
(
*
paddleWgtT
);
hasInitedWgt_
=
true
;
}
void
MKLDNNFcLayer
::
convertWeightsToPaddle
()
{
MatrixPtr
dnnWgt
=
weight_
->
getW
();
MatrixPtr
paddleWgt
;
dnnWgt
->
transpose
(
paddleWgt
,
true
);
// copy paddle weight and override on weight_
MatrixPtr
dnnWgtT
=
Matrix
::
create
(
dnnWgt
->
getData
(),
dnnWgt
->
getWidth
(),
dnnWgt
->
getHeight
(),
false
,
false
);
dnnWgtT
->
copyFrom
(
*
paddleWgt
);
}
void
MKLDNNFcLayer
::
reshape
()
{
const
Argument
&
input
=
getInput
(
0
);
int
batchSize
=
input
.
getBatchSize
();
if
(
bs_
==
batchSize
)
{
return
;
}
bs_
=
batchSize
;
ih_
=
input
.
getFrameHeight
();
iw_
=
input
.
getFrameWidth
();
if
(
ih_
==
0
)
{
ih_
=
1
;
}
if
(
iw_
==
0
)
{
iw_
=
1
;
}
hasSpatial_
=
true
;
if
(
ih_
==
1
&&
iw_
==
1
)
{
hasSpatial_
=
false
;
}
CHECK_EQ
(
iLayerSize_
,
inputLayers_
[
0
]
->
getSize
());
ic_
=
iLayerSize_
/
(
ih_
*
iw_
);
CHECK_EQ
(
size_t
(
ic_
*
ih_
*
iw_
),
iLayerSize_
)
<<
"not divisible"
;
CHECK_EQ
(
size_t
(
oc_
),
getSize
());
printSizeInfo
();
// reset output
output_
.
setFrameHeight
(
oh_
);
output_
.
setFrameWidth
(
ow_
);
resetOutput
(
bs_
,
oc_
);
// reset mkldnn forward
resetFwd
();
needResetBwd_
=
true
;
convertWeightsFromPaddle
();
}
void
MKLDNNFcLayer
::
resetFwd
()
{
bool
hasBias
=
biases_
&&
biases_
->
getW
();
real
*
iData
=
getInputValue
(
0
)
->
getData
();
real
*
oData
=
getOutputValue
()
->
getData
();
real
*
wData
=
weight_
->
getW
()
->
getData
();
real
*
bData
=
hasBias
?
biases_
->
getW
()
->
getData
()
:
NULL
;
// TODO(TJ): below create should be covered in MkldnnMatrix
// create memory desc
memory
::
desc
iMD
=
hasSpatial_
?
createMD
({
bs_
,
ic_
,
ih_
,
iw_
},
format
::
nchw
)
:
createMD
({
bs_
,
ic_
},
format
::
nc
);
memory
::
desc
wMD
=
hasSpatial_
?
createMD
({
oc_
,
ic_
,
ih_
,
iw_
},
format
::
oihw
)
:
createMD
({
oc_
,
ic_
},
format
::
oi
);
memory
::
desc
bMD
=
bData
!=
NULL
?
createMD
({
oc_
},
format
::
x
)
:
createMD
({},
format
::
format_undef
);
memory
::
desc
oMD
=
createMD
({
bs_
,
oc_
},
format
::
nc
);
// create memory primitive desc and memory self
inVal_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
iMD
,
engine_
),
iData
));
wgtVal_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
wMD
,
engine_
),
wData
));
outVal_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
oMD
,
engine_
),
oData
));
prop_kind
pk
=
prop_kind
::
forward
;
fc_fwd
::
desc
fwdDesc
=
bData
!=
NULL
?
fc_fwd
::
desc
(
pk
,
iMD
,
wMD
,
bMD
,
oMD
)
:
fc_fwd
::
desc
(
pk
,
iMD
,
wMD
,
oMD
);
fc_fwd
::
primitive_desc
fwdPD
=
fc_fwd
::
primitive_desc
(
fwdDesc
,
engine_
);
if
(
bData
!=
NULL
)
{
biasVal_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
bMD
,
engine_
),
bData
));
fwd_
.
reset
(
new
fc_fwd
(
fwdPD
,
*
inVal_
,
*
wgtVal_
,
*
biasVal_
,
*
outVal_
));
}
else
{
fwd_
.
reset
(
new
fc_fwd
(
fwdPD
,
*
inVal_
,
*
wgtVal_
,
*
outVal_
));
}
pipelineFwd_
.
clear
();
pipelineFwd_
.
push_back
(
*
fwd_
);
}
void
MKLDNNFcLayer
::
resetBwd
()
{
if
(
!
needResetBwd_
)
{
return
;
}
needResetBwd_
=
false
;
bool
hasBias
=
biases_
&&
biases_
->
getWGrad
();
real
*
iData
=
getInputValue
(
0
)
->
getData
();
real
*
iDiff
=
getInputGrad
(
0
)
!=
nullptr
?
getInputGrad
(
0
)
->
getData
()
:
NULL
;
real
*
oDiff
=
getOutputGrad
()
->
getData
();
real
*
wDiff
=
weight_
->
getWGrad
()
->
getData
();
real
*
bDiff
=
hasBias
?
biases_
->
getWGrad
()
->
getData
()
:
NULL
;
/// backward weight
// create memory desc for backward memory
memory
::
desc
iMD
=
hasSpatial_
?
createMD
({
bs_
,
ic_
,
ih_
,
iw_
},
format
::
nchw
)
:
createMD
({
bs_
,
ic_
},
format
::
nc
);
memory
::
desc
wMD
=
hasSpatial_
?
createMD
({
oc_
,
ic_
,
ih_
,
iw_
},
format
::
oihw
)
:
createMD
({
oc_
,
ic_
},
format
::
oi
);
memory
::
desc
oMD
=
createMD
({
bs_
,
oc_
},
format
::
nc
);
memory
::
desc
bMD
=
bDiff
!=
NULL
?
createMD
({
oc_
},
format
::
x
)
:
createMD
({},
format
::
format_undef
);
if
(
inVal_
)
{
// update data
inVal_
->
set_data_handle
(
iData
);
}
else
{
inVal_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
iMD
,
engine_
),
iData
));
}
// create memory primitive desc and memory self
wgtGrad_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
wMD
,
engine_
),
wDiff
));
outGrad_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
oMD
,
engine_
),
oDiff
));
fc_fwd
::
desc
fwdDesc
=
fc_fwd
::
desc
(
prop_kind
::
forward
,
iMD
,
wMD
,
oMD
);
fc_fwd
::
primitive_desc
fwdPD
=
fc_fwd
::
primitive_desc
(
fwdDesc
,
engine_
);
fc_bwdWgt
::
desc
bwdWgtDesc
=
bDiff
!=
NULL
?
fc_bwdWgt
::
desc
(
iMD
,
wMD
,
bMD
,
oMD
)
:
fc_bwdWgt
::
desc
(
iMD
,
wMD
,
oMD
);
fc_bwdWgt
::
primitive_desc
bwdWgtPD
=
fc_bwdWgt
::
primitive_desc
(
bwdWgtDesc
,
engine_
,
fwdPD
);
if
(
bDiff
!=
NULL
)
{
biasGrad_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
bMD
,
engine_
),
bDiff
));
bwdWgt_
.
reset
(
new
fc_bwdWgt
(
bwdWgtPD
,
*
inVal_
,
*
outGrad_
,
*
wgtGrad_
,
*
biasGrad_
));
}
else
{
bwdWgt_
.
reset
(
new
fc_bwdWgt
(
bwdWgtPD
,
*
inVal_
,
*
outGrad_
,
*
wgtGrad_
));
}
pipelineBwd_
.
clear
();
pipelineBwd_
.
push_back
(
*
bwdWgt_
);
/// backward data
if
(
iDiff
==
NULL
)
{
return
;
}
fc_bwdData
::
desc
bwdDataDesc
=
fc_bwdData
::
desc
(
iMD
,
wMD
,
oMD
);
fc_bwdData
::
primitive_desc
bwdDataPD
=
fc_bwdData
::
primitive_desc
(
bwdDataDesc
,
engine_
,
fwdPD
);
inGrad_
.
reset
(
new
memory
(
memory
::
primitive_desc
(
iMD
,
engine_
),
iDiff
));
CHECK
(
wgtVal_
)
<<
"Should have weight memory"
;
bwdData_
.
reset
(
new
fc_bwdData
(
bwdDataPD
,
*
outGrad_
,
*
wgtVal_
,
*
inGrad_
));
pipelineBwd_
.
push_back
(
*
bwdData_
);
}
void
MKLDNNFcLayer
::
forward
(
PassType
passType
)
{
Layer
::
forward
(
passType
);
reshape
();
{
REGISTER_TIMER_INFO
(
"mkldnn_FwdTimer"
,
getName
().
c_str
());
// update input data
// since it might be changed if this is after data layer
real
*
iData
=
getInputValue
(
0
)
->
getData
();
inVal_
->
set_data_handle
(
iData
);
// just submit forward pipeline
stream_
->
submit
(
pipelineFwd_
);
}
/* activation */
{
REGISTER_TIMER_INFO
(
"FwActTimer"
,
getName
().
c_str
());
forwardActivation
();
}
}
void
MKLDNNFcLayer
::
backward
(
const
UpdateCallback
&
callback
)
{
/* Do derivation */
{
REGISTER_TIMER_INFO
(
"BpActTimer"
,
getName
().
c_str
());
backwardActivation
();
}
{
REGISTER_TIMER_INFO
(
"mkldnn_bwdTimer"
,
getName
().
c_str
());
resetBwd
();
// update diff
real
*
oDiff
=
getOutputGrad
()
->
getData
();
outGrad_
->
set_data_handle
(
oDiff
);
// just sumbmit backward pipeline
stream_
->
submit
(
pipelineBwd_
);
}
{
REGISTER_TIMER_INFO
(
"WeightUpdate"
,
getName
().
c_str
());
weight_
->
getParameterPtr
()
->
incUpdate
(
callback
);
if
(
biases_
&&
biases_
->
getWGrad
())
{
biases_
->
getParameterPtr
()
->
incUpdate
(
callback
);
}
}
}
}
// namespace paddle
paddle/gserver/layers/MKLDNNFcLayer.h
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2017 PaddlePaddle Authors. All Rights Reserve.
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. */
#pragma once
#include "MKLDNNLayer.h"
#include "mkldnn.hpp"
namespace
paddle
{
/**
* @brief A subclass of MKLDNNLayer fc layer.
*
* The config file api is mkldnn_fc
*/
class
MKLDNNFcLayer
:
public
MKLDNNLayer
{
protected:
// input layer size, can not be change after init
size_t
iLayerSize_
;
// == ic * ih * iw
// if has already init the weight
bool
hasInitedWgt_
;
// if input layer has image size info (ih>1 && iw>1)
bool
hasSpatial_
;
// fc weight and bias
std
::
unique_ptr
<
Weight
>
weight_
;
std
::
unique_ptr
<
Weight
>
biases_
;
public:
explicit
MKLDNNFcLayer
(
const
LayerConfig
&
config
)
:
MKLDNNLayer
(
config
),
hasInitedWgt_
(
false
),
hasSpatial_
(
true
)
{}
~
MKLDNNFcLayer
()
{}
bool
init
(
const
LayerMap
&
layerMap
,
const
ParameterMap
&
parameterMap
)
override
;
void
convertWeightsFromPaddle
()
override
;
void
convertWeightsToPaddle
()
override
;
void
forward
(
PassType
passType
)
override
;
void
backward
(
const
UpdateCallback
&
callback
)
override
;
protected:
/**
* reshape the input image sizes
* and reset output buffer size
* and reset mkldnn forward
*/
void
reshape
();
/**
* reset the forward primitve and memory
* only would be called when input size changes
*/
void
resetFwd
();
/**
* reset the backward primitve and memory for mkldnn fc
* only would be called when needed
*/
void
resetBwd
();
};
}
// namespace paddle
paddle/gserver/layers/MKLDNNLayer.h
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2017 PaddlePaddle Authors. All Rights Reserve.
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. */
#pragma once
#include <vector>
#include "Layer.h"
#include "MKLDNNBase.h"
#include "mkldnn.hpp"
DECLARE_bool
(
use_mkldnn
);
DECLARE_bool
(
use_mkldnn_wgt
);
namespace
paddle
{
class
MKLDNNLayer
;
typedef
std
::
shared_ptr
<
MKLDNNLayer
>
MKLDNNLayerPtr
;
/**
* @brief Base class of MKLDNNlayer.
*
*/
class
MKLDNNLayer
:
public
Layer
{
protected:
// batch size
int
bs_
;
// input image channel, height and width
int
ic_
,
ih_
,
iw_
;
// output image channel, height and width
int
oc_
,
oh_
,
ow_
;
// backward also need reset after reset forward handle
bool
needResetBwd_
;
// mkldnn engine, stream and primivtives
mkldnn
::
engine
engine_
;
std
::
shared_ptr
<
MKLDNNStream
>
stream_
;
std
::
shared_ptr
<
mkldnn
::
primitive
>
fwd_
;
std
::
shared_ptr
<
mkldnn
::
primitive
>
bwdWgt_
;
std
::
shared_ptr
<
mkldnn
::
primitive
>
bwdData_
;
std
::
vector
<
mkldnn
::
primitive
>
pipelineFwd_
;
std
::
vector
<
mkldnn
::
primitive
>
pipelineBwd_
;
// TODO(TJ): change below memory as MKLDNNMatrixPtr type
std
::
shared_ptr
<
mkldnn
::
memory
>
inVal_
;
std
::
shared_ptr
<
mkldnn
::
memory
>
inGrad_
;
std
::
shared_ptr
<
mkldnn
::
memory
>
outVal_
;
std
::
shared_ptr
<
mkldnn
::
memory
>
outGrad_
;
std
::
shared_ptr
<
mkldnn
::
memory
>
wgtVal_
;
std
::
shared_ptr
<
mkldnn
::
memory
>
wgtGrad_
;
std
::
shared_ptr
<
mkldnn
::
memory
>
biasVal_
;
std
::
shared_ptr
<
mkldnn
::
memory
>
biasGrad_
;
public:
explicit
MKLDNNLayer
(
const
LayerConfig
&
config
)
:
Layer
(
config
),
bs_
(
0
),
ic_
(
0
),
ih_
(
0
),
iw_
(
0
),
oc_
(
0
),
oh_
(
0
),
ow_
(
0
),
needResetBwd_
(
true
),
engine_
(
mkldnn
::
engine
::
cpu
,
0
),
stream_
(
nullptr
),
fwd_
(
nullptr
),
bwdWgt_
(
nullptr
),
bwdData_
(
nullptr
)
{}
~
MKLDNNLayer
()
{}
virtual
bool
init
(
const
LayerMap
&
layerMap
,
const
ParameterMap
&
parameterMap
)
{
if
(
!
Layer
::
init
(
layerMap
,
parameterMap
))
{
return
false
;
}
CHECK
(
FLAGS_use_mkldnn
)
<<
"MkldnnLayers only support use_mkldnn."
<<
"Please set WITH_MKLDNN=ON "
<<
"and set use_mkldnn=True"
;
stream_
.
reset
(
new
MKLDNNStream
());
engine_
=
CPUEngine
::
Instance
().
getEngine
();
// TODO(TJ): deivecId
return
true
;
}
/**
* convert weight from paddle format to mkldnn format
* weight_ will be override
*/
virtual
void
convertWeightsFromPaddle
()
{}
/**
* convert mkldnn weight to paddle format
* weight_ will be override
*/
virtual
void
convertWeightsToPaddle
()
{}
/**
* print info about sizes
*/
virtual
void
printSizeInfo
()
{
VLOG
(
MKLDNN_SIZES
)
<<
getName
()
<<
": bs: "
<<
bs_
<<
", ic: "
<<
ic_
<<
", ih: "
<<
ih_
<<
", iw: "
<<
iw_
<<
", oc: "
<<
oc_
<<
", oh: "
<<
oh_
<<
", ow: "
<<
ow_
;
}
// TODO(TJ): move to MkldnnMatrix
// create memory desc
inline
mkldnn
::
memory
::
desc
createMD
(
mkldnn
::
memory
::
dims
dims
,
mkldnn
::
memory
::
format
fmt
,
mkldnn
::
memory
::
data_type
type
=
mkldnn
::
memory
::
data_type
::
f32
)
{
// TODO(TJ): isFmtSuppoted(fmt)
return
mkldnn
::
memory
::
desc
(
dims
,
type
,
fmt
);
}
};
}
// namespace paddle
paddle/gserver/tests/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -9,7 +9,7 @@ add_unittest_without_exec(test_ProtoDataProvider
# mkdir will get error.
add_test
(
NAME test_ProtoDataProvider
COMMAND
${
CMAKE_CURRENT_BINARY_DIR
}
/test_ProtoDataProvider
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
################# test_LayerGrad #######################
add_unittest_without_exec
(
test_LayerGrad
...
...
@@ -18,6 +18,15 @@ add_unittest_without_exec(test_LayerGrad
add_test
(
NAME test_LayerGrad
COMMAND test_LayerGrad
)
########## test_Mkldnn layers and activations ##########
if
(
WITH_MKLDNN
)
add_unittest_without_exec
(
test_MKLDNN
test_MKLDNN.cpp
MKLDNNTester.cpp
LayerGradUtil.cpp
)
add_test
(
NAME test_MKLDNN COMMAND test_MKLDNN
)
endif
()
################ test_CRFLayerGrad ####################
add_unittest_without_exec
(
test_CRFLayerGrad
test_CRFLayerGrad.cpp
...
...
@@ -92,8 +101,8 @@ if(WITH_PYTHON)
test_PyDataProvider.cpp
)
add_test
(
NAME test_PyDataProvider
COMMAND .set_python_path.sh -d ./gserver/tests:
${
P
ROJ_ROOT
}
/python/
${
CMAKE_CURRENT_BINARY_DIR
}
/test_PyDataProvider
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
)
COMMAND .set_python_path.sh -d ./gserver/tests:
${
P
ADDLE_SOURCE_DIR
}
/python/
${
CMAKE_CURRENT_BINARY_DIR
}
/test_PyDataProvider
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
endif
()
############### test_RecurrentLayer #######################
...
...
@@ -106,7 +115,7 @@ if(NOT WITH_DOUBLE)
add_test
(
NAME test_WarpCTCLayer
COMMAND
${
CMAKE_CURRENT_BINARY_DIR
}
/test_WarpCTCLayer --warpctc_dir=
${
WARPCTC_LIB_DIR
}
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
endif
()
############### test_RecurrentGradientMachine ###############
...
...
@@ -116,20 +125,20 @@ add_unittest_without_exec(test_RecurrentGradientMachine
test_RecurrentGradientMachine.cpp
)
add_test
(
NAME test_RecurrentGradientMachine
COMMAND .set_python_path.sh -d
${
P
ROJ_ROOT
}
/python:
${
PROJ_ROOT
}
/paddle/gserver/tests
${
P
ADDLE_SOURCE_DIR
}
/python:
${
PADDLE_SOURCE_DIR
}
/paddle/gserver/tests
${
CMAKE_CURRENT_BINARY_DIR
}
/test_RecurrentGradientMachine
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
add_unittest_without_exec
(
test_NetworkCompare
test_NetworkCompare.cpp
)
if
(
WITH_GPU
)
add_test
(
NAME test_NetworkCompare
COMMAND .set_python_path.sh -d
${
P
ROJ_ROOT
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/test_NetworkCompare --use_gpu=true
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
)
COMMAND .set_python_path.sh -d
${
P
ADDLE_SOURCE_DIR
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/test_NetworkCompare --use_gpu=true
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
else
()
add_test
(
NAME test_NetworkCompare
COMMAND .set_python_path.sh -d
${
P
ROJ_ROOT
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/test_NetworkCompare --use_gpu=false
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
)
COMMAND .set_python_path.sh -d
${
P
ADDLE_SOURCE_DIR
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/test_NetworkCompare --use_gpu=false
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
endif
()
...
...
@@ -137,6 +146,6 @@ add_unittest_without_exec(test_PyDataProvider2
test_PyDataProvider2.cpp
)
add_test
(
NAME test_PyDataProvider2
COMMAND .set_python_path.sh -d
${
P
ROJ_ROOT
}
/paddle/gserver/tests:
${
PROJ_ROOT
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/test_PyDataProvider2
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle
COMMAND .set_python_path.sh -d
${
P
ADDLE_SOURCE_DIR
}
/paddle/gserver/tests:
${
PADDLE_SOURCE_DIR
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/test_PyDataProvider2
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle
)
paddle/gserver/tests/MKLDNNTester.cpp
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2017 PaddlePaddle Authors. All Rights Reserve.
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. */
#include "MKLDNNTester.h"
#include "paddle/gserver/layers/MKLDNNBase.h"
#include "paddle/gserver/layers/MKLDNNLayer.h"
namespace
paddle
{
// init data layer and test layer of both dnn and reference
void
MKLDNNTester
::
reset
(
const
TestConfig
&
dnn
,
const
TestConfig
&
ref
,
size_t
batchSize
)
{
const
bool
trans
=
false
;
const
bool
useGpu
=
false
;
// clear
configs_
.
clear
();
layerNames_
.
clear
();
dataLayers_
.
clear
();
datas_
.
clear
();
layerMaps_
.
clear
();
parameters_
.
clear
();
testLayers_
.
clear
();
// resize
configs_
.
resize
(
NUM
);
layerNames_
.
resize
(
NUM
);
dataLayers_
.
resize
(
NUM
);
datas_
.
resize
(
NUM
);
layerMaps_
.
resize
(
NUM
);
parameters_
.
resize
(
NUM
);
testLayers_
.
resize
(
NUM
);
// reset configs and layer names
configs_
[
DNN
]
=
dnn
;
configs_
[
REF
]
=
ref
;
layerNames_
[
DNN
]
=
"mkldnn"
;
// the first is mkldnn layer
layerNames_
[
REF
]
=
"reference"
;
// second is reference layer
// reset others
for
(
size_t
i
=
0
;
i
<
NUM
;
++
i
)
{
configs_
[
i
].
layerConfig
.
set_name
(
layerNames_
[
i
]);
initDataLayer
(
configs_
[
i
],
&
(
dataLayers_
[
i
]),
&
(
datas_
[
i
]),
&
(
layerMaps_
[
i
]),
layerNames_
[
i
],
batchSize
,
trans
,
useGpu
);
initTestLayer
(
configs_
[
i
],
&
(
layerMaps_
[
i
]),
&
(
parameters_
[
i
]),
&
(
testLayers_
[
i
]));
}
dnnLayer_
=
testLayers_
[
DNN
];
refLayer_
=
testLayers_
[
REF
];
EXPECT_EQ
(
dataLayers_
[
DNN
].
size
(),
dataLayers_
[
REF
].
size
());
EXPECT_EQ
(
parameters_
[
DNN
].
size
(),
parameters_
[
REF
].
size
());
setInputImgSize
();
}
void
MKLDNNTester
::
setInputImgSize
()
{
for
(
size_t
n
=
0
;
n
<
dataLayers_
.
size
();
++
n
)
{
for
(
size_t
i
=
0
;
i
<
dataLayers_
[
n
].
size
();
++
i
)
{
// TODO(TJ): fix me when concat and elewise ready
dataLayers_
[
n
][
i
]
->
getOutput
().
setFrameHeight
(
ih_
);
dataLayers_
[
n
][
i
]
->
getOutput
().
setFrameWidth
(
iw_
);
}
}
}
// init randome parameters of ref, and copy to mkldnn
void
MKLDNNTester
::
randomWgtDatas
()
{
EXPECT_EQ
(
parameters_
[
DNN
].
size
(),
parameters_
[
REF
].
size
());
for
(
size_t
i
=
0
;
i
<
parameters_
[
REF
].
size
();
++
i
)
{
const
VectorPtr
&
dnnValue
=
parameters_
[
DNN
][
i
]
->
getBuf
(
PARAMETER_VALUE
);
const
VectorPtr
&
refValue
=
parameters_
[
REF
][
i
]
->
getBuf
(
PARAMETER_VALUE
);
parameters_
[
REF
][
i
]
->
randomize
();
dnnValue
->
copyFrom
(
*
refValue
);
VLOG
(
lvl_
)
<<
"Random weight data "
<<
parameters_
[
DNN
][
i
]
->
getName
();
printVector
(
dnnValue
);
}
}
// random botdata of ref layer and copy same to mkldnn
void
MKLDNNTester
::
randomBotDatas
()
{
CHECK_EQ
(
dataLayers_
.
size
(),
NUM
);
for
(
size_t
i
=
0
;
i
<
dataLayers_
[
DNN
].
size
();
++
i
)
{
dataLayers_
[
REF
][
i
]
->
getOutputValue
()
->
randomizeUniform
();
dataLayers_
[
DNN
][
i
]
->
getOutputValue
()
->
copyFrom
(
*
(
dataLayers_
[
REF
][
i
]
->
getOutputValue
()));
VLOG
(
lvl_
)
<<
"Input "
<<
i
<<
" data:"
;
printMatrix
(
dataLayers_
[
REF
][
i
]
->
getOutputValue
());
}
}
void
MKLDNNTester
::
randomTopDiffs
()
{
refLayer_
->
getOutputGrad
()
->
randomizeUniform
();
dnnLayer_
->
getOutputGrad
()
->
copyFrom
(
*
(
refLayer_
->
getOutputGrad
()));
VLOG
(
lvl_
)
<<
"Random dom Backward Input, TopDiff: "
;
printMatrix
(
refLayer_
->
getOutputGrad
());
}
void
MKLDNNTester
::
checkForward
()
{
printTopDatas
();
double
delta
=
compareMatrix
(
testLayers_
[
DNN
]
->
getOutputValue
(),
testLayers_
[
REF
]
->
getOutputValue
());
VLOG
(
MKLDNN_ALL
)
<<
"Check Forward"
;
EXPECT_LE
(
fabs
(
delta
),
eps_
);
}
void
MKLDNNTester
::
checkBackwardData
()
{
// TODO(TJ): uncomment me when batch norm ready
// const bool isBN = dnnLayer_->getType() == "mkldnn_batch_norm";
for
(
size_t
i
=
0
;
i
<
dataLayers_
[
DNN
].
size
();
++
i
)
{
const
MatrixPtr
&
dnnDiff
=
dataLayers_
[
DNN
][
i
]
->
getOutputGrad
();
const
MatrixPtr
&
refDiff
=
dataLayers_
[
REF
][
i
]
->
getOutputGrad
();
VLOG
(
lvl_
)
<<
"Mkldnn Backward Output BotDiff "
<<
i
;
printMatrix
(
dnnDiff
);
VLOG
(
lvl_
)
<<
"Reference Backward Output BotDiff "
<<
i
;
printMatrix
(
refDiff
);
double
delta
=
compareMatrix
(
dnnDiff
,
refDiff
);
EXPECT_LE
(
fabs
(
delta
),
eps_
);
// TODO(TJ): uncomment me when batch norm ready
// if (isBN) {
// // the other two inputs in batch norm are for moving mean and var
// break;
// }
}
}
void
MKLDNNTester
::
checkBackwardWgts
()
{
CHECK_EQ
(
parameters_
[
DNN
].
size
(),
parameters_
[
REF
].
size
());
vector
<
VectorPtr
>
dnnWgts
;
// used to temply save mkldnn weights
saveWgt
(
parameters_
[
DNN
],
dnnWgts
);
const
MKLDNNLayerPtr
dnnlayer
=
std
::
dynamic_pointer_cast
<
MKLDNNLayer
>
(
dnnLayer_
);
CHECK
(
dnnlayer
);
dnnlayer
->
convertWeightsToPaddle
();
for
(
size_t
i
=
0
;
i
<
parameters_
[
DNN
].
size
();
++
i
)
{
const
VectorPtr
&
dnn
=
parameters_
[
DNN
][
i
]
->
getBuf
(
PARAMETER_VALUE
);
const
VectorPtr
&
ref
=
parameters_
[
REF
][
i
]
->
getBuf
(
PARAMETER_VALUE
);
VLOG
(
lvl_
)
<<
"Mkldnn Output weight "
<<
parameters_
[
DNN
][
i
]
->
getName
();
printVector
(
dnn
);
VLOG
(
lvl_
)
<<
"Reference Output weight "
<<
parameters_
[
REF
][
i
]
->
getName
();
printVector
(
ref
);
double
delta
=
compareVector
(
dnn
,
ref
);
EXPECT_LE
(
fabs
(
delta
),
eps_
);
}
VLOG
(
MKLDNN_ALL
)
<<
"Restore dnn weights before comapre"
;
restoreWgt
(
dnnWgts
,
parameters_
[
DNN
]);
}
void
MKLDNNTester
::
saveWgt
(
const
vector
<
ParameterPtr
>&
from
,
vector
<
VectorPtr
>&
to
)
{
const
bool
useGpu
=
false
;
to
.
resize
(
from
.
size
());
for
(
size_t
i
=
0
;
i
<
to
.
size
();
++
i
)
{
const
VectorPtr
&
wgt
=
from
[
i
]
->
getBuf
(
PARAMETER_VALUE
);
to
[
i
]
=
Vector
::
create
(
wgt
->
getSize
(),
useGpu
);
to
[
i
]
->
copyFrom
(
*
wgt
);
}
}
void
MKLDNNTester
::
restoreWgt
(
const
vector
<
VectorPtr
>&
from
,
vector
<
ParameterPtr
>&
to
)
{
CHECK_EQ
(
from
.
size
(),
to
.
size
());
for
(
size_t
i
=
0
;
i
<
from
.
size
();
++
i
)
{
const
VectorPtr
&
wgt
=
to
[
i
]
->
getBuf
(
PARAMETER_VALUE
);
wgt
->
copyFrom
(
*
from
[
i
]);
}
}
// clear parameters grad
void
MKLDNNTester
::
clearWgtDiffs
()
{
for
(
size_t
n
=
0
;
n
<
parameters_
.
size
();
++
n
)
{
for
(
size_t
i
=
0
;
i
<
parameters_
[
n
].
size
();
++
i
)
{
const
VectorPtr
&
grad
=
parameters_
[
n
][
i
]
->
getBuf
(
PARAMETER_GRADIENT
);
if
(
grad
)
{
grad
->
zeroMem
();
}
}
}
}
void
MKLDNNTester
::
clearBotDiffs
()
{
// dnn and ref
for
(
size_t
n
=
0
;
n
<
dataLayers_
.
size
();
++
n
)
{
// all inputs layers
for
(
size_t
i
=
0
;
i
<
dataLayers_
[
n
].
size
();
++
i
)
{
dataLayers_
[
n
][
i
]
->
getOutputGrad
()
->
zeroMem
();
}
}
}
void
MKLDNNTester
::
clearBotDiffs
(
int
n
)
{
CHECK_LT
(
n
,
NUM
);
// all inputs layers
for
(
size_t
i
=
0
;
i
<
dataLayers_
[
n
].
size
();
++
i
)
{
dataLayers_
[
n
][
i
]
->
getOutputGrad
()
->
zeroMem
();
}
}
void
MKLDNNTester
::
clearTopDatas
()
{
for
(
size_t
i
=
0
;
i
<
testLayers_
.
size
();
++
i
)
{
testLayers_
[
i
]
->
getOutputValue
()
->
zeroMem
();
}
}
void
MKLDNNTester
::
printTopDatas
()
{
if
(
!
log_
)
{
return
;
}
for
(
int
n
=
0
;
n
<
NUM
;
++
n
)
{
VLOG
(
lvl_
)
<<
testLayers_
[
n
]
->
getType
()
<<
" forward output TopData: "
;
printMatrix
(
testLayers_
[
n
]
->
getOutputValue
());
}
}
void
MKLDNNTester
::
printMatrix
(
const
MatrixPtr
&
m
)
{
if
(
!
log_
)
{
return
;
}
std
::
ostringstream
ostr
;
m
->
print
(
ostr
);
VLOG
(
lvl_
)
<<
std
::
endl
<<
ostr
.
str
();
}
void
MKLDNNTester
::
printVector
(
const
VectorPtr
&
v
)
{
if
(
!
log_
)
{
return
;
}
std
::
ostringstream
ostr
;
v
->
print
(
ostr
,
v
->
getSize
());
VLOG
(
lvl_
)
<<
std
::
endl
<<
ostr
.
str
();
}
double
MKLDNNTester
::
getDelta
(
const
real
*
d1
,
const
real
*
d2
,
size_t
len
,
const
float
failRate
,
const
float
thres
)
{
double
delta
=
0
,
sum
=
0
;
int
failCnt
=
0
;
const
double
eps
=
1e-5
;
double
maxOut
=
0
;
for
(
size_t
i
=
0
;
i
<
len
;
++
i
)
{
double
ref
=
fabs
(
d2
[
i
]);
double
diff
=
fabs
(
d1
[
i
]
-
d2
[
i
]);
delta
+=
diff
;
sum
+=
ref
;
if
(
ref
>
eps
&&
fabs
(
d1
[
i
])
>
eps
&&
diff
/
ref
>
thres
)
{
maxOut
=
std
::
max
(
maxOut
,
diff
/
ref
);
failCnt
++
;
}
}
EXPECT_TRUE
(
std
::
isnormal
(
sum
));
EXPECT_FALSE
(
std
::
isinf
(
sum
));
EXPECT_FALSE
(
std
::
isnan
(
delta
));
VLOG
(
MKLDNN_ALL
)
<<
"reference avg data: "
<<
sum
/
len
<<
", delta: "
<<
delta
/
sum
<<
", failCnt:"
<<
failCnt
;
return
(
failCnt
/
(
float
)
len
)
>
failRate
?
maxOut
:
delta
/
sum
;
}
double
MKLDNNTester
::
compareMatrix
(
const
MatrixPtr
&
m1
,
const
MatrixPtr
&
m2
)
{
CHECK_EQ
(
m1
->
getElementCnt
(),
m2
->
getElementCnt
());
return
getDelta
(
m1
->
getData
(),
m2
->
getData
(),
m1
->
getElementCnt
());
}
double
MKLDNNTester
::
compareVector
(
const
VectorPtr
&
v1
,
const
VectorPtr
&
v2
)
{
CHECK_EQ
(
v1
->
getSize
(),
v2
->
getSize
());
return
getDelta
(
v1
->
getData
(),
v2
->
getData
(),
v1
->
getSize
());
}
void
MKLDNNTester
::
runOnce
()
{
// test forward
randomBotDatas
();
dnnLayer_
->
forward
(
PASS_TRAIN
);
refLayer_
->
forward
(
PASS_TRAIN
);
checkForward
();
// test backward
randomTopDiffs
();
dnnLayer_
->
backward
(
nullptr
);
refLayer_
->
backward
(
nullptr
);
checkBackwardData
();
checkBackwardWgts
();
// clear buffers
// ref code will addto the diff, dnn code will writeto it
// and clearTopDatas() and clearWgtDiffs() should be coverd by test layers
clearBotDiffs
(
REF
);
}
void
MKLDNNTester
::
run
(
const
TestConfig
&
dnn
,
const
TestConfig
&
ref
,
size_t
batchSize
,
size_t
inputImgH
,
size_t
inputImgW
,
size_t
iter
,
float
epsilon
,
bool
log
,
int
level
)
{
VLOG
(
MKLDNN_TESTS
)
<<
"Test MKLDNN functionality: "
<<
dnn
.
layerConfig
.
type
()
<<
" vs "
<<
ref
.
layerConfig
.
type
();
ih_
=
inputImgH
;
iw_
=
inputImgW
;
iter_
=
iter
;
eps_
=
epsilon
;
log_
=
log
;
lvl_
=
level
;
// Firstly test FLAGS_use_mkldnn_wgt = false
FLAGS_use_mkldnn_wgt
=
false
;
// reset and run once
reset
(
dnn
,
ref
,
batchSize
);
randomWgtDatas
();
clearWgtDiffs
();
clearBotDiffs
();
for
(
size_t
i
=
0
;
i
<
iter_
;
++
i
)
{
VLOG
(
MKLDNN_TESTS
)
<<
"Check Iteration "
<<
i
;
runOnce
();
}
// Then test FLAGS_use_mkldnn_wgt = true
FLAGS_use_mkldnn_wgt
=
true
;
// after run once the mkldnn weight has been stored in dnnlayer
// then save the weights and restart again
vector
<
VectorPtr
>
dnnWgts
,
refWgts
;
CHECK_EQ
(
parameters_
[
DNN
].
size
(),
parameters_
[
REF
].
size
());
saveWgt
(
parameters_
[
DNN
],
dnnWgts
);
saveWgt
(
parameters_
[
REF
],
refWgts
);
// restart again with flag true
reset
(
dnn
,
ref
,
batchSize
);
// restore wgt
restoreWgt
(
dnnWgts
,
parameters_
[
DNN
]);
restoreWgt
(
refWgts
,
parameters_
[
REF
]);
clearWgtDiffs
();
clearBotDiffs
();
for
(
size_t
i
=
0
;
i
<
iter_
;
++
i
)
{
VLOG
(
MKLDNN_TESTS
)
<<
"Check Iteration "
<<
i
;
runOnce
();
}
}
}
// namespace paddle
paddle/gserver/tests/MKLDNNTester.h
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2017 PaddlePaddle Authors. All Rights Reserve.
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. */
#pragma once
#include <string>
#include <vector>
#include "LayerGradUtil.h"
#include "paddle/gserver/layers/MKLDNNBase.h"
namespace
paddle
{
/**
* @brief test the functionality of Mkldnnlayers
* refer to paddle original function
*/
class
MKLDNNTester
{
enum
{
DNN
=
0
,
// MKLDNN layer
REF
=
1
,
// Reference layer
NUM
=
2
,
// Number of total
};
protected:
std
::
vector
<
TestConfig
>
configs_
;
vector
<
string
>
layerNames_
;
vector
<
vector
<
DataLayerPtr
>>
dataLayers_
;
vector
<
vector
<
Argument
>>
datas_
;
vector
<
LayerMap
>
layerMaps_
;
vector
<
vector
<
ParameterPtr
>>
parameters_
;
vector
<
LayerPtr
>
testLayers_
;
LayerPtr
dnnLayer_
,
refLayer_
;
/// run some iterations, all the result should pass
size_t
iter_
;
/// whether to print out the details
bool
log_
;
/// vlog level to print the matrix details datas
int
lvl_
;
/// epsilon
float
eps_
;
/// input image size, default 1
size_t
ih_
,
iw_
;
public:
explicit
MKLDNNTester
(
size_t
iter
=
3
,
float
epsilon
=
1e-4
)
{
iter_
=
iter
;
eps_
=
epsilon
;
log_
=
false
;
lvl_
=
MKLDNN_ALL
;
}
~
MKLDNNTester
()
{}
public:
void
run
(
const
TestConfig
&
dnn
,
const
TestConfig
&
ref
,
size_t
batchSize
,
size_t
inputImgH
=
1
,
size_t
inputImgW
=
1
,
size_t
iter
=
3
,
float
epsilon
=
1e-4
,
bool
log
=
false
,
int
level
=
MKLDNN_ALL
);
void
setLogLevel
(
int
lvl
)
{
lvl_
=
lvl
;
}
private:
void
reset
(
const
TestConfig
&
dnn
,
const
TestConfig
&
ref
,
size_t
batchSize
);
void
setInputImgSize
();
void
runOnce
();
void
randomWgtDatas
();
void
randomBotDatas
();
void
randomTopDiffs
();
void
checkForward
();
void
checkBackwardData
();
void
checkBackwardWgts
();
void
clearWgtDiffs
();
void
clearBotDiffs
();
void
clearBotDiffs
(
int
n
);
// clear specific layer
void
clearTopDatas
();
void
printTopDatas
();
void
printMatrix
(
const
MatrixPtr
&
m
);
void
printVector
(
const
VectorPtr
&
v
);
void
saveWgt
(
const
vector
<
ParameterPtr
>&
from
,
vector
<
VectorPtr
>&
to
);
void
restoreWgt
(
const
vector
<
VectorPtr
>&
from
,
vector
<
ParameterPtr
>&
to
);
double
compareMatrix
(
const
MatrixPtr
&
m1
,
const
MatrixPtr
&
m2
);
double
compareVector
(
const
VectorPtr
&
v1
,
const
VectorPtr
&
v2
);
/**
* Get delta percent
* if many(>failRate) wrong(abs(dnn-ref)/abs(ref)>thres) points return the
* max(diff/ref)
* else return sum(abs(a-b)) / sum(abs(b))
* The return value should smaller than eps when passing.
*/
double
getDelta
(
const
real
*
d1
,
const
real
*
d2
,
size_t
len
,
const
float
failRate
=
1e-3
,
const
float
thres
=
0.1
);
};
}
// namespace paddle
paddle/gserver/tests/test_KmaxSeqScore.cpp
浏览文件 @
33f21d05
...
...
@@ -96,6 +96,11 @@ TEST(Layer, kmaxSeqScoreLayer) {
MatrixPtr
inValue
=
Matrix
::
create
(
subSeqStartPosition
.
back
(),
1
,
false
,
false
);
std
::
vector
<
bool
>
mode
=
{
false
};
#ifndef PADDLE_ONLY_CPU
mode
.
push_back
(
true
);
#endif
for
(
auto
hasSubseq
:
{
false
,
true
})
{
vector
<
vector
<
int
>>
groundTruth
;
inValue
->
randomizeUniform
();
...
...
@@ -104,7 +109,7 @@ TEST(Layer, kmaxSeqScoreLayer) {
hasSubseq
?
subSeqStartPosition
:
seqStartPosition
,
beamSize
);
for
(
auto
useGpu
:
{
false
,
true
}
)
{
for
(
auto
useGpu
:
mode
)
{
TestConfig
config
;
config
.
layerConfig
.
set_type
(
"kmax_seq_score"
);
config
.
layerConfig
.
set_beam_size
(
beamSize
);
...
...
paddle/gserver/tests/test_MKLDNN.cpp
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2017 PaddlePaddle Authors. All Rights Reserve.
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. */
#include <gtest/gtest.h>
#include <string>
#include <vector>
#include "MKLDNNTester.h"
#include "ModelConfig.pb.h"
using
namespace
paddle
;
// NOLINT
DECLARE_bool
(
thread_local_rand_use_global_seed
);
DECLARE_bool
(
use_gpu
);
DECLARE_bool
(
use_mkldnn
);
struct
testFCDesc
{
int
bs
;
int
ic
;
int
oc
;
int
ih
,
iw
;
// oh == ow == 1
};
void
testFcLayer
(
const
testFCDesc
&
pm
)
{
const
std
::
string
compareTypes
[]
=
{
"mkldnn_fc"
,
"fc"
};
TestConfig
cfg
;
cfg
.
layerConfig
.
set_type
(
compareTypes
[
0
]);
cfg
.
layerConfig
.
set_size
(
pm
.
oc
);
cfg
.
inputDefs
.
push_back
(
{
INPUT_DATA
,
"layer_0"
,
/* size of input layer= */
size_t
(
pm
.
ic
*
pm
.
ih
*
pm
.
iw
),
/* size of weight= */
size_t
(
pm
.
oc
*
pm
.
ic
*
pm
.
ih
*
pm
.
iw
)});
cfg
.
layerConfig
.
add_inputs
();
MKLDNNTester
tester
;
for
(
auto
biasSize
:
{
pm
.
oc
,
0
})
{
cfg
.
biasSize
=
biasSize
;
TestConfig
ref
=
cfg
;
ref
.
layerConfig
.
set_type
(
compareTypes
[
1
]);
for
(
auto
bs
:
{
pm
.
bs
,
1
})
{
tester
.
run
(
cfg
,
ref
,
bs
,
pm
.
ih
,
pm
.
iw
);
}
}
}
TEST
(
MKLDNNLayer
,
FcLayer
)
{
testFcLayer
({
/*bs*/
2
,
/*ic*/
2
,
/*oc*/
3
,
/*ih*/
1
,
/*iw*/
1
});
testFcLayer
({
/*bs*/
3
,
/*ic*/
7
,
/*oc*/
19
,
/*ih*/
1
,
/*iw*/
1
});
testFcLayer
({
/*bs*/
8
,
/*ic*/
16
,
/*oc*/
32
,
/*ih*/
13
,
/*iw*/
13
});
testFcLayer
({
/*bs*/
4
,
/*ic*/
12
,
/*oc*/
18
,
/*ih*/
13
,
/*iw*/
11
});
testFcLayer
({
/*bs*/
2
,
/*ic*/
64
,
/*oc*/
32
,
/*ih*/
16
,
/*iw*/
16
});
testFcLayer
({
/*bs*/
15
,
/*ic*/
3
,
/*oc*/
6
,
/*ih*/
16
,
/*iw*/
16
});
}
// TODO(TJ): add branch test
int
main
(
int
argc
,
char
**
argv
)
{
testing
::
InitGoogleTest
(
&
argc
,
argv
);
FLAGS_use_gpu
=
false
;
FLAGS_use_mkldnn
=
true
;
initMain
(
argc
,
argv
);
FLAGS_thread_local_rand_use_global_seed
=
true
;
srand
(
1
);
return
RUN_ALL_TESTS
();
}
paddle/math/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -15,13 +15,13 @@
file
(
GLOB MATH_HEADERS . *.h
)
file
(
GLOB MATH_SOURCES . *.cpp
)
set
(
MATH_SOURCES
"
${
P
ROJ_ROOT
}
/paddle/math/BaseMatrix.cu"
"
${
P
ROJ_ROOT
}
/paddle/math/TrainingAlgorithmOp.cu"
"
${
P
ADDLE_SOURCE_DIR
}
/paddle/math/BaseMatrix.cu"
"
${
P
ADDLE_SOURCE_DIR
}
/paddle/math/TrainingAlgorithmOp.cu"
${
MATH_SOURCES
}
)
if
(
NOT WITH_GPU
)
# then compile BaseMatrix.cu as c++ file
compile_cu_as_cpp
(
"
${
P
ROJ_ROOT
}
/paddle/math/BaseMatrix.cu"
)
compile_cu_as_cpp
(
"
${
P
ROJ_ROOT
}
/paddle/math/TrainingAlgorithmOp.cu"
)
compile_cu_as_cpp
(
"
${
P
ADDLE_SOURCE_DIR
}
/paddle/math/BaseMatrix.cu"
)
compile_cu_as_cpp
(
"
${
P
ADDLE_SOURCE_DIR
}
/paddle/math/TrainingAlgorithmOp.cu"
)
add_library
(
paddle_math STATIC
${
MATH_SOURCES
}
)
else
()
...
...
paddle/math/CpuSparseMatrix.h
浏览文件 @
33f21d05
...
...
@@ -302,6 +302,10 @@ public:
bool
isSparse
()
const
{
return
true
;
}
private:
using
Matrix
::
mul
;
using
Matrix
::
copyFrom
;
using
Matrix
::
rowMax
;
using
Matrix
::
print
;
using
Matrix
::
subMatrix
;
};
}
// namespace paddle
paddle/math/SparseMatrix.h
浏览文件 @
33f21d05
...
...
@@ -231,6 +231,9 @@ public:
private:
using
Matrix
::
mul
;
using
Matrix
::
copyFrom
;
using
Matrix
::
rowMax
;
using
Matrix
::
print
;
using
Matrix
::
subMatrix
;
};
}
// namespace paddle
paddle/operators/gaussian_random_op.cu
浏览文件 @
33f21d05
...
...
@@ -33,15 +33,16 @@ class GaussianRandomKernel : public framework::OpKernel {
int
seed
=
context
.
op_
.
GetAttr
<
int
>
(
"seed"
);
if
(
seed
==
0
)
{
seed
=
std
::
random_device
()();
std
::
random_device
rd
;
seed
=
rd
();
}
curandGenerator_t
g
;
PADDLE_ENFORCE
(
platform
::
dynload
::
curandCreateGenerator
(
&
g
,
CURAND_RNG_PSEUDO_DEFAULT
));
PADDLE_ENFORCE
(
platform
::
dynload
::
curandSetPseudoRandomGeneratorSeed
(
g
,
seed
));
curandGenerateNormal
(
g
,
data
,
framework
::
product
(
tensor
->
dims
()),
mean
,
std
);
platform
::
dynload
::
curandGenerateNormal
(
g
,
data
,
framework
::
product
(
tensor
->
dims
()),
mean
,
std
);
}
};
...
...
@@ -49,4 +50,4 @@ class GaussianRandomKernel : public framework::OpKernel {
}
// namespace paddle
namespace
ops
=
paddle
::
operators
;
REGISTER_OP_GPU_KERNEL
(
gaussian_random
,
ops
::
GaussianRandomKernel
<
float
>
);
\ No newline at end of file
REGISTER_OP_GPU_KERNEL
(
gaussian_random
,
ops
::
GaussianRandomKernel
<
float
>
);
paddle/operators/uniform_random_op.cu
浏览文件 @
33f21d05
...
...
@@ -51,7 +51,8 @@ class GPUUniformRandomKernel : public framework::OpKernel {
unsigned
int
seed
=
static_cast
<
unsigned
int
>
(
context
.
op_
.
GetAttr
<
int
>
(
"seed"
));
if
(
seed
==
0
)
{
seed
=
std
::
random_device
()();
std
::
random_device
rd
;
seed
=
rd
();
}
T
min
=
static_cast
<
T
>
(
context
.
op_
.
GetAttr
<
float
>
(
"min"
));
T
max
=
static_cast
<
T
>
(
context
.
op_
.
GetAttr
<
float
>
(
"max"
));
...
...
paddle/platform/dynload/cublas.h
浏览文件 @
33f21d05
...
...
@@ -48,13 +48,13 @@ extern void *cublas_dso_handle;
}; \
extern DynLoad__##__name __name
#else
#define DECLARE_DYNAMIC_LOAD_CUBLAS_WRAP(__name) \
struct DynLoad__##__name { \
inline template <typename... Args>
\
cublasStatus_t operator()(Args... args) {
\
return __name(args...); \
} \
}; \
#define DECLARE_DYNAMIC_LOAD_CUBLAS_WRAP(__name)
\
struct DynLoad__##__name {
\
template <typename... Args>
\
inline cublasStatus_t operator()(Args... args) {
\
return __name(args...);
\
}
\
};
\
extern DynLoad__##__name __name
#endif
...
...
paddle/platform/dynload/curand.h
浏览文件 @
33f21d05
...
...
@@ -55,6 +55,7 @@ extern void *curand_dso_handle;
__macro(curandSetPseudoRandomGeneratorSeed); \
__macro(curandGenerateUniform); \
__macro(curandGenerateUniformDouble); \
__macro(curandGenerateNormal); \
__macro(curandDestroyGenerator);
CURAND_RAND_ROUTINE_EACH
(
DECLARE_DYNAMIC_LOAD_CURAND_WRAP
);
...
...
paddle/platform/place.h
浏览文件 @
33f21d05
...
...
@@ -14,8 +14,8 @@ limitations under the License. */
#pragma once
#include <boost/variant.hpp>
#include <iostream>
#include "paddle/platform/variant.h"
namespace
paddle
{
namespace
platform
{
...
...
paddle/platform/variant.h
0 → 100644
浏览文件 @
33f21d05
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
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. */
#pragma once
#include <boost/config.hpp>
#ifndef PADDLE_ONLY_CPU
// Because boost's variadic templates has bug on nvcc, boost will disable
// variadic template support when GPU enabled on nvcc.
// Define BOOST_NO_CXX11_VARIADIC_TEMPLATES on gcc/clang to generate same
// function symbols.
//
// https://github.com/PaddlePaddle/Paddle/issues/3386
#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES
#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
#endif
#endif
#include <boost/variant.hpp>
paddle/pserver/test/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -3,7 +3,7 @@ add_unittest_without_exec(socket_test
SocketTest.cpp
)
add_test
(
NAME socket_test
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_port.sh -p port
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_port.sh -p port
${
CMAKE_CURRENT_BINARY_DIR
}
/socket_test --loop_time=10
)
####################### test_ProtoServer ####################
...
...
@@ -12,7 +12,7 @@ add_unittest_without_exec(test_ProtoServer
IF
(
NOT ON_TRAVIS
)
add_test
(
NAME test_ProtoServer
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_port.sh -p port
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_port.sh -p port
${
CMAKE_CURRENT_BINARY_DIR
}
/test_ProtoServer
)
ENDIF
(
NOT ON_TRAVIS
)
...
...
@@ -24,5 +24,5 @@ ENDIF(NOT ON_TRAVIS)
add_unittest_without_exec
(
test_ParameterServer2
test_ParameterServer2.cpp
)
add_test
(
NAME test_ParameterServer2
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_port.sh -p port -n 4
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_port.sh -p port -n 4
${
CMAKE_CURRENT_BINARY_DIR
}
/test_ParameterServer2
)
paddle/scripts/docker/build.sh
浏览文件 @
33f21d05
...
...
@@ -31,7 +31,7 @@ Configuring cmake in /paddle/build ...
-DWITH_DOC=OFF
-DWITH_GPU=
${
WITH_GPU
:-
OFF
}
-DWITH_AVX=
${
WITH_AVX
:-
OFF
}
-DWITH_GOLANG=
${
WITH_GOLANG
:-
O
FF
}
-DWITH_GOLANG=
${
WITH_GOLANG
:-
O
N
}
-DWITH_SWIG_PY=ON
-DWITH_C_API=
${
WITH_C_API
:-
OFF
}
-DWITH_PYTHON=
${
WITH_PYTHON
:-
ON
}
...
...
@@ -51,7 +51,7 @@ cmake .. \
-DWITH_DOC
=
OFF
\
-DWITH_GPU
=
${
WITH_GPU
:-
OFF
}
\
-DWITH_AVX
=
${
WITH_AVX
:-
OFF
}
\
-DWITH_GOLANG
=
${
WITH_GOLANG
:-
O
FF
}
\
-DWITH_GOLANG
=
${
WITH_GOLANG
:-
O
N
}
\
-DWITH_SWIG_PY
=
${
WITH_SWIG_PY
:-
ON
}
\
-DWITH_C_API
=
${
WITH_C_API
:-
OFF
}
\
-DWITH_PYTHON
=
${
WITH_PYTHON
:-
ON
}
\
...
...
@@ -74,11 +74,11 @@ cat <<EOF
Running unit tests ...
========================================
EOF
ctest
--output-on-failure
# make install should also be test when unittest
make
install
-j
`
nproc
`
pip
install
/usr/local/opt/paddle/share/wheels/
*
.whl
paddle version
ctest
--output-on-failure
fi
...
...
@@ -130,7 +130,7 @@ fi
# generate deb package for current build
# FIXME(typhoonzero): should we remove paddle/scripts/deb ?
if
[[
${
WITH_DEB
:-
O
FF
}
==
"ON"
]]
;
then
if
[[
${
WITH_DEB
:-
O
N
}
==
"ON"
]]
;
then
cat
<<
EOF
========================================
Generating .deb package ...
...
...
paddle/trainer/NewRemoteParameterUpdater.cpp
浏览文件 @
33f21d05
...
...
@@ -66,28 +66,92 @@ void NewRemoteParameterUpdater::init(
// from parameter server
if
(
paddle_begin_init_params
(
parameterClient_
))
{
LOG
(
INFO
)
<<
"paddle_begin_init_params start"
;
// NOTE: convert V1 OptimizatioinConfig proto to V2 OptimizerConfig.
// This makes golang pserver compatible with handy V1 demos.
// TODO: Refine or remove these ugly converting lines
OptimizerConfig
optimizerConfigV2
;
if
(
trainerConfig_
.
learning_method
()
==
"momentum"
)
{
optimizerConfigV2
.
set_optimizer
(
paddle
::
OptimizerConfig
::
SGD
);
}
else
if
(
trainerConfig_
.
learning_method
()
==
"adagrad"
)
{
optimizerConfigV2
.
set_optimizer
(
paddle
::
OptimizerConfig
::
Adagrad
);
optimizerConfigV2
.
mutable_adagrad
()
->
set_epsilon
(
trainerConfig_
.
ada_epsilon
());
}
else
if
(
trainerConfig_
.
learning_method
()
==
"adadelta"
)
{
optimizerConfigV2
.
set_optimizer
(
paddle
::
OptimizerConfig
::
Adagrad
);
optimizerConfigV2
.
mutable_adadelta
()
->
set_epsilon
(
trainerConfig_
.
ada_epsilon
());
optimizerConfigV2
.
mutable_adadelta
()
->
set_rho
(
trainerConfig_
.
ada_rou
());
}
else
if
(
trainerConfig_
.
learning_method
()
==
"adam"
)
{
optimizerConfigV2
.
set_optimizer
(
paddle
::
OptimizerConfig
::
Adam
);
optimizerConfigV2
.
mutable_adam
()
->
set_beta_1
(
trainerConfig_
.
adam_beta1
());
optimizerConfigV2
.
mutable_adam
()
->
set_beta_2
(
trainerConfig_
.
adam_beta2
());
optimizerConfigV2
.
mutable_adam
()
->
set_epsilon
(
trainerConfig_
.
adam_epsilon
());
}
else
{
LOG
(
ERROR
)
<<
"got unsupported v1 optimizer config: "
<<
trainerConfig_
.
learning_method
();
optimizerConfigV2
.
set_optimizer
(
paddle
::
OptimizerConfig
::
SGD
);
}
if
(
trainerConfig_
.
learning_rate_schedule
()
==
"constant"
)
{
optimizerConfigV2
.
set_lr_policy
(
paddle
::
OptimizerConfig
::
Const
);
optimizerConfigV2
.
mutable_const_lr
()
->
set_learning_rate
(
trainerConfig_
.
learning_rate
());
}
else
if
(
trainerConfig_
.
learning_rate_schedule
()
==
"linear"
)
{
optimizerConfigV2
.
set_lr_policy
(
paddle
::
OptimizerConfig
::
Linear
);
optimizerConfigV2
.
mutable_linear_lr
()
->
set_learning_rate
(
trainerConfig_
.
learning_rate
());
optimizerConfigV2
.
mutable_linear_lr
()
->
set_lr_decay_a
(
trainerConfig_
.
learning_rate_decay_a
());
optimizerConfigV2
.
mutable_linear_lr
()
->
set_lr_decay_b
(
trainerConfig_
.
learning_rate_decay_b
());
}
else
{
LOG
(
ERROR
)
<<
"got unsupported v1 learning_rate_schedule config: "
<<
trainerConfig_
.
learning_rate_schedule
()
<<
", set to const"
;
optimizerConfigV2
.
set_lr_policy
(
paddle
::
OptimizerConfig
::
Const
);
}
// overwrite optimizerConfigV2 for per-parameter(layer) configs
for
(
int
i
=
0
;
i
<
parameterSize
();
++
i
)
{
auto
paramConfig
=
parameters_
[
i
]
->
getConfig
();
LOG
(
INFO
)
<<
"old param config: "
<<
paramConfig
.
DebugString
();
// FIXME(typhoonzero): convert old paramConfig to optimizerConfig
OptimizerConfig
optimizeConfigV2
;
auto
sgdConfigV2
=
optimizeConfigV2
.
mutable_sgd
();
sgdConfigV2
->
set_momentum
(
paramConfig
.
momentum
());
sgdConfigV2
->
set_decay
(
paramConfig
.
decay_rate
());
optimizeConfigV2
.
set_lr_policy
(
paddle
::
OptimizerConfig
::
Const
);
auto
constlr
=
optimizeConfigV2
.
mutable_const_lr
();
if
(
paramConfig
.
has_momentum
()
&&
trainerConfig_
.
learning_method
()
==
"momentum"
)
{
optimizerConfigV2
.
mutable_sgd
()
->
set_momentum
(
paramConfig
.
momentum
());
}
if
(
paramConfig
.
has_learning_rate
())
{
constlr
->
set_learning_rate
(
paramConfig
.
learning_rate
());
}
else
{
constlr
->
set_learning_rate
(
trainerConfig_
.
learning_rate
());
switch
(
optimizerConfigV2
.
lr_policy
())
{
case
0
:
optimizerConfigV2
.
mutable_const_lr
()
->
set_learning_rate
(
paramConfig
.
learning_rate
());
break
;
case
1
:
optimizerConfigV2
.
mutable_linear_lr
()
->
set_learning_rate
(
paramConfig
.
learning_rate
());
break
;
}
}
if
(
trainerConfig_
.
algorithm
()
==
"sgd"
)
{
optimizeConfigV2
.
set_optimizer
(
paddle
::
OptimizerConfig
::
SGD
);
// FIXME: config all algorithms
}
else
{
optimizeConfigV2
.
set_optimizer
(
paddle
::
OptimizerConfig
::
SGD
);
if
(
paramConfig
.
has_decay_rate
())
{
switch
(
optimizerConfigV2
.
optimizer
())
{
case
1
:
// SGD
optimizerConfigV2
.
mutable_sgd
()
->
set_decay
(
paramConfig
.
decay_rate
());
break
;
case
2
:
// Adadelta
optimizerConfigV2
.
mutable_adadelta
()
->
set_decay
(
paramConfig
.
decay_rate
());
break
;
case
3
:
// Adagrad
optimizerConfigV2
.
mutable_adagrad
()
->
set_decay
(
paramConfig
.
decay_rate
());
break
;
case
4
:
// Adam
optimizerConfigV2
.
mutable_adam
()
->
set_decay
(
paramConfig
.
decay_rate
());
break
;
}
}
std
::
string
bytes
=
optimizeConfigV2
.
SerializeAsString
();
// send param and config to pserver
std
::
string
bytes
=
optimizerConfigV2
.
SerializeAsString
();
const
char
*
array
=
bytes
.
data
();
int
size
=
(
int
)
bytes
.
size
();
paddle_init_param
(
...
...
paddle/trainer/TrainerConfigHelper.cpp
浏览文件 @
33f21d05
...
...
@@ -28,6 +28,8 @@ DECLARE_bool(with_cost);
DECLARE_bool
(
with_gpu
);
DECLARE_bool
(
parallel_nn
);
DECLARE_string
(
config_args
);
DECLARE_bool
(
use_mkldnn
);
DECLARE_bool
(
use_mkldnn_wgt
);
const
char
*
kConfigParserModuleName
=
"paddle.trainer.config_parser"
;
const
char
*
kConfigParserFuncName
=
"parse_config_and_serialize"
;
...
...
@@ -44,6 +46,8 @@ TrainerConfigHelper::TrainerConfigHelper(const std::string &configFilePath)
configArgs
<<
"trainer_id="
<<
FLAGS_trainer_id
<<
",local="
<<
FLAGS_local
<<
",with_cost="
<<
FLAGS_with_cost
<<
",use_gpu="
<<
FLAGS_use_gpu
<<
",parallel_nn="
<<
FLAGS_parallel_nn
<<
",use_mkldnn="
<<
FLAGS_use_mkldnn
<<
",use_mkldnn_wgt="
<<
FLAGS_use_mkldnn_wgt
<<
",cudnn_version="
<<
hl_get_cudnn_lib_version
();
if
(
!
FLAGS_config_args
.
empty
())
{
configArgs
<<
","
<<
FLAGS_config_args
;
...
...
paddle/trainer/tests/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -2,19 +2,19 @@
add_unittest_without_exec
(
test_Compare
test_Compare.cpp
)
add_test
(
NAME test_Compare
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python
${
CMAKE_CURRENT_BINARY_DIR
}
/test_Compare
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
################# test_Trainer ###########################
add_unittest_without_exec
(
test_Trainer
test_Trainer.cpp
)
add_test
(
NAME test_Trainer
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ROJ_ROOT
}
/paddle/trainer/tests/gen_proto_data.py &&
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ADDLE_SOURCE_DIR
}
/paddle/trainer/tests/gen_proto_data.py &&
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
CMAKE_CURRENT_BINARY_DIR
}
/test_Trainer
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
############### test_TrainerOnePass ##########################
if
(
WITH_PYTHON
)
...
...
@@ -23,60 +23,60 @@ if(WITH_PYTHON)
add_unittest_without_exec
(
test_TrainerOnePass
test_TrainerOnePass.cpp
)
add_test
(
NAME test_TrainerOnePass
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
P
ROJ_ROOT
}
/python/:
${
PROJ_ROOT
}
/paddle/trainer/tests
${
P
ROJ_ROOT
}
/paddle/.set_port.sh -p port
${
CMAKE_CURRENT_BINARY_DIR
}
/test_TrainerOnePass
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
P
ADDLE_SOURCE_DIR
}
/python/:
${
PADDLE_SOURCE_DIR
}
/paddle/trainer/tests
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_port.sh -p port
${
CMAKE_CURRENT_BINARY_DIR
}
/test_TrainerOnePass
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
endif
()
################ test_CompareTwoNets ######################
add_unittest_without_exec
(
test_CompareTwoNets
test_CompareTwoNets.cpp
)
add_test
(
NAME test_CompareTwoNets
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
CMAKE_CURRENT_BINARY_DIR
}
/test_CompareTwoNets
--config_file_a=trainer/tests/sample_trainer_config_qb_rnn.conf --config_file_b=trainer/tests/sample_trainer_config_rnn.conf
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
############### test_CompareTwoOpts ###################
add_unittest_without_exec
(
test_CompareTwoOpts
test_CompareTwoOpts.cpp
)
add_test
(
NAME test_CompareTwoOpts
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
CMAKE_CURRENT_BINARY_DIR
}
/test_CompareTwoOpts
--config_file_a=trainer/tests/sample_trainer_config_opt_a.conf --config_file_b=trainer/tests/sample_trainer_config_opt_b.conf
--num_passes=1 --need_high_accuracy=0
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
################# test_CompareSparse ##################
add_unittest_without_exec
(
test_CompareSparse
test_CompareSparse.cpp
)
if
(
NOT ON_TRAVIS
)
add_test
(
NAME test_CompareSparse
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
./.set_port.sh -p port -n 6
${
CMAKE_CURRENT_BINARY_DIR
}
/test_CompareSparse
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
endif
()
################# test_recurrent_machine_generation ###############
add_unittest_without_exec
(
test_recurrent_machine_generation
test_recurrent_machine_generation.cpp
)
add_test
(
NAME test_recurrent_machine_generation
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
CMAKE_CURRENT_BINARY_DIR
}
/test_recurrent_machine_generation
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
#################### test_PyDataProviderWrapper #########################
add_unittest_without_exec
(
test_PyDataProviderWrapper
test_PyDataProviderWrapper.cpp
)
add_test
(
NAME test_PyDataProviderWrapper
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
P
ROJ_ROOT
}
/python/:
${
PROJ_ROOT
}
/paddle/trainer/tests
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
P
ADDLE_SOURCE_DIR
}
/python/:
${
PADDLE_SOURCE_DIR
}
/paddle/trainer/tests
${
CMAKE_CURRENT_BINARY_DIR
}
/test_PyDataProviderWrapper
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
#################### test_config_parser #########################
add_test
(
NAME test_config_parser
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ROJ_ROOT
}
/paddle/trainer/tests/config_parser_test.py
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/paddle/
)
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ADDLE_SOURCE_DIR
}
/paddle/trainer/tests/config_parser_test.py
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/paddle/
)
paddle/utils/Flags.cpp
浏览文件 @
33f21d05
...
...
@@ -20,6 +20,14 @@ DEFINE_bool(use_gpu, false, "Only support CPU training");
DEFINE_bool
(
use_gpu
,
true
,
"Whether to use GPU for training"
);
#endif
#ifdef PADDLE_USE_MKLDNN
// TODO(TJ): change to true when MKLDNN layers support multi-inputs
DEFINE_bool
(
use_mkldnn
,
false
,
"Default still keep use CPU training"
);
#else
DEFINE_bool
(
use_mkldnn
,
false
,
"Only support CPU training"
);
#endif
DEFINE_bool
(
use_mkldnn_wgt
,
false
,
"Init weight from CPU weight"
);
DEFINE_bool
(
parallel_nn
,
false
,
"Whether to use multi-threads to calculate one neural network."
...
...
paddle/utils/Flags.h
浏览文件 @
33f21d05
...
...
@@ -40,3 +40,5 @@ DECLARE_bool(show_layer_stat);
DECLARE_string
(
predict_file
);
DECLARE_bool
(
prev_batch_state
);
DECLARE_string
(
init_model_path
);
DECLARE_bool
(
use_mkldnn
);
DECLARE_bool
(
use_mkldnn_wgt
);
paddle/utils/tests/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -13,6 +13,6 @@ add_executable(
link_paddle_exe
(
test_CustomStackTracePrint
)
if
(
NOT APPLE
)
add_test
(
NAME test_CustomStackTracePrint
COMMAND
${
P
ROJ_ROOT
}
/paddle/utils/tests/test_CustomStackTracePrint.sh
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/utils/tests/test_CustomStackTracePrint.sh
WORKING_DIRECTORY
${
CMAKE_CURRENT_BINARY_DIR
}
)
endif
()
proto/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -9,13 +9,13 @@ foreach(filename ${proto_filenames})
get_filename_component
(
ABS_FIL
${
filename
}
ABSOLUTE
)
get_filename_component
(
FIL_WE
${
filename
}
NAME_WE
)
set
(
CUR_PROTO_GEN_PY
${
P
ROJ_ROOT
}
/paddle/python/paddle/proto/
${
FIL_WE
}
_pb2.py
)
${
P
ADDLE_SOURCE_DIR
}
/paddle/python/paddle/proto/
${
FIL_WE
}
_pb2.py
)
set
(
PROTO_GEN_PY
${
CUR_PROTO_GEN_PY
}
${
PROTO_GEN_PY
}
)
add_custom_command
(
OUTPUT
${
CUR_PROTO_GEN_PY
}
COMMAND
${
PROTOBUF_PROTOC_EXECUTABLE
}
ARGS
"--python_out=
${
P
ROJ_ROOT
}
/python/paddle/proto"
ARGS
"--python_out=
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/proto"
"-I"
${
CMAKE_CURRENT_SOURCE_DIR
}
${
ABS_FIL
}
DEPENDS
${
ABS_FIL
}
protoc
)
endforeach
()
...
...
python/CMakeLists.txt
浏览文件 @
33f21d05
set
(
OUTPUT_DIR
"
${
CMAKE_CURRENT_BINARY_DIR
}
/build"
)
file
(
GLOB TRAINER_PY_FILES . ./paddle/trainer/*.py
)
file
(
GLOB HELPERS_PY_FILES . ./paddle/trainer_config_helpers/*.py
)
...
...
@@ -18,7 +16,7 @@ SET(COPY_PADDLE_MASTER "")
if
(
WITH_GOLANG
)
SET
(
COPY_PADDLE_MASTER
"copy_paddle_master"
)
add_custom_command
(
TARGET
${
COPY_PADDLE_MASTER
}
COMMAND cp
${
paddle_master_LIB_PATH
}
${
P
ROJ_ROOT
}
/python/paddle/v2/master/
COMMAND cp
${
paddle_master_LIB_PATH
}
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/v2/master/
)
add_dependencies
(
copy_paddle_master paddle_master
)
endif
(
WITH_GOLANG
)
...
...
@@ -27,19 +25,21 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in
${
CMAKE_CURRENT_BINARY_DIR
}
/setup.py
)
add_custom_command
(
OUTPUT
${
P
ROJ_ROOT
}
/python/paddle/v2/framework/core.so
COMMAND cmake -E copy $<TARGET_FILE:paddle_pybind>
${
P
ROJ_ROOT
}
/python/paddle/v2/framework/core.so
add_custom_command
(
OUTPUT
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/v2/framework/core.so
COMMAND cmake -E copy $<TARGET_FILE:paddle_pybind>
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/v2/framework/core.so
DEPENDS paddle_pybind
)
add_custom_target
(
copy_paddle_pybind ALL DEPENDS
${
P
ROJ_ROOT
}
/python/paddle/v2/framework/core.so
)
add_custom_target
(
copy_paddle_pybind ALL DEPENDS
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/v2/framework/core.so
)
add_custom_command
(
OUTPUT
${
OUTPUT
_DIR
}
/.timestamp
add_custom_command
(
OUTPUT
${
PADDLE_PYTHON_BUILD
_DIR
}
/.timestamp
COMMAND env
${
py_env
}
${
PYTHON_EXECUTABLE
}
setup.py bdist_wheel
COMMAND
${
CMAKE_COMMAND
}
-E touch
${
OUTPUT_DIR
}
/.timestamp
COMMAND
${
CMAKE_COMMAND
}
-E touch
${
PADDLE_PYTHON_BUILD_DIR
}
/.timestamp
COMMAND
${
CMAKE_COMMAND
}
-E remove_directory
${
PADDLE_PYTHON_BUILD_DIR
}
/lib-python
COMMAND
${
CMAKE_COMMAND
}
-E copy_directory
${
PADDLE_PYTHON_BUILD_DIR
}
/lib*
${
PADDLE_PYTHON_BUILD_DIR
}
/lib-python
DEPENDS gen_proto_py copy_paddle_pybind framework_py_proto
${
PY_FILES
}
${
external_project_dependencies
}
${
COPY_PADDLE_MASTER
}
)
add_custom_target
(
paddle_python ALL DEPENDS
${
OUTPUT
_DIR
}
/.timestamp paddle_pserver_main paddle_trainer paddle_merge_model python_api_wheel
)
${
PADDLE_PYTHON_BUILD
_DIR
}
/.timestamp paddle_pserver_main paddle_trainer paddle_merge_model python_api_wheel
)
set
(
PADDLE_PYTHON_PACKAGE_DIR
${
CMAKE_CURRENT_BINARY_DIR
}
/dist/
)
...
...
python/paddle/trainer/config_parser.py
浏览文件 @
33f21d05
...
...
@@ -1604,6 +1604,8 @@ class MultiClassCrossEntropySelfNormCostLayer(LayerBase):
@
config_layer
(
'fc'
)
class
FCLayer
(
LayerBase
):
layer_type
=
'fc'
def
__init__
(
self
,
name
,
size
,
...
...
@@ -1611,14 +1613,27 @@ class FCLayer(LayerBase):
bias
=
True
,
error_clipping_threshold
=
None
,
**
xargs
):
super
(
FCLayer
,
self
).
__init__
(
name
,
'fc'
,
size
,
inputs
=
inputs
,
**
xargs
)
use_mkldnn
=
bool
(
int
(
g_command_config_args
.
get
(
"use_mkldnn"
,
0
)))
use_mkldnn_wgt
=
bool
(
int
(
g_command_config_args
.
get
(
"use_mkldnn_wgt"
,
0
)))
if
use_mkldnn
:
self
.
layer_type
=
'mkldnn_fc'
config_assert
(
len
(
inputs
)
==
1
,
"MkldnnFCLayer support one and only one input!"
)
super
(
FCLayer
,
self
).
__init__
(
name
,
self
.
layer_type
,
size
,
inputs
=
inputs
,
**
xargs
)
for
input_index
in
xrange
(
len
(
self
.
inputs
)):
input_layer
=
self
.
get_input_layer
(
input_index
)
psize
=
self
.
config
.
size
*
input_layer
.
size
dims
=
[
input_layer
.
size
,
self
.
config
.
size
]
format
=
self
.
inputs
[
input_index
].
format
sparse
=
format
==
"csr"
or
format
==
"csc"
if
use_mkldnn
:
config_assert
(
not
sparse
,
"MkldnnFCLayer do not support sparse format yet"
)
if
use_mkldnn_wgt
:
dims
=
[
self
.
config
.
size
,
input_layer
.
size
]
if
sparse
:
psize
=
self
.
inputs
[
input_index
].
nnz
else
:
...
...
@@ -1631,6 +1646,11 @@ class FCLayer(LayerBase):
self
.
config
.
error_clipping_threshold
=
error_clipping_threshold
@
config_layer
(
'mkldnn_fc'
)
class
MkldnnFcLayer
(
FCLayer
):
layer_type
=
'mkldnn_fc'
@
config_layer
(
'selective_fc'
)
class
SelectiveFCLayer
(
LayerBase
):
def
__init__
(
self
,
...
...
python/paddle/trainer_config_helpers/tests/CMakeLists.txt
浏览文件 @
33f21d05
#################### test_config_parser #########################
add_test
(
NAME layers_test
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ROJ_ROOT
}
/python/paddle/trainer_config_helpers/tests/layers_test.py
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/python/paddle
)
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/trainer_config_helpers/tests/layers_test.py
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/python/paddle
)
add_test
(
NAME test_reset_hook
COMMAND
${
P
ROJ_ROOT
}
/paddle/.set_python_path.sh -d
${
PROJ_ROOT
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ROJ_ROOT
}
/python/paddle/trainer_config_helpers/tests/test_reset_hook.py
WORKING_DIRECTORY
${
P
ROJ_ROOT
}
/python/paddle
)
COMMAND
${
P
ADDLE_SOURCE_DIR
}
/paddle/.set_python_path.sh -d
${
PADDLE_SOURCE_DIR
}
/python/
${
PYTHON_EXECUTABLE
}
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/trainer_config_helpers/tests/test_reset_hook.py
WORKING_DIRECTORY
${
P
ADDLE_SOURCE_DIR
}
/python/paddle
)
add_paddle_exe
(
protobuf_equal ProtobufEqualMain.cpp
)
add_test
(
NAME test_layerHelpers
COMMAND
${
P
ROJ_ROOT
}
/python/paddle/trainer_config_helpers/tests/configs/run_tests.sh
${
PYTHON_EXECUTABLE
}
${
P
ADDLE_SOURCE_DIR
}
/python/paddle/trainer_config_helpers/tests/configs/run_tests.sh
${
PYTHON_EXECUTABLE
}
${
CMAKE_CURRENT_BINARY_DIR
}
/protobuf_equal
)
python/paddle/v2/framework/.gitignore
0 → 100644
浏览文件 @
33f21d05
proto
python/paddle/v2/framework/tests/CMakeLists.txt
浏览文件 @
33f21d05
...
...
@@ -23,6 +23,5 @@ py_test(test_rowwise_add_op SRCS test_rowwise_add_op.py)
py_test
(
test_default_scope_funcs SRCS test_default_scope_funcs.py
)
py_test
(
test_operator SRCS test_operator.py
)
py_test
(
test_gaussian_random_op SRCS test_gaussian_random_op.py
)
# py_test(test_gaussian_random_op SRCS test_gaussian_random_op.py)
py_test
(
test_uniform_random_op SRCS test_uniform_random_op.py
)
python/paddle/v2/optimizer.py
浏览文件 @
33f21d05
import
paddle.trainer_config_helpers.config_parser_utils
as
config_parser_utils
import
paddle.trainer_config_helpers.optimizers
as
v1_optimizers
# 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.
"""
Optimizers(update equation) for SGD method.
TODO(zhihong) : create new optimizer with proto config, add new optimizer here
TODO(yuyang18): Complete comments.
"""
import
paddle.trainer_config_helpers.config_parser_utils
as
config_parser_utils
import
paddle.trainer_config_helpers.optimizers
as
v1_optimizers
from
paddle.proto.OptimizerConfig_pb2
import
OptimizerConfig
__all__
=
[
'Momentum'
,
'Adam'
,
'Adamax'
,
'AdaGrad'
,
'DecayedAdaGrad'
,
'AdaDelta'
,
'RMSProp'
,
'ModelAverage'
,
'L2Regularization'
...
...
@@ -70,7 +83,8 @@ class Optimizer(object):
gradient_machine.prefetch(in_args)
parameter_updater.getParametersRemote()
:param pserver_spec: pserver location, eg: localhost:3000
:param pserver_spec: pserver location, eg: localhost:3000, if use etcd,
pserver_spec should be the etcd endpoints, eg: http://localhost:2379
:return: parameter_updater
"""
if
is_local
:
...
...
python/paddle/v2/parameters.py
浏览文件 @
33f21d05
# 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.
import
numpy
as
np
from
paddle.proto.ParameterConfig_pb2
import
ParameterConfig
import
paddle.trainer.config_parser
as
cp
...
...
@@ -113,16 +127,7 @@ class Parameters(object):
"""
return
iter
(
self
.
__param_conf__
)
def
__getitem__
(
self
,
key
):
"""
Get parameter by parameter name. It uses Python dict syntax.
:note: It will always copy the parameter from C++ side.
:param key: Parameter name
:type key: basestring
:return: parameter value
:rtype: np.ndarray
"""
def
__getter_inner
(
self
,
key
,
param_type
):
import
py_paddle.swig_paddle
as
api
shape
=
self
.
get_shape
(
key
)
...
...
@@ -138,7 +143,7 @@ class Parameters(object):
each_gradient_machine
,
key
)
# for simplify implementation now, we always copy from C++
assert
isinstance
(
param
,
api
.
Parameter
)
val
=
param
.
getBuf
(
api
.
PARAMETER_VALUE
)
val
=
param
.
getBuf
(
param_type
)
assert
isinstance
(
val
,
api
.
Vector
)
val
=
val
.
copyToNumpyArray
()
return
val
...
...
@@ -146,6 +151,19 @@ class Parameters(object):
raise
RuntimeError
(
"Unexpected branch"
)
def
__getitem__
(
self
,
key
):
"""
Get parameter by parameter name. It uses Python dict syntax.
:note: It will always copy the parameter from C++ side.
:param key: Parameter name
:type key: basestring
:return: parameter value
:rtype: np.ndarray
"""
import
py_paddle.swig_paddle
as
api
return
self
.
__getter_inner
(
key
,
api
.
PARAMETER_VALUE
)
def
get_shape
(
self
,
key
):
"""
get shape of the parameter.
...
...
@@ -202,6 +220,19 @@ class Parameters(object):
"""
return
self
.
__getitem__
(
key
=
parameter_name
)
def
get_grad
(
self
,
key
):
"""
Get grandient by parameter name.
:note: It will always copy the parameter from C++ side.
:param key: parameter name
:type key: basestring
:return: The grandient matrix.
:rtype: np.ndarray
"""
import
py_paddle.swig_paddle
as
api
return
self
.
__getter_inner
(
key
,
api
.
PARAMETER_GRADIENT
)
def
set
(
self
,
parameter_name
,
value
):
"""
Set parameter by parameter name & matrix.
...
...
python/paddle/v2/trainer.py
浏览文件 @
33f21d05
...
...
@@ -161,14 +161,14 @@ class SGD(object):
self
.
__parameter_updater__
.
update
(
each_param
)
cost_sum
=
out_args
.
sum
()
cost
=
cost_sum
/
len
(
data_batch
)
self
.
__parameter_updater__
.
finishBatch
(
cost
)
batch_evaluator
.
finish
()
event_handler
(
v2_event
.
EndIteration
(
pass_id
=
pass_id
,
batch_id
=
batch_id
,
cost
=
cost
,
evaluator
=
batch_evaluator
))
self
.
__parameter_updater__
.
finishBatch
(
cost
)
batch_evaluator
.
finish
()
self
.
__parameter_updater__
.
finishPass
()
pass_evaluator
.
finish
()
...
...
python/setup.py.in
浏览文件 @
33f21d05
...
...
@@ -45,14 +45,14 @@ setup(name='paddlepaddle',
'': '${CMAKE_CURRENT_SOURCE_DIR}',
# The paddle.v2.framework.proto will be generated while compiling.
# So that package points to other directory.
'paddle.v2.framework.proto': '${P
ROJ_BINARY_ROOT
}/paddle/framework',
'py_paddle': '${P
ROJ_ROOT
}/paddle/py_paddle'
'paddle.v2.framework.proto': '${P
ADDLE_BINARY_DIR
}/paddle/framework',
'py_paddle': '${P
ADDLE_SOURCE_DIR
}/paddle/py_paddle'
},
scripts=['${P
ROJ_BINARY_ROOT
}/paddle/scripts/paddle'],
scripts=['${P
ADDLE_BINARY_DIR
}/paddle/scripts/paddle'],
distclass=BinaryDistribution,
data_files=[('/usr/local/opt/paddle/bin',
['${P
ROJ_BINARY_ROOT
}/paddle/scripts/paddle_usage',
'${P
ROJ_BINARY_ROOT
}/paddle/trainer/paddle_trainer',
'${P
ROJ_BINARY_ROOT
}/paddle/trainer/paddle_merge_model',
'${P
ROJ_BINARY_ROOT
}/paddle/pserver/paddle_pserver_main'])]
['${P
ADDLE_BINARY_DIR
}/paddle/scripts/paddle_usage',
'${P
ADDLE_BINARY_DIR
}/paddle/trainer/paddle_trainer',
'${P
ADDLE_BINARY_DIR
}/paddle/trainer/paddle_merge_model',
'${P
ADDLE_BINARY_DIR
}/paddle/pserver/paddle_pserver_main'])]
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录