Skip to content

Commit

Permalink
Modify readme documents.
Browse files Browse the repository at this point in the history
  • Loading branch information
wanglei828 committed Apr 25, 2018
1 parent 57c48b1 commit 29df839
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 87 deletions.
104 changes: 45 additions & 59 deletions paddle/scripts/docker/README.md → paddle/scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,40 +13,49 @@ We want to make the building procedures:
1. Build docker images with PaddlePaddle pre-installed, so that we can run
PaddlePaddle applications directly in docker or on Kubernetes clusters.

To achieve this, we created a repo: https://github.com/PaddlePaddle/buildtools
which gives several docker images that are `manylinux1` sufficient. Then we
can build PaddlePaddle using these images to generate corresponding `whl`
binaries.
To achieve this, we maintain a dockerhub repo:https://hub.docker.com/r/paddlepaddle/paddle
which provides pre-built environment images to build PaddlePaddle and generate corresponding `whl`
binaries.(**We strongly recommend building paddlepaddle in our pre-specified Docker environment.**)

## Run The Build
## Development Workflow

Here we describe how the workflow goes on. We start from considering our daily development environment.

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

<img src="doc/paddle-development-environment.png" width=500 />

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

<img src="doc/paddle-development-environment-gpu.png" width=500 />

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.

## Build With Docker

### Build Environments

The pre-built build environment images are:
The lastest pre-built build environment images are:

| Image | Tag |
| ----- | --- |
| paddlepaddle/paddle_manylinux_devel | cuda7.5_cudnn5 |
| paddlepaddle/paddle_manylinux_devel | cuda8.0_cudnn5 |
| paddlepaddle/paddle_manylinux_devel | cuda7.5_cudnn7 |
| paddlepaddle/paddle_manylinux_devel | cuda9.0_cudnn7 |
| paddlepaddle/paddle | latest-dev |
| paddlepaddle/paddle | latest-dev-android |

### Start Build

Choose one docker image that suit your environment and run the following
command to start a build:

```bash
git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
docker run --rm -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_AVX=ON" -e "WITH_TESTING=OFF" -e "RUN_TEST=OFF" -e "PYTHON_ABI=cp27-cp27mu" paddlepaddle/paddle_manylinux_devel /paddle/paddle/scripts/docker/build.sh
./paddle/scripts/paddle_docker_build.sh build
```

After the build finishes, you can get output `whl` package under
`build/python/dist`.

This command mounts the source directory on the host into `/paddle` in the container, then run the build script `/paddle/paddle/scripts/docker/build.sh`
in the container. When it writes to `/paddle/build` in the container, it writes to `$PWD/build` on the host indeed.
This command will download the most recent dev image from docker hub, start a container in the backend and then run the build script `/paddle/paddle/scripts/paddle_build.sh build` in the container.
The container mounts the source directory on the host into `/paddle`.
When it writes to `/paddle/build` in the container, it writes to `$PWD/build` on the host indeed.

### Build Options

Expand All @@ -68,7 +77,6 @@ Users can specify the following Docker build arguments with either "ON" or "OFF"
| `WITH_DOC` | OFF | Build docs after build binaries. |
| `WOBOQ` | OFF | Generate WOBOQ code viewer under `build/woboq_out` |


## Docker Images

You can get the latest PaddlePaddle docker images by
Expand Down Expand Up @@ -144,59 +152,37 @@ docker push
kubectl ...
```

## Docker Images for Developers

We have a special docker image for developers:
`paddlepaddle/paddle:<version>-dev`. This image is also generated from
https://github.com/PaddlePaddle/buildtools

This a development image contains only the
development tools and standardizes the building procedure. Users include:

- 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.

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.

The development image contains the following tools:

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

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.


### Development Workflow

Here we describe how the workflow goes on. We start from considering our daily development environment.
### Reading source code with woboq codebrowser

Developers work on a computer, which is usually a laptop or desktop:
For developers who are interested in the C++ source code, you can build C++ source code into HTML pages using [Woboq codebrowser](https://github.com/woboq/woboq_codebrowser).

<img src="doc/paddle-development-environment.png" width=500 />
- The following command builds PaddlePaddle, generates HTML pages from C++ source code, and writes HTML pages into `$HOME/woboq_out` on the host:

or, they might rely on a more sophisticated box (like with GPUs):
```bash
./paddle/scripts/paddle_docker_build.sh html
```

<img src="doc/paddle-development-environment-gpu.png" width=500 />
- You can open the generated HTML files in your Web browser. Or, if you want to run a Nginx container to serve them for a wider audience, you can run:

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.
```
docker run -v $HOME/woboq_out:/usr/share/nginx/html -d -p 8080:80 nginx
```

### Reading source code with woboq codebrowser
## More Options

For developers who are interested in the C++ source code, please use -e "WOBOQ=ON" to enable the building of C++ source code into HTML pages using [Woboq codebrowser](https://github.com/woboq/woboq_codebrowser).
### Build Without Docker

- The following command builds PaddlePaddle, generates HTML pages from C++ source code, and writes HTML pages into `$HOME/woboq_out` on the host:
Follow the *Dockerfile* in the paddlepaddle repo to set up your local dev environment and run:

```bash
docker run -v $PWD:/paddle -v $HOME/woboq_out:/woboq_out -e "WITH_GPU=OFF" -e "WITH_AVX=ON" -e "WITH_TESTING=ON" -e "WOBOQ=ON" paddlepaddle/paddle:latest-dev
./paddle/scripts/paddle_build.sh build
```

- You can open the generated HTML files in your Web browser. Or, if you want to run a Nginx container to serve them for a wider audience, you can run:
### Additional Tasks

```
docker run -v $HOME/woboq_out:/usr/share/nginx/html -d -p 8080:80 nginx
You can get the help menu for the build scripts by running with no options:

