README.md 7.2 KB
Newer Older
1
# Building PaddlePaddle
G
gongweibao 已提交
2

3
## Goals
G
gongweibao 已提交
4

Y
Yi Wang 已提交
5
We want the building procedure generates Docker images so that we can run PaddlePaddle applications on Kubernetes clusters.
G
gongweibao 已提交
6

Y
Yi Wang 已提交
7
We want to build .deb packages so that enterprise users can run PaddlePaddle applications without Docker.
G
gongweibao 已提交
8

Y
Yi Wang 已提交
9
We want to minimize the size of generated Docker images and .deb packages so to reduce the download time.
G
gongweibao 已提交
10

11
We want to encapsulate building tools and dependencies in a *development* Docker image so to ease the tools installation for developers.
12

Y
Yi Wang 已提交
13
Developers use various editors (emacs, vim, Eclipse, Jupyter Notebook), so the development Docker image contains only building tools, not editing tools, and developers are supposed to git clone source code into their development computers and map the code into the development container.
14

Y
Yi Wang 已提交
15
We want the procedure and tools also work with testing, continuous integration, and releasing.
16 17


18
## Docker Images
19

Y
Yi Wang 已提交
20
So we need two Docker images for each version of PaddlePaddle:
21 22 23

1. `paddle:<version>-dev`

Y
Yi Wang 已提交
24
   This a development image contains only the development tools and standardizes the building procedure.  Users include:
25 26 27 28 29

   - developers -- no longer need to install development tools on the host, and can build their current work on the host (development computer).
   - release engineers -- use this to build the official release from certain branch/tag on Github.com.
   - document writers / Website developers -- Our documents are in the source repo in the form of .md/.rst files and comments in source code.  We need tools to extract the information, typeset, and generate Web pages.

Y
Yi Wang 已提交
30
   Of course, developers can install building tools on their development computers.  But different versions of PaddlePaddle might require different set or version of building tools.  Also, it makes collaborative debugging easier if all developers use a unified development environment.
31 32

  The development image should include the following tools:
33 34 35 36 37 38 39 40

   - gcc/clang
   - nvcc
   - Python
   - sphinx
   - woboq
   - sshd

Y
Yi Wang 已提交
41
   Many developers work on a remote computer with GPU; they could ssh into the computer and  `docker exec` into the development container. However, running `sshd` in the container allows developers to ssh into the container directly.
42 43 44 45 46 47 48 49 50 51

1. `paddle:<version>`

   This is the production image, generated using the development image. This image might have multiple variants:

   - GPU/AVX   `paddle:<version>-gpu`
   - GPU/no-AVX  `paddle:<version>-gpu-noavx`
   - no-GPU/AVX  `paddle:<version>`
   - no-GPU/no-AVX  `paddle:<version>-noavx`

Y
Yi Wang 已提交
52
   We allow users to choose between GPU and no-GPU because the GPU version image is much larger than then the no-GPU version.
53

Y
Yi Wang 已提交
54
   We allow users the choice between AVX and no-AVX, because some cloud providers don't provide AVX-enabled VMs.
55 56 57 58 59 60 61 62


## Development Environment

Here we describe how to use above two images.  We start from considering our daily development environment.

Developers work on a computer, which is usually a laptop or desktop:

Y
Yi Wang 已提交
63
<img src="doc/paddle-development-environment.png" width=500 />
64 65 66

or, they might rely on a more sophisticated box (like with GPUs):

Y
Yi Wang 已提交
67
<img src="doc/paddle-development-environment-gpu.png" width=500 />
68

Y
Yi Wang 已提交
69
A principle here is that source code lies on the development computer (host) so that editors like Eclipse can parse the source code to support auto-completion.
70

71

72
## Usages
73

74
### Build the Development Docker Image
75

Y
Yi Wang 已提交
76
The following commands check out the source code to the host and build the development image `paddle:dev`:
77

78 79 80
```bash
git clone https://github.com/PaddlePaddle/Paddle paddle
cd paddle
Y
yi.wu 已提交
81
docker build -t paddle:dev [--build-arg UBUNTU_MIRROR=mirror://mirrors.ubuntu.com/mirrors.txt] .
82
```
83

