|
1 | 1 | #!/bin/bash
|
2 | 2 |
|
3 |
| -function abort(){ |
4 |
| - echo "An error occurred. Exiting..." 1>&2 |
5 |
| - exit 1 |
6 |
| -} |
7 |
| - |
8 |
| -trap 'abort' 0 |
9 | 3 | set -e
|
10 |
| -mkdir -p /paddle/dist/cpu |
11 |
| -mkdir -p /paddle/dist/gpu |
12 |
| -mkdir -p /paddle/dist/cpu-noavx |
13 |
| -mkdir -p /paddle/dist/gpu-noavx |
14 |
| -# Set BASE_IMAGE and DEB_PATH according to env variables |
| 4 | + |
| 5 | +# Set BASE_IMAGE according to env variables |
15 | 6 | if [ ${WITH_GPU} == "ON" ]; then
|
16 | 7 | BASE_IMAGE="nvidia/cuda:7.5-cudnn5-runtime-ubuntu14.04"
|
17 | 8 | # additional packages to install when building gpu images
|
18 |
| - GPU_DOCKER_PKG="python-pip" |
19 |
| - if [ ${WITH_AVX} == "ON" ]; then |
20 |
| - DEB_PATH="dist/gpu/" |
21 |
| - DOCKER_SUFFIX="gpu" |
22 |
| - else |
23 |
| - DEB_PATH="dist/gpu-noavx/" |
24 |
| - DOCKER_SUFFIX="gpu-noavx" |
25 |
| - fi |
| 9 | + GPU_DOCKER_PKG="python-pip python-dev" |
26 | 10 | else
|
27 | 11 | BASE_IMAGE="python:2.7.13-slim"
|
28 |
| - if [ ${WITH_AVX} == "ON" ]; then |
29 |
| - DEB_PATH="dist/cpu/" |
30 |
| - DOCKER_SUFFIX="cpu" |
31 |
| - else |
32 |
| - DEB_PATH="dist/cpu-noavx/" |
33 |
| - DOCKER_SUFFIX="noavx" |
34 |
| - fi |
35 | 12 | fi
|
36 |
| -# If Dockerfile.* sets BUILD_AND_INSTALL to 'ON', it would have copied |
37 |
| -# source tree to /paddle, and this scripts should build it into |
38 |
| -# /paddle/build. |
39 |
| -if [[ ${BUILD_AND_INSTALL:-OFF} == 'ON' ]]; then |
40 |
| - if [[ ${WITH_GPU:-OFF} == 'ON' ]]; then |
41 |
| - ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so /usr/lib/libcudnn.so |
42 |
| - fi |
43 |
| - |
44 |
| - mkdir -p /paddle/build # -p means no error if exists |
45 |
| - cd /paddle/build |
46 |
| - # clean local cmake and third_party cache |
47 |
| - if [ ${DELETE_BUILD_CACHE} == 'ON' ]; then |
48 |
| - rm -rf * && rm -rf ../third_party |
49 |
| - fi |
50 |
| - cmake .. \ |
51 |
| - -DCMAKE_BUILD_TYPE=Release \ |
52 |
| - -DWITH_DOC=${WITH_DOC:-OFF} \ |
53 |
| - -DWITH_GPU=${WITH_GPU:-OFF} \ |
54 |
| - -DWITH_AVX=${WITH_AVX:-OFF} \ |
55 |
| - -DWITH_SWIG_PY=ON \ |
56 |
| - -DCUDNN_ROOT=/usr/ \ |
57 |
| - -DWITH_STYLE_CHECK=OFF \ |
58 |
| - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON |
59 |
| - make -j `nproc` |
60 |
| - make install |
61 |
| - # generate deb package for current build |
62 |
| - # FIXME(typhoonzero): should we remove paddle/scripts/deb ? |
63 |
| - # FIXME: CPACK_DEBIAN_PACKAGE_DEPENDS removes all dev dependencies, must |
64 |
| - # install them in docker |
65 |
| - cpack -D CPACK_GENERATOR='DEB' -D CPACK_DEBIAN_PACKAGE_DEPENDS="" .. |
66 |
| - mv /paddle/build/*.deb /paddle/${DEB_PATH} |
67 |
| - |
68 |
| - if [[ ${BUILD_WOBOQ:-OFF} == 'ON' ]]; then |
69 |
| - apt-get install -y clang-3.8 llvm-3.8 libclang-3.8-dev |
70 |
| - # Install woboq_codebrowser. |
71 |
| - git clone https://github.com/woboq/woboq_codebrowser /woboq |
72 |
| - cd /woboq |
73 |
| - cmake -DLLVM_CONFIG_EXECUTABLE=/usr/bin/llvm-config-3.8 \ |
74 |
| - -DCMAKE_BUILD_TYPE=Release \ |
75 |
| - . |
76 |
| - make |
77 |
| - |
78 |
| - export WOBOQ_OUT=/usr/share/nginx/html/paddle |
79 |
| - export BUILD_DIR=/paddle/build |
80 |
| - mkdir -p $WOBOQ_OUT |
81 |
| - cp -rv /woboq/data $WOBOQ_OUT/../data |
82 |
| - /woboq/generator/codebrowser_generator \ |
| 13 | + |
| 14 | +DOCKERFILE_GPU_ENV="" |
| 15 | +if [[ ${WITH_GPU:-OFF} == 'ON' ]]; then |
| 16 | + DOCKERFILE_GPU_ENV="ENV LD_LIBRARY_PATH /usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}" |
| 17 | +fi |
| 18 | + |
| 19 | +mkdir -p /paddle/build |
| 20 | +cd /paddle/build |
| 21 | + |
| 22 | +# build script will not fail if *.deb does not exist |
| 23 | +rm *.deb || true |
| 24 | + |
| 25 | +cmake .. \ |
| 26 | + -DCMAKE_BUILD_TYPE=Release \ |
| 27 | + -DWITH_DOC=${WITH_DOC:-OFF} \ |
| 28 | + -DWITH_GPU=${WITH_GPU:-OFF} \ |
| 29 | + -DWITH_AVX=${WITH_AVX:-OFF} \ |
| 30 | + -DWITH_SWIG_PY=ON \ |
| 31 | + -DCUDNN_ROOT=/usr/ \ |
| 32 | + -DWITH_STYLE_CHECK=${WITH_STYLE_CHECK:-OFF} \ |
| 33 | + -DON_COVERALLS=${TEST:-OFF} \ |
| 34 | + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON |
| 35 | +make -j `nproc` |
| 36 | +if [[ ${TEST:-OFF} == "ON" ]]; then |
| 37 | + make coveralls |
| 38 | +fi |
| 39 | +make install |
| 40 | + |
| 41 | +# generate deb package for current build |
| 42 | +# FIXME(typhoonzero): should we remove paddle/scripts/deb ? |
| 43 | +# FIXME: CPACK_DEBIAN_PACKAGE_DEPENDS removes all dev dependencies, must |
| 44 | +# install them in docker |
| 45 | +cpack -D CPACK_GENERATOR='DEB' -D CPACK_DEBIAN_PACKAGE_DEPENDS="" .. |
| 46 | + |
| 47 | +if [[ ${BUILD_WOBOQ:-OFF} == 'ON' ]]; then |
| 48 | + apt-get install -y clang-3.8 llvm-3.8 libclang-3.8-dev |
| 49 | + # Install woboq_codebrowser. |
| 50 | + git clone https://github.com/woboq/woboq_codebrowser /woboq |
| 51 | + cd /woboq |
| 52 | + cmake -DLLVM_CONFIG_EXECUTABLE=/usr/bin/llvm-config-3.8 \ |
| 53 | + -DCMAKE_BUILD_TYPE=Release \ |
| 54 | + . |
| 55 | + make |
| 56 | + |
| 57 | + export WOBOQ_OUT=/usr/share/nginx/html/paddle |
| 58 | + export BUILD_DIR=/paddle/build |
| 59 | + mkdir -p $WOBOQ_OUT |
| 60 | + cp -rv /woboq/data $WOBOQ_OUT/../data |
| 61 | + /woboq/generator/codebrowser_generator \ |
83 | 62 | -b /paddle/build \
|
84 | 63 | -a \
|
85 | 64 | -o $WOBOQ_OUT \
|
86 | 65 | -p paddle:/paddle
|
87 |
| - /woboq/indexgenerator/codebrowser_indexgenerator $WOBOQ_OUT |
88 |
| - cd /woboq |
89 |
| - make clean |
90 |
| - fi |
91 |
| - |
92 |
| - pip install /usr/local/opt/paddle/share/wheels/py_paddle*linux*.whl |
93 |
| - pip install /usr/local/opt/paddle/share/wheels/paddle*.whl |
94 |
| - paddle version |
95 |
| - |
96 |
| - if [[ ${DOCKER_BUILD:-FALSE} == 'TRUE' ]]; then |
97 |
| - # reduce docker image size |
98 |
| - rm -rf /paddle/build |
99 |
| - rm -rf /usr/local/opt/paddle/share/wheels/ |
100 |
| - fi |
| 66 | + /woboq/indexgenerator/codebrowser_indexgenerator $WOBOQ_OUT |
| 67 | + cd /woboq |
| 68 | + make clean |
101 | 69 | fi
|
102 | 70 |
|
| 71 | +paddle version |
| 72 | + |
103 | 73 | # generate production docker image Dockerfile
|
104 | 74 | if [ ${USE_MIRROR} ]; then
|
105 | 75 | MIRROR_UPDATE="sed 's@http:\/\/archive.ubuntu.com\/ubuntu\/@mirror:\/\/mirrors.ubuntu.com\/mirrors.txt@' -i /etc/apt/sources.list && \\"
|
106 | 76 | else
|
107 | 77 | MIRROR_UPDATE="\\"
|
108 | 78 | fi
|
109 | 79 |
|
110 |
| -cat > /paddle/build/Dockerfile.${DOCKER_SUFFIX} <<EOF |
| 80 | +cat > /paddle/build/Dockerfile <<EOF |
111 | 81 | FROM ${BASE_IMAGE}
|
112 | 82 | MAINTAINER PaddlePaddle Authors <[email protected]>
|
113 | 83 |
|
114 |
| -# ENV variables |
115 |
| -ARG WITH_AVX |
116 |
| -ARG WITH_DOC |
117 |
| -ARG WITH_STYLE_CHECK |
118 |
| -
|
119 |
| -ENV WITH_GPU=${WITH_GPU} |
120 |
| -ENV WITH_AVX=\${WITH_AVX:-ON} |
121 |
| -ENV WITH_DOC=\${WITH_DOC:-OFF} |
122 |
| -ENV WITH_STYLE_CHECK=\${WITH_STYLE_CHECK:-OFF} |
123 |
| -
|
124 | 84 | ENV HOME /root
|
125 | 85 | ENV LANG en_US.UTF-8
|
126 | 86 |
|
127 | 87 | # Use Fix locales to en_US.UTF-8
|
128 | 88 |
|
129 | 89 | RUN ${MIRROR_UPDATE}
|
130 | 90 | apt-get update && \
|
131 |
| - apt-get install -y libgfortran3 ${GPU_DOCKER_PKG} && \ |
| 91 | + apt-get install -y libgfortran3 libpython2.7 ${GPU_DOCKER_PKG} && \ |
132 | 92 | apt-get clean -y && \
|
133 | 93 | pip install --upgrade pip && \
|
134 |
| - pip install -U 'protobuf==3.1.0' requests |
135 |
| -RUN pip install numpy |
| 94 | + pip install -U 'protobuf==3.1.0' requests numpy |
136 | 95 | # Use different deb file when building different type of images
|
137 |
| -ADD \$PWD/${DEB_PATH}*.deb /usr/local/opt/paddle/deb/ |
138 |
| -RUN dpkg --force-all -i /usr/local/opt/paddle/deb/*.deb && rm -f /usr/local/opt/paddle/deb/*.deb |
| 96 | +ADD build/*.deb /usr/local/opt/paddle/deb/ |
139 | 97 |
|
140 |
| -ENV PATH="/usr/local/opt/paddle/bin/:${PATH}" |
| 98 | +# run paddle version to install python packages first |
| 99 | +RUN dpkg -i /usr/local/opt/paddle/deb/*.deb && rm -f /usr/local/opt/paddle/deb/*.deb && paddle version |
| 100 | +
|
| 101 | +${DOCKERFILE_GPU_ENV} |
141 | 102 | # default command shows the paddle version and exit
|
142 | 103 | CMD ["paddle", "version"]
|
143 | 104 | EOF
|
144 |
| - |
145 |
| -trap : 0 |
0 commit comments