|
1 |
| -安装PaddlePaddle的Docker镜像 |
2 |
| -============================ |
| 1 | +PaddlePaddle的Docker容器使用方式 |
| 2 | +================================ |
3 | 3 |
|
4 |
| -PaddlePaddle项目提供官方 `Docker <https://www.docker.com/>`_ 镜像。Docker镜像是我们目前唯一官方支持的部署和运行方式。 |
| 4 | +PaddlePaddle目前唯一官方支持的运行的方式是Docker容器。因为Docker能在所有主要操作系统(包括Linux,Mac OS X和Windows)上运行。 请注意,您需要更改 `Dockers设置 <https://github.com/PaddlePaddle/Paddle/issues/627>`_ 才能充分利用Mac OS X和Windows上的硬件资源。 |
5 | 5 |
|
6 |
| -下述内容将分为如下几个类别描述。 |
7 | 6 |
|
8 |
| -* PaddlePaddle提供的Docker镜像版本 |
9 |
| -* 下载和运行Docker镜像 |
10 |
| -* 注意事项 |
| 7 | +通过Docker容器开发PaddlePaddle |
| 8 | +------------------------------ |
11 | 9 |
|
12 |
| -PaddlePaddle提供的Docker镜像版本 |
13 |
| --------------------------------- |
| 10 | +开发人员可以在Docker中开发PaddlePaddle。这样开发人员可以以一致的方式在不同的平台上工作 - Linux,Mac OS X和Windows。 |
14 | 11 |
|
15 |
| -我们提供了12个 `Docker image <https://hub.docker.com/r/paddledev/paddle/tags/>`_ ,他们的image name都是 :code:`paddledev/paddle` ,tag分别为 |
| 12 | +1. 将开发环境构建为Docker镜像 |
| 13 | + |
| 14 | + .. code-block:: bash |
16 | 15 |
|
17 |
| -+-----------------+------------------+------------------------+-----------------------+ |
18 |
| -| | normal | devel | demo | |
19 |
| -+=================+==================+========================+=======================+ |
20 |
| -| CPU | cpu-latest | cpu-devel-latest | cpu-demo-latest | |
21 |
| -+-----------------+------------------+------------------------+-----------------------+ |
22 |
| -| GPU | gpu-latest | gpu-devel-latest | gpu-demo-latest | |
23 |
| -+-----------------+------------------+------------------------+-----------------------+ |
24 |
| -| CPU WITHOUT AVX | cpu-noavx-latest | cpu-noavx-devel-latest | cpu-noavx-demo-latest | |
25 |
| -+-----------------+------------------+------------------------+-----------------------+ |
26 |
| -| GPU WITHOUT AVX | gpu-noavx-latest | gpu-noavx-devel-latest | gpu-noavx-demo-latest | |
27 |
| -+-----------------+------------------+------------------------+-----------------------+ |
| 16 | + git clone --recursive https://github.com/PaddlePaddle/Paddle |
| 17 | + cd Paddle |
| 18 | + docker build -t paddle:dev -f paddle/scripts/docker/Dockerfile . |
28 | 19 |
|
29 |
| -其中,横向包括三个版本,normal,devel和demo。 |
30 | 20 |
|
31 |
| -* Normal: 正常的Docker image,只包括paddle的二进制 |
32 |
| -* Devel: 包括Paddle的二进制、编译环境和源代码 |
33 |
| -* Demo: 包括Paddle运行demo所需要的依赖 |
| 21 | + 请注意,默认情况下,:code:`docker build` 不会将源码导入到镜像中并编译它。如果我们想这样做,需要设置一个参数: |
34 | 22 |
|
35 |
| -纵向包括四个版本,他们是。 |
| 23 | + .. code-block:: bash |
36 | 24 |
|
37 |
| -* CPU: CPU版本。需要支持AVX指令集的CPU |
38 |
| -* GPU: GPU版本。需要支持AVX指令集的CPU |
39 |
| -* CPU WITHOUT AVX: CPU版本,不支持AVX指令集的CPU也可以运行 |
40 |
| -* GPU WITHOUT AVX: GPU版本,不需要AVX指令集的CPU也可以运行。 |
| 25 | + docker build -t paddle:dev -f paddle/scripts/docker/Dockerfile --build-arg BUILD_AND_INSTALL=ON . |
41 | 26 |
|
42 |
| -用户可以选择对应版本的docker image。使用如下脚本可以确定本机的CPU是否支持 :code:`AVX` 指令集\: |
43 | 27 |
|
44 |
| -.. code-block:: bash |
| 28 | +2. 运行开发环境 |
45 | 29 |
|
46 |
| - if cat /proc/cpuinfo | grep -q avx ; then echo "Support AVX"; else echo "Not support AVX"; fi |
| 30 | + 当我们编译好了 :code:`paddle:dev`, 我们可以在docker容器里做开发,源代码可以通过挂载本地文件来被载入Docker的开发环境里面: |
| 31 | + |
| 32 | + .. code-block:: bash |
47 | 33 |
|
48 |
| -如果输出 :code:`Support AVX`,则可以选择上表中的AVX版本PaddlePaddle。否则需要选择非AVX的PaddlePaddle。选择普通CPU版本的devel版本的image,则可以使用 :code:`paddledev/paddle:cpu-devel-latest` 来引用这个image。 |
| 34 | + docker run -d -p 2202:22 -v $PWD:/paddle paddle:dev |
49 | 35 |
|
50 |
| -PaddlePaddle提供的镜像并不包含任何命令运行,想要运行PaddlePaddle,您需要进入镜像运行PaddlePaddle |
51 |
| -程序或者自定义一个含有启动脚本的image。具体请参考注意事项中的 :code:`使用ssh访问PaddlePaddle镜像` |
| 36 | + 以上代码会启动一个带有PaddlePaddle开发环境的docker容器,源代码会被挂载到 :code:`/paddle` 。 |
52 | 37 |
|
53 |
| -下载和运行Docker镜像 |
54 |
| --------------------- |
| 38 | + 请注意, :code:`paddle:dev` 的默认入口是 :code:`sshd` 。以上的 :code:`docker run` 命令其实会启动一个在2202端口监听的SSHD服务器。这样,我们就能SSH进入我们的开发容器了: |
| 39 | + |
| 40 | + .. code-block:: bash |
55 | 41 |
|
56 |
| -为了运行PaddlePaddle的docker镜像,您需要在机器中安装好Docker。安装Docker需要您的机器 |
57 |
| -至少具有3.10以上的linux kernel。安装方法请参考 |
58 |
| -`Docker的官方文档 <https://docs.docker.com/engine/installation/>`_ 。如果您使用 |
59 |
| -mac osx或者是windows机器,请参考 |
60 |
| -`mac osx的安装文档 <https://docs.docker.com/engine/installation/mac/>`_ 和 |
61 |
| -`windows 的安装文档 <https://docs.docker.com/engine/installation/windows/>`_ 。 |
| 42 | + ssh root@localhost -p 2202 |
62 | 43 |
|
63 |
| -您可以使用 :code:`docker pull` 命令预先下载镜像,也可以直接执行 |
64 |
| -:code:`docker run` 命令运行镜像。执行方法如下: |
| 44 | +3. 在Docker开发环境中编译与安装PaddlPaddle代码 |
65 | 45 |
|
66 |
| -.. code-block:: bash |
67 |
| - |
68 |
| - $ docker run -it paddledev/paddle:cpu-latest |
| 46 | + 当在容器里面的时候,可以用脚本 :code:`paddle/scripts/docker/build.sh` 来编译、安装与测试PaddlePaddle: |
| 47 | + |
| 48 | + .. code-block:: bash |
| 49 | + |
| 50 | + /paddle/paddle/scripts/docker/build.sh |
69 | 51 |
|
70 |
| -即可启动和进入PaddlePaddle的container。如果运行GPU版本的PaddlePaddle,则需要先将 |
71 |
| -cuda相关的Driver和设备映射进container中,脚本类似于 |
| 52 | + 以上指令会在 :code:`/paddle/build` 中编译PaddlePaddle。通过以下指令可以运行单元测试: |
| 53 | + |
| 54 | + .. code-block:: bash |
72 | 55 |
|
73 |
| -.. code-block:: bash |
| 56 | + cd /paddle/build |
| 57 | + ctest |
74 | 58 |
|
75 |
| - $ export CUDA_SO="$(\ls /usr/lib64/libcuda* | xargs -I{} echo '-v {}:{}') $(\ls /usr/lib64/libnvidia* | xargs -I{} echo '-v {}:{}')" |
76 |
| - $ export DEVICES=$(\ls /dev/nvidia* | xargs -I{} echo '--device {}:{}') |
77 |
| - $ docker run ${CUDA_SO} ${DEVICES} -it paddledev/paddle:gpu-latest |
78 | 59 |
|
79 |
| -进入Docker container后,运行 :code:`paddle version` 即可打印出PaddlePaddle的版本和构建 |
80 |
| -信息。安装完成的PaddlePaddle主体包括三个部分, :code:`paddle` 脚本, python的 |
81 |
| -:code:`paddle` 包和 :code:`py_paddle` 包。其中\: |
| 60 | +纯CPU和GPU的docker镜像 |
| 61 | +---------------------- |
82 | 62 |
|
83 |
| -* :code:`paddle` 脚本和 :code:`paddle` 的python包是PaddlePaddle的训练主要程序。使用 |
84 |
| - :code:`paddle` 脚本可以启动PaddlePaddle的训练进程和pserver。而 :code:`paddle` 脚本 |
85 |
| - 中的二进制使用了 :code:`paddle` 的python包来做配置文件解析等工作。 |
86 |
| -* python包 :code:`py_paddle` 是一个swig封装的PaddlePaddle包,用来做预测和简单的定制化 |
87 |
| - 训练。 |
| 63 | +对于每一个PaddlePaddle版本,我们都会发布两个Docker镜像:纯CPU的和GPU的。我们通过设置 `dockerhub.com <https://hub.docker.com/r/paddledev/paddle/>`_ 自动运行以下两个命令: |
88 | 64 |
|
89 |
| -注意事项 |
90 |
| --------- |
| 65 | +.. code-block:: bash |
91 | 66 |
|
92 |
| -性能问题 |
93 |
| -++++++++ |
| 67 | + docker build -t paddle:cpu -f paddle/scripts/docker/Dockerfile . |
| 68 | + docker build -t paddle:gpu -f paddle/scripts/docker/Dockerfile.gpu . |
94 | 69 |
|
95 |
| -由于Docker是基于容器的轻量化虚拟方案,所以在CPU的运算性能上并不会有严重的影响。 |
96 |
| -而GPU的驱动和设备全部映射到了容器内,所以GPU在运算性能上也不会有严重的影响。 |
| 70 | +以交互容器方式运行纯CPU的镜像: |
97 | 71 |
|
98 |
| -但是如果使用了高性能的网卡,例如RDMA网卡(RoCE 40GbE 或者 IB 56GbE),或者高性能的 |
99 |
| -以太网卡 (10GbE)。推荐使用将本地网卡,即 "--net=host" 来进行训练。而不使用docker |
100 |
| -的网桥来进行网络通信。 |
| 72 | +.. code-block:: bash |
101 | 73 |
|
102 |
| -远程访问问题和二次开发 |
103 |
| -++++++++++++++++++++++ |
| 74 | + docker run -it --rm paddledev/paddle:cpu-latest /bin/bash |
104 | 75 |
|
105 |
| -由于PaddlePaddle的Docker镜像并不包含任何预定义的运行命令。所以如果想要在后台启用ssh |
106 |
| -远程访问,则需要进行一定的二次开发,将ssh装入系统内并开启远程访问。二次开发可以 |
107 |
| -使用Dockerfile构建一个全新的docker image。需要参考 |
108 |
| -`Dockerfile的文档 <https://docs.docker.com/engine/reference/builder/>`_ 和 |
109 |
| -`Dockerfile的最佳实践 <https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/>`_ |
110 |
| -两个文档。 |
| 76 | +或者,可以以后台进程方式运行容器: |
111 | 77 |
|
112 |
| -简单的含有ssh的Dockerfile如下: |
| 78 | +.. code-block:: bash |
113 | 79 |
|
114 |
| -.. code-block:: bash |
| 80 | + docker run -d -p 2202:22 paddledev/paddle:cpu-latest |
115 | 81 |
|
116 |
| - FROM paddledev/paddle:cpu-latest |
| 82 | +然后用密码 :code:`root` SSH进入容器: |
117 | 83 |
|
118 |
| - MAINTAINER PaddlePaddle dev team <[email protected]> |
| 84 | +.. code-block:: bash |
119 | 85 |
|
120 |
| - RUN apt-get update |
121 |
| - RUN apt-get install -y openssh-server |
122 |
| - RUN mkdir /var/run/sshd |
123 |
| - RUN echo 'root:root' | chpasswd |
| 86 | + ssh -p 2202 root@localhost |
124 | 87 |
|
125 |
| - RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config |
126 |
| - RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config |
| 88 | +SSH方式的一个优点是我们可以从多个终端进入容器。比如,一个终端运行vi,另一个终端运行Python。另一个好处是我们可以把PaddlePaddle容器运行在远程服务器上,并在笔记本上通过SSH与其连接。 |
127 | 89 |
|
128 |
| - EXPOSE 22 |
129 | 90 |
|
130 |
| - CMD ["/usr/sbin/sshd", "-D"] |
| 91 | +以上方法在GPU镜像里也能用-只是请不要忘记按装CUDA驱动,以及告诉Docker: |
131 | 92 |
|
| 93 | +.. code-block:: bash |
132 | 94 |
|
133 |
| -使用该Dockerfile构建出镜像,然后运行这个container即可。相关命令为\: |
| 95 | + export CUDA_SO="$(\ls /usr/lib64/libcuda* | xargs -I{} echo '-v {}:{}') $(\ls /usr/lib64/libnvidia* | xargs -I{} echo '-v {}:{}')" |
| 96 | + export DEVICES=$(\ls /dev/nvidia* | xargs -I{} echo '--device {}:{}') |
| 97 | + docker run ${CUDA_SO} ${DEVICES} -it paddledev/paddle:gpu-latest |
134 | 98 |
|
135 |
| -.. code-block:: bash |
136 | 99 |
|
137 |
| - # cd到含有Dockerfile的路径中 |
138 |
| - $ docker build . -t paddle_ssh |
139 |
| - # 运行这个container,将宿主机的8022端口映射到container的22端口上 |
140 |
| - $ docker run -d -p 8022:22 --name paddle_ssh_machine paddle_ssh |
| 100 | +非AVX镜像 |
| 101 | +--------- |
141 | 102 |
|
142 |
| -执行如下命令即可以关闭这个container,并且删除container中的数据\: |
| 103 | +纯CPU镜像以及GPU镜像都会用到AVX指令集,但是2008年之前生产的旧电脑不支持AVX。以下指令能检查Linux电脑是否支持AVX: |
143 | 104 |
|
144 |
| -.. code-block:: bash |
145 |
| - |
146 |
| - # 关闭container |
147 |
| - $ docker stop paddle_ssh_machine |
148 |
| - # 删除container |
149 |
| - $ docker rm paddle_ssh_machine |
150 | 105 |
|
151 |
| -如果想要在外部机器访问这个container,即可以使用ssh访问宿主机的8022端口。用户名为 |
152 |
| -root,密码也是root。命令为\: |
| 106 | +.. code-block:: bash |
153 | 107 |
|
154 |
| -.. code-block:: bash |
| 108 | + if cat /proc/cpuinfo | grep -i avx; then echo Yes; else echo No; fi |
155 | 109 |
|
156 |
| - $ ssh -p 8022 root@YOUR_HOST_MACHINE |
| 110 | +如果输出是No,我们就需要手动编译一个非AVX版本的镜像: |
157 | 111 |
|
158 |
| -至此,您就可以远程的使用PaddlePaddle啦。 |
| 112 | +.. code-block:: bash |
| 113 | +
|
| 114 | + cd ~ |
| 115 | + git clone https://github.com/PaddlePaddle/Paddle.git |
| 116 | + cd Paddle |
| 117 | + docker build --build-arg WITH_AVX=OFF -t paddle:cpu-noavx -f paddle/scripts/docker/Dockerfile . |
| 118 | + docker build --build-arg WITH_AVX=OFF -t paddle:gpu-noavx -f paddle/scripts/docker/Dockerfile.gpu . |
| 119 | +
|
| 120 | +
|
| 121 | +文档 |
| 122 | +---- |
| 123 | + |
| 124 | +Paddle的Docker镜像带有一个通过 `woboq code browser |
| 125 | +<https://github.com/woboq/woboq_codebrowser>`_ 生成的HTML版本的C++源代码,便于用户浏览C++源码。 |
| 126 | + |
| 127 | +只要在Docker里启动PaddlePaddle的时候给它一个名字,就可以再运行另一个Nginx Docker镜像来服务HTML代码: |
| 128 | + |
| 129 | +.. code-block:: bash |
| 130 | +
|
| 131 | + docker run -d --name paddle-cpu-doc paddle:cpu |
| 132 | + docker run -d --volumes-from paddle-cpu-doc -p 8088:80 nginx |
| 133 | +
|
| 134 | +接着我们就能够打开浏览器在 http://localhost:8088/paddle/ 浏览代码。 |
0 commit comments