Y
yi.wu 已提交
84 85
The `docker build` command assumes that `Dockerfile` is in the root source tree.  Note that in this design, this `Dockerfile` is this only one in our repo. Add `--build-arg UBUNTU_MIRROR=mirror://mirrors.ubuntu.com/mirrors.txt`
if you want to use ubuntu mirrors to speed up the build.
G
gongweibao 已提交
86

87

88
### Build PaddlePaddle from Source Code
G
gongweibao 已提交
89

90
Given the development image `paddle:dev`, the following command builds PaddlePaddle from the source tree on the development computer (host):
91

92
```bash
Y
yi.wu 已提交
93 94
docker run -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_AVX=ON" \
    -e "TEST=ON" -e "BUILD_AND_INSTALL=ON" [-e "DELETE_BUILD_CACHE=ON"] paddle:dev
95
```
G
gongweibao 已提交
96

Y
Yi Wang 已提交
97
This command mounts the source directory on the host into `/paddle` in the container, so the default entry point of `paddle:dev`, `build.sh`, could build the source code with possible local changes.  When it writes to `/paddle/build` in the container, it writes to `$PWD/build` on the host indeed.
98

99
`build.sh` builds the following:
100

101 102 103
- PaddlePaddle binaries,
- `$PWD/build/paddle-<version>.deb` for production installation, and
- `$PWD/build/Dockerfile`, which builds the production Docker image.
104

Y
yi.wu 已提交
105 106 107 108 109 110
Environment varibles(use `ON` and `OFF` to put the switch on and off):
- `WITH_GPU`: build paddle with gpu driver and libraries.
- `WITH_AVX`: only lagacy hardwares without avx or sse or other [SIMD](https://en.wikipedia.org/wiki/SIMD) need to put it to "OFF"
- `TEST`: test after build
- `BUILD_AND_INSTALL`: put this to "OFF" if you don't really want to build, used to generate production Dockerfiles.
- `DELETE_BUILD_CACHE`: put this to "ON" when build paddle for multiple times, third_party will not download and build again.
111

112
### Build the Production Docker Image
113

114
The following command builds the production image:
115

116
```bash
Y
yi.wu 已提交
117
docker build -t paddle -f build/Dockerfile[.cpu|.gpu|.noavx|.gpu-noavx] .
118
```
119

Y
yi.wu 已提交
120 121
There are 4 different branch of the production image: cpu, gpu, noavx and gpu-noavx.
These images are made to minimal size -- they includes binary `paddle`, the shared library `libpaddle.so`, and Python runtime.
122

123
### Run PaddlePaddle Applications
124

Y
Yi Wang 已提交
125
Again the development happens on the host.  Suppose that we have a simple application program in `a.py`, we can test and run it using the production image:
126

127 128 129
```bash
docker run -it -v $PWD:/work paddle /work/a.py
```
130

131
But this works only if all dependencies of `a.py` are in the production image. If this is not the case, we need to build a new Docker image from the production image and with more dependencies installs.
132

Y
Yi Wang 已提交
133
### Build and Run PaddlePaddle Applications
G
gongweibao 已提交
134

135
We need a Dockerfile in https://github.com/paddlepaddle/book that builds Docker image `paddlepaddle/book:<version>`, basing on the PaddlePaddle production image:
136

137 138 139 140 141 142 143
```
FROM paddlepaddle/paddle:<version>
RUN pip install -U matplotlib jupyter ...
COPY . /book
EXPOSE 8080
CMD ["jupyter"]
```
G
gongweibao 已提交
144

145
The book image is an example of PaddlePaddle application image.  We can build it
146

147 148 149 150 151
```bash
git clone https://github.com/paddlepaddle/book
cd book
docker build -t book .
```
152

153
### Build and Run Distributed Applications
154

Y
Yi Wang 已提交
155
In our [API design doc](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/api.md#distributed-training), we proposed an API that starts a distributed training job on a cluster.  This API need to build a PaddlePaddle application into a Docker image as above and calls kubectl to run it on the cluster.  This API might need to generate a Dockerfile look like above and call `docker build`.
156

157
Of course, we can manually build an application image and launch the job using the kubectl tool:
G
gongweibao 已提交
158

159 160 161 162 163 164
```bash
docker build -f some/Dockerfile -t myapp .
docker tag myapp me/myapp
docker push
kubectl ...
```