@@ -4,93 +4,112 @@ PaddlePaddle的Docker容器使用方式
4
4
PaddlePaddle目前唯一官方支持的运行的方式是Docker容器。因为Docker能在所有主要操作系统(包括Linux,Mac OS X和Windows)上运行。 请注意,您需要更改 `Dockers设置 <https://github.com/PaddlePaddle/Paddle/issues/627 >`_ 才能充分利用Mac OS X和Windows上的硬件资源。
5
5
6
6
7
- PaddlePaddle发布的docker镜像使用说明
7
+ PaddlePaddle发布的Docker镜像使用说明
8
8
------------------------------
9
9
10
- 对于每一个PaddlePaddle版本,我们都会发布两种Docker镜像:开发镜像、运行镜像。运行镜像包括纯CPU版本和GPU版本以及其对应的非AVX版本。
11
- 我们会在 `dockerhub.com <https://hub.docker.com/r/paddledev/paddle/ >`_ 提供最新的docker镜像,可以在"tags"标签下找到最新的Paddle镜像版本。
10
+ 我们把PaddlePaddle的编译环境打包成一个镜像,称为开发镜像,里面涵盖了
11
+ PaddlePaddle需要的所有编译工具。把编译出来的PaddlePaddle也打包成一个镜
12
+ 像,称为生产镜像,里面涵盖了PaddlePaddle运行所需的所有环境。每次
13
+ PaddlePaddle发布新版本的时候都会发布对应版本的生产镜像以及开发镜像。运
14
+ 行镜像包括纯CPU版本和GPU版本以及其对应的非AVX版本。我们会在
15
+ `dockerhub.com <https://hub.docker.com/r/paddledev/paddle/ >`_ 提供最新
16
+ 的Docker镜像,可以在"tags"标签下找到最新的Paddle镜像版本。为了方便在国
17
+ 内的开发者下载Docker镜像,我们提供了国内的镜像服务器供大家使用。如果您
18
+ 在国内,请把文档里命令中的paddlepaddle/paddle替换成
19
+ docker.paddlepaddle.org/paddle。
20
+
12
21
1. 开发镜像::code: `paddlepaddle/paddle:<version>-dev `
13
22
14
- 这个镜像包含了Paddle相关的开发工具以及编译和运行环境。用户可以使用开发镜像代替配置本地环境,完成开发,编译,发布,
15
- 文档编写等工作。由于不同的Paddle的版本可能需要不同的依赖和工具,所以如果需要自行配置开发环境需要考虑版本的因素。
16
- 开发镜像包含了以下工具:
17
- - gcc/clang
18
- - nvcc
19
- - Python
20
- - sphinx
21
- - woboq
22
- - sshd
23
- 很多开发者会使用远程的安装有GPU的服务器工作,用户可以使用ssh登录到这台服务器上并执行 :code: `docker exec`进入开发镜像并开始工作,
24
- 也可以在开发镜像中启动一个SSHD服务,方便开发者直接登录到镜像中进行开发:
23
+ 这个镜像包含了Paddle相关的开发工具以及编译和运行环境。用户可以使用开发镜像代替配置本地环境,完成开发,编译,发布,
24
+ 文档编写等工作。由于不同的Paddle的版本可能需要不同的依赖和工具,所以如果需要自行配置开发环境需要考虑版本的因素。
25
+ 开发镜像包含了以下工具:
26
+
27
+ - gcc/clang
28
+ - nvcc
29
+ - Python
30
+ - sphinx
31
+ - woboq
32
+ - sshd
33
+ 很多开发者会使用远程的安装有GPU的服务器工作,用户可以使用ssh登录到这台服务器上并执行 :code: `docker exec`进入开发镜像并开始工作,
34
+ 也可以在开发镜像中启动一个SSHD服务,方便开发者直接登录到镜像中进行开发:
35
+
36
+ 以交互容器方式运行开发镜像:
37
+
38
+ .. code-block:: bash
39
+
40
+ docker run -it --rm paddlepaddle/paddle:<version>-dev /bin/bash
41
+
42
+ 或者,可以以后台进程方式运行容器:
43
+
44
+ .. code-block:: bash
45
+
46
+ docker run -d -p 2202:22 -p 8888:8888 paddledev/paddle:<version>-dev
25
47
26
- 以交互容器方式运行开发镜像 :
48
+ 然后用密码 :code:`root ` SSH进入容器 :
27
49
28
- .. code-block:: bash
50
+ .. code-block :: bash
29
51
30
- docker run -it --rm paddledev/paddle:<version>-dev /bin/bash
52
+ ssh -p 2202 root@localhost
31
53
32
- 或者,可以以后台进程方式运行容器:
54
+ SSH方式的一个优点是我们可以从多个终端进入容器。比如,一个终端运行vi,另一个终端运行Python。另一个好处是我们可以把PaddlePaddle容器运行在远程服务器上,并在笔记本上通过SSH与其连接。
33
55
34
- .. code-block:: bash
56
+ 2. 生产镜像:根据CPU、GPU和非AVX区分了如下4个镜像:
35
57
36
- docker run -d -p 2202:22 -p 8888:8888 paddledev/paddle:<version>-dev
58
+ - GPU/AVX::code: `paddlepaddle/paddle:<version>-gpu `
59
+ - GPU/no-AVX::code: `paddlepaddle/paddle:<version>-gpu-noavx `
60
+ - CPU/AVX::code: `paddlepaddle/paddle:<version> `
61
+ - CPU/no-AVX::code: `paddlepaddle/paddle:<version>-noavx `
37
62
38
- 然后用密码 :code:`root ` SSH进入容器 :
63
+ 纯CPU镜像以及GPU镜像都会用到AVX指令集,但是2008年之前生产的旧电脑不支持AVX。以下指令能检查Linux电脑是否支持AVX :
39
64
40
- .. code-block :: bash
65
+ .. code-block :: bash
41
66
42
- ssh -p 2202 root@localhost
67
+ if cat /proc/cpuinfo | grep -i avx ; then echo Yes ; else echo No ; fi
43
68
44
- SSH方式的一个优点是我们可以从多个终端进入容器。比如,一个终端运行vi,另一个终端运行Python。另一个好处是我们可以把PaddlePaddle容器运行在远程服务器上,并在笔记本上通过SSH与其连接。
69
+ 如果输出是No,就需要选择使用no-AVX的镜像
45
70
46
- 2. 运行镜像:根据CPU、GPU和非AVX区分了如下4个镜像:
47
- - GPU/AVX::code: `paddlepaddle/paddle:<version>-gpu `
48
- - GPU/no-AVX::code: `paddlepaddle/paddle:<version>-gpu-noavx `
49
- - CPU/AVX::code: `paddlepaddle/paddle:<version> `
50
- - CPU/no-AVX::code: `paddlepaddle/paddle:<version>-noavx `
71
+ 以上方法在GPU镜像里也能用,只是请不要忘记提前在物理机上安装GPU最新驱动。
72
+ 为了保证GPU驱动能够在镜像里面正常运行,我们推荐使用[nvidia-docker](https://github.com/NVIDIA/nvidia-docker)来运行镜像。
51
73
52
- 纯CPU镜像以及GPU镜像都会用到AVX指令集,但是2008年之前生产的旧电脑不支持AVX。以下指令能检查Linux电脑是否支持AVX:
74
+ .. code-block :: bash
53
75
54
- .. code-block :: bash
76
+ nvidia-docker run -it --rm paddledev/paddle:0.10.0rc1-gpu /bin/ bash
55
77
56
- if cat /proc/cpuinfo | grep -i avx ; then echo Yes ; else echo No ; fi
78
+ 注意: 如果使用nvidia-docker存在问题,你也许可以尝试更老的方法,具体如下,但是我们并不推荐这种方法。:
57
79
58
- 如果输出是No,就需要选择使用no-AVX的镜像
80
+ .. code-block :: bash
59
81
60
- 以上方法在GPU镜像里也能用,只是请不要忘记提前在物理机上安装GPU最新驱动。
61
- 为了保证GPU驱动能够在镜像里面正常运行,我们推荐使用[nvidia-docker](https://github.com/NVIDIA/nvidia-docker)来运行镜像。
82
+ export CUDA_SO=" $( \l s /usr/lib64/libcuda* | xargs -I{} echo ' -v {}:{}' ) $( \l s /usr/lib64/libnvidia* | xargs -I{} echo ' -v {}:{}' ) "
83
+ export DEVICES=$( \l s /dev/nvidia* | xargs -I{} echo ' --device {}:{}' )
84
+ docker run ${CUDA_SO} ${DEVICES} -it paddledev/paddle:< version> -gpu
62
85
63
- .. code-block :: bash
86
+ 3. 运行以及发布您的AI程序
64
87
65
- nvidia-docker run -it --rm paddledev/paddle:0.10.0rc1-gpu /bin/bash
88
+ 假设您已经完成了一个AI训练的python程序 :code: ` a.py `,这个程序是您在开发机上使用开发镜像完成开发。此时您可以运行这个命令在开发机上进行测试运行:
66
89
67
- 注意: 如果使用nvidia-docker存在问题,你也许可以尝试更老的方法,具体如下,但是我们并不推荐这种方法。:
90
+ .. code-block :: bash
68
91
69
- .. code-block :: bash
92
+ docker run -it -v $PWD :/work paddle /work/a.py
70
93
71
- export CUDA_SO=" $( \l s /usr/lib64/libcuda* | xargs -I{} echo ' -v {}:{}' ) $( \l s /usr/lib64/libnvidia* | xargs -I{} echo ' -v {}:{}' ) "
72
- export DEVICES=$( \l s /dev/nvidia* | xargs -I{} echo ' --device {}:{}' )
73
- docker run ${CUDA_SO} ${DEVICES} -it paddledev/paddle:< version> -gpu
94
+ 如果要使用GPU,请运行:
74
95
75
- 3. 使用运行镜像发布你的AI程序
76
- 假设您已经完成了一个AI训练的python程序 :code: `a.py `,这个程序是您在开发机上使用开发镜像完成开发。此时您可以运行这个命令在开发机上进行测试运行:
96
+ .. code-block :: bash
77
97
78
- .. code-block :: bash
98
+ nvidia-docker run -it -v $PWD :/work paddle /work/a.py
79
99
80
- docker run -it -v $PWD :/work paddle /work/a.py
81
100
82
- 这里`a.py`包含的所有依赖假设都可以在Paddle的运行容器中。如果需要包含更多的依赖、或者需要发布您的应用的镜像,可以编写`Dockerfile`使用`FROM paddledev/paddle:<version>`
83
- 创建和发布自己的AI程序镜像。
101
+ 这里`a.py`包含的所有依赖假设都可以在Paddle的运行容器中。如果需要包含更多的依赖、或者需要发布您的应用的镜像,可以编写`Dockerfile`使用`FROM paddledev/paddle:<version>`
102
+ 创建和发布自己的AI程序镜像。
84
103
85
- 运行PaddlePaddle书籍
104
+ 运行PaddlePaddle Book
86
105
---------------------
87
106
88
107
Jupyter Notebook是一个开源的web程序,大家可以通过它制作和分享带有代码、公式、图表、文字的交互式文档。用户可以通过网页浏览文档。
89
108
90
- PaddlePaddle书籍是为用户和开发者制作的一个交互式的Jupyter Nodebook。
91
- 如果您想要更深入了解deep learning,PaddlePaddle书籍一定是您最好的选择 。
109
+ PaddlePaddle Book是为用户和开发者制作的一个交互式的Jupyter Nodebook。
110
+ 如果您想要更深入了解deep learning,PaddlePaddle Book一定是您最好的选择 。
92
111
93
- 我们提供可以直接运行PaddlePaddle书籍的docker镜像 ,直接运行:
112
+ 我们提供可以直接运行PaddlePaddle Book的Docker镜像 ,直接运行:
94
113
95
114
.. code-block :: bash
96
115
@@ -109,53 +128,44 @@ PaddlePaddle书籍是为用户和开发者制作的一个交互式的Jupyter Nod
109
128
110
129
开发人员可以在Docker开发镜像中开发PaddlePaddle。这样开发人员可以以一致的方式在不同的平台上工作 - Linux,Mac OS X和Windows。
111
130
112
- 1. 构建开发镜像
131
+ 1. 制作PaddlePaddle开发镜像
113
132
114
- .. code-block :: bash
133
+ PaddlePaddle每次发布新版本都会发布对应的开发镜像供开发者直接使用。这里介绍如生成造这个开发镜像。
134
+ 生成Docker镜像的方式有两个,一个是直接把一个容器转换成镜像,另一个是创建Dockerfile并运行docker build指令按照Dockerfile生成镜像。第一个方法的好处是简单快捷,适合自己实验,可以快速迭代。第二个方法的好处是Dockerfile可以把整个生成流程描述很清楚,其他人很容易看懂镜像生成过程,持续集成系统也可以简单地复现这个过程。我们采用第二个方法。Dockerfile位于PaddlePaddle repo的根目录。生成生产镜像只需要运行:
115
135
116
- git clone --recursive https://github.com/PaddlePaddle/Paddle
136
+ .. code-block :: bash
137
+
138
+ git clone https://github.com/PaddlePaddle/Paddle.git
117
139
cd Paddle
118
140
docker build -t paddle:dev .
119
141
142
+ docker build这个命令的-t指定了生成的镜像的名字,这里我们用paddle:dev。到此,PaddlePaddle开发镜像就被构建完毕了。
120
143
121
- 请注意,默认情况下,:code: `docker build ` 不会将源码导入到镜像中并编译它。如果我们想这样做,需要构建完开发镜像,然后执行:
122
-
123
- .. code-block :: bash
124
-
125
- docker run -v $PWD :/paddle -e " WITH_GPU=OFF" -e " WITH_AVX=ON" -e " TEST=OFF" paddle:dev
126
-
127
-
128
- 2. 运行开发环境
144
+ 2. 制作PaddlePaddle生产镜像
129
145
130
- 当我们编译好了 :code: ` paddle:dev `, 我们可以在docker容器里做开发,源代码可以通过挂载本地文件来被载入Docker的开发环境里面 :
146
+ 生产镜像的生成分为两步,第一步是运行 :
131
147
132
148
.. code-block :: bash
149
+
150
+ docker run -v $( pwd) :/paddle -e " WITH_GPU=OFF" -e " WITH_AVX=OFF" -e " WITH_TEST=ON" paddle:dev
133
151
134
- docker run -d -p 2202:22 -v $PWD :/paddle paddle:dev sshd
152
+ 以上命令会编译PaddlePaddle,生成运行程序,以及生成创建生产镜像的Dockerfile。所有生成的的文件都在build目录下。“WITH_GPU”控制生成的生产镜像是否支持GPU,“WITH_AVX”控制生成的生产镜像是否支持AVX,”WITH_TEST“控制是否生成单元测试。
135
153
136
- 以上代码会启动一个带有PaddlePaddle开发环境的docker容器,源代码会被挂载到 :code: `/paddle ` 。
137
-
138
- 以上的 :code: `docker run ` 命令其实会启动一个在2202端口监听的SSHD服务器。这样,我们就能SSH进入我们的开发容器了:
154
+ 第二步是运行:
139
155
140
156
.. code-block :: bash
157
+
158
+ docker build -t paddle:prod -f build/Dockerfile ./build
141
159
142
- ssh root@localhost -p 2202
160
+ 以上命令会按照生成的Dockerfile把生成的程序拷贝到生产镜像中并做相应的配置,最终生成名为paddle:prod的生产镜像。
143
161
144
- 3. 在Docker开发环境中编译与安装PaddlPaddle代码
162
+ 3. 运行单元测试
145
163
146
- 当在容器里面的时候,可以用脚本 :code: ` paddle/scripts/docker/build.sh ` 来编译、安装与测试PaddlePaddle :
164
+ 运行以下指令 :
147
165
148
166
.. code-block :: bash
149
-
150
- /paddle/paddle/scripts/docker/build.sh
151
-
152
- 以上指令会在 :code: `/paddle/build ` 中编译PaddlePaddle。通过以下指令可以运行单元测试:
153
-
154
- .. code-block :: bash
155
-
156
- cd /paddle/build
157
- ctest
158
-
167
+
168
+ docker run -it -v $( pwd) :/paddle paddle:dev bash -c " cd /paddle/build && ctest"
159
169
160
170
文档
161
171
----
0 commit comments