From d5b7e92cab3f08f898da5bdb3f576dc9e3a166b3 Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Wed, 10 May 2017 10:53:46 +0800 Subject: [PATCH 1/6] Add dockerfile and build script for Android. --- Dockerfile.android | 43 ++++++++++++++++++++++++++ paddle/scripts/docker/build_android.sh | 25 +++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 Dockerfile.android create mode 100644 paddle/scripts/docker/build_android.sh diff --git a/Dockerfile.android b/Dockerfile.android new file mode 100644 index 0000000000..9df291250d --- /dev/null +++ b/Dockerfile.android @@ -0,0 +1,43 @@ +FROM ubuntu:16.04 +MAINTAINER PaddlePaddle Authors + +ARG UBUNTU_MIRROR +RUN /bin/bash -c 'if [[ -n ${UBUNTU_MIRROR} ]]; then sed -i 's#http://archive.ubuntu.com/ubuntu#${UBUNTU_MIRROR}#g' /etc/apt/sources.list; fi' + +ENV HOME=/root \ + ANDROID_HOME=/opt/android-sdk-linux \ + ANDROID_NDK_HOME=/opt/android-ndk-linux \ + ANDROID_STANDALONE_TOOLCHAIN=/opt/android-toolchain-gcc \ + PATH=${PATH}:${ANDROID_HOME}:${ANDROID_NDK_HOME} + +RUN apt-get update && \ + apt-get install -y git python-dev python-pip python-numpy && \ + apt-get install -y wget curl tar unzip && \ + apt-get install -y gcc g++ locales swig && \ + apt-get clean -y + +RUN pip install --upgrade pip && \ + pip install -U 'protobuf==3.1.0' && \ + pip install -U wheel sphinx && \ + pip install pre-commit + +# git credential to skip password typing +RUN git config --global credential.helper store + +# Fix locales to en_US.UTF-8 +RUN localedef -i en_US -f UTF-8 en_US.UTF-8 + +RUN curl -sSL https://cmake.org/files/v3.2/cmake-3.2.2.tar.gz | tar -xz && \ + cd cmake-3.2.2 && ./bootstrap && make -j `nproc` && make install && \ + cd .. && rm -rf cmake-3.2.2 + +# Android NDK +RUN mkdir /opt/android-ndk-tmp && \ + cd /opt/android-ndk-tmp && \ + wget -q https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip && \ + unzip -q android-ndk-r14b-linux-x86_64.zip && \ + mv android-ndk-r14b ${ANDROID_NDK_HOME} && \ + ${ANDROID_NDK_HOME}/build/tools/make-standalone-toolchain.sh --arch=arm --platform=android-21 --install-dir=${ANDROID_STANDALONE_TOOLCHAIN} && \ + rm -rf /opt/android-ndk-tmp + +CMD ["bash", "paddle/paddle/scripts/docker/build_android.sh"] diff --git a/paddle/scripts/docker/build_android.sh b/paddle/scripts/docker/build_android.sh new file mode 100644 index 0000000000..ab432c8524 --- /dev/null +++ b/paddle/scripts/docker/build_android.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -xe + +mkdir -p /paddle/build +cd /paddle/build +cmake -DCMAKE_SYSTEM_NAME=Android \ + -DANDROID_STANDALONE_TOOLCHAIN=$ANDROID_STANDALONE_TOOLCHAIN \ + -DANDROID_ABI=armeabi-v7a \ + -DANDROID_ARM_NEON=ON \ + -DANDROID_ARM_MODE=ON \ + -DHOST_C_COMPILER=/usr/bin/gcc \ + -DHOST_CXX_COMPILER=/usr/bin/g++ \ + -DCMAKE_INSTALL_PREFIX=/paddle/install \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O3" \ + -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="-O3" \ + -DWITH_C_API=ON \ + -DWITH_SWIG_PY=OFF \ + .. +make -j `nproc` +make install + +export PATH=/paddle/install/bin:/paddle/install/opt/paddle/bin:$PATH +paddle version From b5dd70fd862170fdcfe0c2e276002421ced76031 Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Wed, 10 May 2017 13:03:03 +0800 Subject: [PATCH 2/6] Remove the extra return statement. --- paddle/math/MathFunctions.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/paddle/math/MathFunctions.cpp b/paddle/math/MathFunctions.cpp index 1a3bb432bf..7045562dd4 100644 --- a/paddle/math/MathFunctions.cpp +++ b/paddle/math/MathFunctions.cpp @@ -180,7 +180,6 @@ int getri(const CBLAS_ORDER order, const int lda, const int* ipiv) { return dynload::PADDLE_DGETRI(order, N, A, lda, ipiv); - return 0; } template <> From 634648c2ecbc7d9332c00f7fdd8b81eae93dd78e Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Wed, 10 May 2017 13:03:03 +0800 Subject: [PATCH 3/6] Remove the extra return statement. --- Dockerfile.android | 2 +- paddle/math/MathFunctions.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile.android b/Dockerfile.android index 9df291250d..4d9ced33f4 100644 --- a/Dockerfile.android +++ b/Dockerfile.android @@ -40,4 +40,4 @@ RUN mkdir /opt/android-ndk-tmp && \ ${ANDROID_NDK_HOME}/build/tools/make-standalone-toolchain.sh --arch=arm --platform=android-21 --install-dir=${ANDROID_STANDALONE_TOOLCHAIN} && \ rm -rf /opt/android-ndk-tmp -CMD ["bash", "paddle/paddle/scripts/docker/build_android.sh"] +CMD ["bash", "/paddle/paddle/scripts/docker/build_android.sh"] diff --git a/paddle/math/MathFunctions.cpp b/paddle/math/MathFunctions.cpp index 1a3bb432bf..7045562dd4 100644 --- a/paddle/math/MathFunctions.cpp +++ b/paddle/math/MathFunctions.cpp @@ -180,7 +180,6 @@ int getri(const CBLAS_ORDER order, const int lda, const int* ipiv) { return dynload::PADDLE_DGETRI(order, N, A, lda, ipiv); - return 0; } template <> From 89bb7fd2bf53ec0fc731f163a70224eff3aa54a4 Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Mon, 15 May 2017 17:46:05 +0800 Subject: [PATCH 4/6] Delete the ndk directory in Dockerfile. --- Dockerfile.android | 7 +++---- paddle/scripts/docker/build_android.sh | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile.android b/Dockerfile.android index 4d9ced33f4..1334799ed2 100644 --- a/Dockerfile.android +++ b/Dockerfile.android @@ -5,10 +5,8 @@ ARG UBUNTU_MIRROR RUN /bin/bash -c 'if [[ -n ${UBUNTU_MIRROR} ]]; then sed -i 's#http://archive.ubuntu.com/ubuntu#${UBUNTU_MIRROR}#g' /etc/apt/sources.list; fi' ENV HOME=/root \ - ANDROID_HOME=/opt/android-sdk-linux \ ANDROID_NDK_HOME=/opt/android-ndk-linux \ - ANDROID_STANDALONE_TOOLCHAIN=/opt/android-toolchain-gcc \ - PATH=${PATH}:${ANDROID_HOME}:${ANDROID_NDK_HOME} + ANDROID_STANDALONE_TOOLCHAIN=/opt/android-toolchain-gcc RUN apt-get update && \ apt-get install -y git python-dev python-pip python-numpy && \ @@ -38,6 +36,7 @@ RUN mkdir /opt/android-ndk-tmp && \ unzip -q android-ndk-r14b-linux-x86_64.zip && \ mv android-ndk-r14b ${ANDROID_NDK_HOME} && \ ${ANDROID_NDK_HOME}/build/tools/make-standalone-toolchain.sh --arch=arm --platform=android-21 --install-dir=${ANDROID_STANDALONE_TOOLCHAIN} && \ - rm -rf /opt/android-ndk-tmp + rm -rf /opt/android-ndk-tmp && \ + rm -rf ${ANDROID_NDK_HOME} CMD ["bash", "/paddle/paddle/scripts/docker/build_android.sh"] diff --git a/paddle/scripts/docker/build_android.sh b/paddle/scripts/docker/build_android.sh index ab432c8524..bfa10c9155 100644 --- a/paddle/scripts/docker/build_android.sh +++ b/paddle/scripts/docker/build_android.sh @@ -4,6 +4,7 @@ set -xe mkdir -p /paddle/build cd /paddle/build +rm -f /paddle/install 2>/dev/null || true cmake -DCMAKE_SYSTEM_NAME=Android \ -DANDROID_STANDALONE_TOOLCHAIN=$ANDROID_STANDALONE_TOOLCHAIN \ -DANDROID_ABI=armeabi-v7a \ From 1b31a8df8b518bfa2e6f26b2d4d31d8dc3e41700 Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Mon, 15 May 2017 17:47:35 +0800 Subject: [PATCH 5/6] Install the paddle c-api libraries to subdirectory named by ANDROID_ABI. --- paddle/capi/CMakeLists.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/paddle/capi/CMakeLists.txt b/paddle/capi/CMakeLists.txt index 1b52a79ceb..206f512563 100644 --- a/paddle/capi/CMakeLists.txt +++ b/paddle/capi/CMakeLists.txt @@ -58,10 +58,16 @@ target_include_directories(paddle_capi_shared PUBLIC ${CMAKE_CURRENT_BINARY_DIR} link_paddle_exe(paddle_capi_shared) # install library & headers. -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${capi_whole_library} DESTINATION lib) install(FILES ${CAPI_HEADERS} DESTINATION include/paddle) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.h DESTINATION include/paddle) -install(TARGETS paddle_capi_shared DESTINATION lib) +if(ANDROID) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${capi_whole_library} + DESTINATION lib/${ANDROID_ABI}) + install(TARGETS paddle_capi_shared DESTINATION lib/${ANDROID_ABI}) +else(ANDROID) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${capi_whole_library} DESTINATION lib) + install(TARGETS paddle_capi_shared DESTINATION lib) +endif(ANDROID) # this variable used for unittest set(PADDLE_CAPI_INC_PATH From 44a022b0c7a5bedddb91cac5da2485b8e773c84c Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Thu, 18 May 2017 13:57:40 +0800 Subject: [PATCH 6/6] Use apt to install cmake. --- Dockerfile.android | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Dockerfile.android b/Dockerfile.android index 1334799ed2..fa24f6f06c 100644 --- a/Dockerfile.android +++ b/Dockerfile.android @@ -9,25 +9,21 @@ ENV HOME=/root \ ANDROID_STANDALONE_TOOLCHAIN=/opt/android-toolchain-gcc RUN apt-get update && \ - apt-get install -y git python-dev python-pip python-numpy && \ - apt-get install -y wget curl tar unzip && \ - apt-get install -y gcc g++ locales swig && \ + apt-get install -y \ + git python-dev python-pip python-numpy \ + wget curl tar unzip gcc g++ locales clang-format-3.8 swig cmake && \ apt-get clean -y -RUN pip install --upgrade pip && \ - pip install -U 'protobuf==3.1.0' && \ - pip install -U wheel sphinx && \ - pip install pre-commit - # git credential to skip password typing RUN git config --global credential.helper store # Fix locales to en_US.UTF-8 RUN localedef -i en_US -f UTF-8 en_US.UTF-8 -RUN curl -sSL https://cmake.org/files/v3.2/cmake-3.2.2.tar.gz | tar -xz && \ - cd cmake-3.2.2 && ./bootstrap && make -j `nproc` && make install && \ - cd .. && rm -rf cmake-3.2.2 +RUN pip install --upgrade pip && \ + pip install -U 'protobuf==3.1.0' && \ + pip install -U wheel sphinx && \ + pip install pre-commit # Android NDK RUN mkdir /opt/android-ndk-tmp && \