提交 d6a7648a 编写于 作者: Y Yu Yang

Merge branch 'develop' of github.com:baidu/Paddle into feature/c_api

...@@ -13,7 +13,7 @@ ARG WITH_DOC ...@@ -13,7 +13,7 @@ ARG WITH_DOC
ARG WITH_STYLE_CHECK ARG WITH_STYLE_CHECK
ENV WOBOQ OFF ENV WOBOQ OFF
ENV WITH_GPU=${WITH_AVX:-OFF} ENV WITH_GPU=${WITH_GPU:-OFF}
ENV WITH_AVX=${WITH_AVX:-ON} ENV WITH_AVX=${WITH_AVX:-ON}
ENV WITH_DOC=${WITH_DOC:-OFF} ENV WITH_DOC=${WITH_DOC:-OFF}
ENV WITH_STYLE_CHECK=${WITH_STYLE_CHECK:-OFF} ENV WITH_STYLE_CHECK=${WITH_STYLE_CHECK:-OFF}
......
...@@ -28,6 +28,11 @@ ELSE(WIN32) ...@@ -28,6 +28,11 @@ ELSE(WIN32)
STRING(REGEX MATCH "[0-9]+.[0-9]+" VERSION "${MACOSX_VERSION}") STRING(REGEX MATCH "[0-9]+.[0-9]+" VERSION "${MACOSX_VERSION}")
SET(MACOS_VERSION ${VERSION}) SET(MACOS_VERSION ${VERSION})
SET(HOST_SYSTEM "macosx") SET(HOST_SYSTEM "macosx")
IF(NOT DEFINED ENV{MACOSX_DEPLOYMENT_TARGET})
# Set cache variable - end user may change this during ccmake or cmake-gui configure.
SET(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOS_VERSION} CACHE STRING
"Minimum OS X version to target for deployment (at runtime); newer APIs weak linked. Set to empty string for default value.")
ENDIF()
ELSE(APPLE) ELSE(APPLE)
IF(EXISTS "/etc/issue") IF(EXISTS "/etc/issue")
......
# Paddle发行规范
Paddle使用git-flow branching model做分支管理,使用[Semantic Versioning](http://semver.org/)标准表示Paddle版本号。
Paddle每次发新的版本,遵循以下流程:
1.`develop`分支派生出新的分支,分支名为`release/版本号`。例如,`release/0.10.0`
2. 将新分支的版本打上tag,tag为`版本号rc.Patch号`。第一个tag为`0.10.0rc1`,第二个为`0.10.0rc2`,依次类推。
3. 对这个版本的提交,做如下几个操作:
* 编译这个版本的Docker发行镜像,发布到dockerhub。如果失败,修复Docker编译镜像问题,Patch号加一,返回第二步
* 编译这个版本的Ubuntu Deb包。如果失败,修复Ubuntu Deb包编译问题,Patch号加一,返回第二步。
* 使用Regression Test List作为检查列表,测试Docker镜像/ubuntu安装包的功能正确性
* 如果失败,记录下所有失败的例子,在这个`release/版本号`分支中,修复所有bug后,Patch号加一,返回第二步
4. 第三步完成后,将`release/版本号`分支合入master分支,并删除`release/版本号`分支。将master分支的合入commit打上tag,tag为`版本号`。同时再将`master`分支合入`develop`分支。最后删除`release/版本号`分支。
5. 编译master分支的Docker发行镜像,发布到dockerhub。编译ubuntu的deb包,发布到github release页面
6. 协同完成Release Note的书写
需要注意的是:
* `release/版本号`分支一旦建立,一般不允许再从`develop`分支合入`release/版本号`。这样保证`release/版本号`分支功能的封闭,方便测试人员测试Paddle的行为。
*`release/版本号`分支存在的时候,如果有bugfix的行为,需要将bugfix的分支同时merge到`master`, `develop``release/版本号`这三个分支。
# Paddle 分支规范
Paddle开发过程使用[git-flow](http://nvie.com/posts/a-successful-git-branching-model/)分支规范,并适应github的特性做了一些区别。
* Paddle的主版本库遵循[git-flow](http://nvie.com/posts/a-successful-git-branching-model/)分支规范。其中:
* `master`分支为稳定(stable branch)版本分支。每一个`master`分支的版本都是经过单元测试和回归测试的版本。
* `develop`分支为开发(develop branch)版本分支。每一个`develop`分支的版本都经过单元测试,但并没有经过回归测试。
* `release/版本号`分支为每一次Release时建立的临时分支。在这个阶段的代码正在经历回归测试。
* 其他用户的fork版本库并不需要严格遵守[git-flow](http://nvie.com/posts/a-successful-git-branching-model/)分支规范,但所有fork的版本库的所有分支都相当于特性分支。
* 建议,开发者fork的版本库使用`develop`分支同步主版本库的`develop`分支
* 建议,开发者fork的版本库中,再基于`develop`版本fork出自己的功能分支。
* 当功能分支开发完毕后,向Paddle的主版本库提交`Pull Reuqest`,进而进行代码评审。
* 在评审过程中,开发者修改自己的代码,可以继续在自己的功能分支提交代码。
* BugFix分支也是在开发者自己的fork版本库维护,与功能分支不同的是,BugFix分支需要分别给主版本库的`master``develop`与可能有的`release/版本号`分支,同时提起`Pull Request`
# Paddle回归测试列表
本列表说明Paddle发版之前需要测试的功能点。
## Paddle Book中所有章节
Paddle每次发版本首先要保证Paddle Book中所有章节功能的正确性。功能的正确性包括验证Paddle目前的`paddle_trainer`训练和纯使用`Python`训练模型正确性。
| | 新手入门章节 | 识别数字 | 图像分类 | 词向量 | 情感分析 | 语意角色标注 | 机器翻译 | 个性化推荐 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| API.V2 + Docker + GPU | | | | | | | | |
| API.V2 + Docker + CPU | | | | | | | | |
| `paddle_trainer` + Docker + GPU | | | | | | | | |
| `paddle_trainer` + Docker + CPU | | | | | | | | |
| API.V2 + Ubuntu + GPU | | | | | | | | |
| API.V2 + Ubuntu + CPU | | | | | | | | |
| `paddle_trainer` + Ubuntu + GPU | | | | | | | | |
| `paddle_trainer` + Ubuntu + CPU | | | | | | | | |
...@@ -28,11 +28,12 @@ void testMatrixProjectionForward(int context_start, ...@@ -28,11 +28,12 @@ void testMatrixProjectionForward(int context_start,
std::max(0, (int)(context_start + context_length - 1)); std::max(0, (int)(context_start + context_length - 1));
if (pad == 0) is_padding = false; if (pad == 0) is_padding = false;
FunctionCompare test("ContextProjectionForward", FunctionCompare test(
FuncConfig() "ContextProjectionForward",
.set("context_length", context_length) FuncConfig()
.set("context_start", context_start) .set("context_length", context_length)
.set("begin_pad", std::max(0, -context_start))); .set("context_start", context_start)
.set("begin_pad", (size_t)std::max(0, -context_start)));
// prepare input arguments // prepare input arguments
test.addSequence(SequenceIdArg(TensorShape{batch_size})); test.addSequence(SequenceIdArg(TensorShape{batch_size}));
...@@ -51,7 +52,7 @@ void testMatrixProjectionForward(int context_start, ...@@ -51,7 +52,7 @@ void testMatrixProjectionForward(int context_start,
} }
void testMatrixProjectionBackward(int context_start, void testMatrixProjectionBackward(int context_start,
int context_length, size_t context_length,
bool is_padding, bool is_padding,
size_t batch_size, size_t batch_size,
size_t input_dim) { size_t input_dim) {
...@@ -59,13 +60,14 @@ void testMatrixProjectionBackward(int context_start, ...@@ -59,13 +60,14 @@ void testMatrixProjectionBackward(int context_start,
std::max(0, (int)(context_start + context_length - 1)); std::max(0, (int)(context_start + context_length - 1));
if (pad == 0) is_padding = false; if (pad == 0) is_padding = false;
FunctionCompare test("ContextProjectionBackward", FunctionCompare test(
FuncConfig() "ContextProjectionBackward",
.set("context_length", context_length) FuncConfig()
.set("context_start", context_start) .set("context_length", context_length)
.set("begin_pad", std::max(0, -context_start)) .set("context_start", context_start)
.set("is_padding", is_padding) .set("begin_pad", (size_t)std::max(0, -context_start))
.set("total_pad", pad)); .set("is_padding", is_padding)
.set("total_pad", pad));
// prepare input arguments // prepare input arguments
test.addSequence(SequenceIdArg(TensorShape{batch_size})); test.addSequence(SequenceIdArg(TensorShape{batch_size}));
......
...@@ -56,7 +56,14 @@ void TransLayer::backward(const UpdateCallback& callback) { ...@@ -56,7 +56,14 @@ void TransLayer::backward(const UpdateCallback& callback) {
return; return;
} }
MatrixPtr preGrad = getInputGrad(0); MatrixPtr preGrad = getInputGrad(0);
outputGrad->transpose(preGrad, false); if (preGrad) {
MatrixPtr transGrad = Matrix::create(preGrad->getHeight(),
preGrad->getWidth(),
/* trans= */ false,
preGrad->useGpu());
outputGrad->transpose(transGrad, false);
preGrad->add(*transGrad);
}
} }
} // namespace paddle } // namespace paddle
...@@ -1689,6 +1689,22 @@ TEST(Layer, smooth_l1) { ...@@ -1689,6 +1689,22 @@ TEST(Layer, smooth_l1) {
} }
} }
TEST(Layer, TransLayer) {
TestConfig config;
const int height = 128;
const int width = 1028;
config.layerConfig.set_type("trans");
config.layerConfig.set_size(width);
config.inputDefs.push_back(
{INPUT_DATA, "layer_0", /* dim= */ height * width, /* paraSize= */ 0});
config.layerConfig.add_inputs();
for (auto useGpu : {false, true}) {
testLayerGrad(config, "trans", height, /* trans= */ false, useGpu);
}
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
initMain(argc, argv); initMain(argc, argv);
......
...@@ -235,8 +235,10 @@ TEST(Matrix, unary) { ...@@ -235,8 +235,10 @@ TEST(Matrix, unary) {
testMatrixTranspose(height, width); testMatrixTranspose(height, width);
testMatrixRotate(height, width); testMatrixRotate(height, width);
} }
// inverse // inverse
#ifdef PADDLE_USE_LAPACK
testMatrixInverse(height); testMatrixInverse(height);
#endif
} }
} }
......
...@@ -75,9 +75,8 @@ fi ...@@ -75,9 +75,8 @@ fi
paddle version paddle version
# generate production docker image Dockerfile if [[ -n ${APT_MIRROR} ]]; then
if [ ${USE_MIRROR} ]; then MIRROR_UPDATE="sed -i '${APT_MIRROR}' /etc/apt/sources.list && \\"
MIRROR_UPDATE="sed 's@http:\/\/archive.ubuntu.com\/ubuntu\/@mirror:\/\/mirrors.ubuntu.com\/mirrors.txt@' -i /etc/apt/sources.list && \\"
else else
MIRROR_UPDATE="\\" MIRROR_UPDATE="\\"
fi fi
...@@ -99,6 +98,7 @@ ADD build/*.deb /usr/local/opt/paddle/deb/ ...@@ -99,6 +98,7 @@ ADD build/*.deb /usr/local/opt/paddle/deb/
# run paddle version to install python packages first # run paddle version to install python packages first
RUN dpkg -i /usr/local/opt/paddle/deb/*.deb && \ RUN dpkg -i /usr/local/opt/paddle/deb/*.deb && \
rm -f /usr/local/opt/paddle/deb/*.deb && \ rm -f /usr/local/opt/paddle/deb/*.deb && \
pip install /usr/opt/paddle/share/wheels/*.whl && \
paddle version paddle version
${CPU_DOCKER_PYTHON_HOME_ENV} ${CPU_DOCKER_PYTHON_HOME_ENV}
${DOCKERFILE_CUDNN_DSO} ${DOCKERFILE_CUDNN_DSO}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册