```bash
./paddle/scripts/paddle_build.sh
or ./paddle/scripts/paddle_docker_build.sh
```
20 changes: 20 additions & 0 deletions paddle/scripts/paddle_build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ function print_usage() {
${BLUE}test${NONE}: run all unit tests
${BLUE}bind_test${NONE}: parallel tests bind to different GPU
${BLUE}doc${NONE}: generate paddle documents
${BLUE}html${NONE}: convert C++ source code into HTML
${BLUE}dockerfile${NONE}: generate paddle release dockerfile
${BLUE}capi${NONE}: generate paddle CAPI package
${BLUE}fluid_inference_lib${NONE}: deploy fluid inference library
Expand Down Expand Up @@ -357,6 +358,22 @@ EOF
make -j `nproc` paddle_docs paddle_apis
}

function gen_html() {
cat <<EOF
========================================
Converting C++ source code into HTML ...
========================================
EOF
export WOBOQ_OUT=${PADDLE_ROOT}/build/woboq_out
mkdir -p $WOBOQ_OUT
cp -rv /woboq/data $WOBOQ_OUT/../data
/woboq/generator/codebrowser_generator \
-b ${PADDLE_ROOT}/build \
-a \
-o $WOBOQ_OUT \
-p paddle:${PADDLE_ROOT}
/woboq/indexgenerator/codebrowser_indexgenerator $WOBOQ_OUT
}

function gen_dockerfile() {
# Set BASE_IMAGE according to env variables
Expand Down Expand Up @@ -464,6 +481,9 @@ function main() {
doc)
gen_docs
;;
html)
gen_html
;;
dockerfile)
gen_dockerfile
;;
Expand Down
32 changes: 4 additions & 28 deletions paddle/scripts/paddle_docker_build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.

function print_usage() {
RED='\033[0;31m'
BLUE='\033[0;34m'
BOLD='\033[1m'
NONE='\033[0m'

echo -e "\n${RED}Usage${NONE}:
${BOLD}$0${NONE} [OPTION]"

echo -e "\n${RED}Options${NONE}:
${BLUE}start${NONE}: start dev container
${BLUE}build${NONE}: run build for x86 platform
${BLUE}build_android${NONE}: run build for android platform
${BLUE}build_ios${NONE}: run build for ios platform
${BLUE}test${NONE}: run all unit tests
${BLUE}bind_test${NONE}: parallel tests bind to different GPU
${BLUE}doc${NONE}: generate paddle documents
${BLUE}dockerfile${NONE}: generate paddle release dockerfile
${BLUE}capi${NONE}: generate paddle CAPI package
${BLUE}fluid_inference_lib${NONE}: deploy fluid inference library
${BLUE}check_style${NONE}: run code style check
"
}

function container_running() {
name=$1
docker ps -a --format "{{.Names}}" | grep "${name}" > /dev/null
Expand Down Expand Up @@ -96,17 +72,17 @@ function main() {
start)
start_build_docker
;;
build | build_android | build_ios | test | bind_test | doc | dockerfile | capi | fluid_inference_lib | check_style)
build_android)
start_build_docker
docker exec ${CONTAINER_ID} bash -c "./paddle/scripts/paddle_build.sh $@"
*)
if container_running "${CONTAINER_ID}"; then
docker exec ${CONTAINER_ID} bash -c "./paddle/scripts/paddle_build.sh $@"
else
echo "Please start container first, with command:"
echo "$0 start"
fi
;;
*)
print_usage
;;
esac
}

Expand Down

0 comments on commit 29df839

Please sign in to comment.