Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
57119f61
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
57119f61
编写于
3月 06, 2017
作者:
T
Travis CI
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Deploy to GitHub Pages:
8bb2613f
上级
c339946e
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
111 addition
and
41 deletion
+111
-41
develop/doc_cn/_sources/howto/usage/k8s/k8s_distributed_cn.md.txt
...doc_cn/_sources/howto/usage/k8s/k8s_distributed_cn.md.txt
+56
-22
develop/doc_cn/howto/usage/k8s/k8s_distributed_cn.html
develop/doc_cn/howto/usage/k8s/k8s_distributed_cn.html
+54
-18
develop/doc_cn/searchindex.js
develop/doc_cn/searchindex.js
+1
-1
未找到文件。
develop/doc_cn/_sources/howto/usage/k8s/k8s_distributed_cn.md.txt
浏览文件 @
57119f61
...
...
@@ -43,22 +43,55 @@ docker push [YOUR_REPO]/paddle:mypaddle
注意上述命令中`[YOUR_REPO]`表示读者所使用的Docker镜像仓库地址,读者需要替换成自己使用的仓库地址。下文使用`[YOUR_REPO]/paddle:mypaddle`这个地址来表示此步骤所构建出的镜像。
###
上传训练文件
###
准备训练数据
本文使用PaddlePaddle官方的[recommendation demo](http://www.paddlepaddle.org/doc/demo/index.html#recommendation)作为这次训练的内容,我们将训练文件与数据放在一个job name命名的目录中,上传到volume所在的共享存储(使用不同分布式存储会有不同的挂载方式,需要要先挂载这个目录,然后拷贝数据)。完成后volume中的文件内容大致如下:
这里我们通过在Kubernetes集群上启动一个Job来下载并切割数据,也可以通过修改[k8s_train](./src/k8s_train/README.md)的内容来定制image.
```bash
[root@paddle-kubernetes-node0 mfs]# tree -d
在启动Job之前,需要根据不同的分布式存储来绑定一个[persistentVolumeClaim](https://kubernetes.io/docs/user-guide/persistent-volumes/),生成的数据将会存储在这个volume下.
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: paddle-data
spec:
template:
metadata:
name: pi
spec:
hostNetwork: true
containers:
- name: paddle-data
image: paddledev/paddle-tutorial:k8s_data
imagePullPolicy: Always
volumeMounts:
- mountPath: "/mnt"
name: nfs
env:
- name: OUT_DIR
value: /home/work/mfs/paddle-cluster-job
- name: SPLIT_COUNT
value: "3"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: mfs
restartPolicy: Never
```
完成后volume中的文件内容大致如下:
```base
[root@paddle-kubernetes-node0 nfsdir]$ tree -d
.
└──
paddle-cluster-job
├── data
│ ├── 0
│ │
│ ├── 1
│ │
│ └── 2
├──
output
└── recommendation
`--
paddle-cluster-job
|-- 0
| `-- data
|-- 1
| `-- data
|-- 2
| `-- data
|--
output
|-- quick_start
```
目录中paddle-cluster-job是本次训练对应的job name,本次训练要求有3个PaddlePaddle节点,在paddle-cluster-job/data目录中存放切分好的数据,文件夹0,1,2分别代表3个节点的trainer_id。recommendation文件夹内存放训练文件,output文件夹存放训练结果与日志。
...
...
@@ -118,15 +151,16 @@ spec:
`env`字段表示容器的环境变量,我们将`paddle`运行的一些参数通过这种方式传递到容器内。
`JOB_PATH`表示共享存储挂载的路径,`JOB_NAME`表示job名字,`TRAIN_CONFIG_DIR`表示本次训练文件所在目录,这三个变量组合就可以找到本次训练需要的文件路径。
`CONF_PADDLE_NIC`表示`paddle pserver`进程需要的`--nics`参数,即网卡名
`CONF_PADDLE_PORT`表示`paddle pserver`的`--port`参数,`CONF_PADDLE_PORTS_NUM`则表示稠密更新的端口数量,也就是`--ports_num`参数。
`CONF_PADDLE_PORTS_NUM_SPARSE`表示稀疏更新的端口数量,也就是`--ports_num_for_sparse`参数。
`CONF_PADDLE_GRADIENT_NUM`表示训练节点数量,即`--num_gradient_servers`参数
环境变量 | 说明
--- | ---
JOB_PATH | 共享存储挂在的路径
JOB_NAME | Job的名字
TRAIN_CONFIG_DIR | 本次训练文件所在目录,与JOB_PATH,JOB_NAME组合可以找到本次训练需要的文件路径
CONF_PADDLE_NIC | `paddle pserver`进程需要的`--nics`参数,即网卡名
CONF_PADDLE_PORT | `paddle paserver`的`--port`参数
CONF_PADDLE_PORTS_NUM | 稠密更新的端口数量,即`--ports_num`参数
CONF_PADDLE_PORTS_NUM_SPARSE | 稀疏更新的端口数量,即`--ports_num_for_sparse`参数
CONF_PADDLE_GRADIENT_NUM | 训练节点数量,即`--num_gradient_servers参数`
这些参数的具体描述,读者可以查看[这里](http://www.paddlepaddle.org/doc/ui/cmd_argument/detail_introduction.html#parameter-server-and-distributed-communication)。
...
...
develop/doc_cn/howto/usage/k8s/k8s_distributed_cn.html
浏览文件 @
57119f61
...
...
@@ -172,7 +172,7 @@
<li><a
class=
"reference internal"
href=
"#"
>
Kubernetes分布式训练
</a><ul>
<li><a
class=
"reference internal"
href=
"#"
>
整体方案
</a><ul>
<li><a
class=
"reference internal"
href=
"#"
>
制作镜像
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
上传训练文件
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
准备训练数据
</a></li>
<li><a
class=
"reference internal"
href=
"#job"
>
创建Job
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
查看输出
</a></li>
</ul>
...
...
@@ -250,19 +250,50 @@ $ docker build -t <span class="o">[</span>YOUR_REPO<span class="o">]</span>/padd
<p>
注意上述命令中
<code
class=
"docutils literal"
><span
class=
"pre"
>
[YOUR_REPO]
</span></code>
表示读者所使用的Docker镜像仓库地址,读者需要替换成自己使用的仓库地址。下文使用
<code
class=
"docutils literal"
><span
class=
"pre"
>
[YOUR_REPO]/paddle:mypaddle
</span></code>
这个地址来表示此步骤所构建出的镜像。
</p>
</div>
<div
class=
"section"
id=
""
>
<span
id=
"id3"
></span><h3>
上传训练文件
<a
class=
"headerlink"
href=
"#"
title=
"永久链接至标题"
>
¶
</a></h3>
<p>
本文使用PaddlePaddle官方的
<a
class=
"reference external"
href=
"http://www.paddlepaddle.org/doc/demo/index.html#recommendation"
>
recommendation demo
</a>
作为这次训练的内容,我们将训练文件与数据放在一个job name命名的目录中,上传到volume所在的共享存储(使用不同分布式存储会有不同的挂载方式,需要要先挂载这个目录,然后拷贝数据)。完成后volume中的文件内容大致如下:
</p>
<div
class=
"highlight-bash"
><div
class=
"highlight"
><pre><span></span><span
class=
"o"
>
[
</span>
root@paddle-kubernetes-node0 mfs
<span
class=
"o"
>
]
</span><span
class=
"c1"
>
# tree -d
</span>
<span
id=
"id3"
></span><h3>
准备训练数据
<a
class=
"headerlink"
href=
"#"
title=
"永久链接至标题"
>
¶
</a></h3>
<p>
这里我们通过在Kubernetes集群上启动一个Job来下载并切割数据,也可以通过修改
<a
class=
"reference internal"
href=
"src/k8s_train/README.html"
><span
class=
"doc"
>
k8s
</span></a>
的内容来定制image.
</p>
<p>
在启动Job之前,需要根据不同的分布式存储来绑定一个
<a
class=
"reference external"
href=
"https://kubernetes.io/docs/user-guide/persistent-volumes/"
>
persistentVolumeClaim
</a>
,生成的数据将会存储在这个volume下.
</p>
<div
class=
"highlight-yaml"
><div
class=
"highlight"
><pre><span></span><span
class=
"l l-Scalar l-Scalar-Plain"
>
apiVersion
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
batch/v1
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
kind
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
Job
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
metadata
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
name
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
paddle-data
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
spec
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
template
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
metadata
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
name
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
pi
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
spec
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
hostNetwork
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
true
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
containers
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"p p-Indicator"
>
-
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
name
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
paddle-data
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
image
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
paddledev/paddle-tutorial:k8s_data
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
imagePullPolicy
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
Always
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
volumeMounts
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"p p-Indicator"
>
-
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
mountPath
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"s"
>
"
/mnt
"
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
name
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
nfs
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
env
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"p p-Indicator"
>
-
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
name
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
OUT_DIR
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
value
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
/home/work/mfs/paddle-cluster-job
</span>
<span
class=
"p p-Indicator"
>
-
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
name
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
SPLIT_COUNT
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
value
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"s"
>
"
3
"
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
volumes
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"p p-Indicator"
>
-
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
name
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
nfs
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
persistentVolumeClaim
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
claimName
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
mfs
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
restartPolicy
</span><span
class=
"p p-Indicator"
>
:
</span>
<span
class=
"l l-Scalar l-Scalar-Plain"
>
Never
</span>
</pre></div>
</div>
<p>
完成后volume中的文件内容大致如下:
</p>
<div
class=
"highlight-base"
><div
class=
"highlight"
><pre><span></span>
[root@paddle-kubernetes-node0 nfsdir]$ tree -d
.
└──
paddle-cluster-job
├── data
│ ├──
<span
class=
"m"
>
0
</span>
│ │
│ ├──
<span
class=
"m"
>
1
</span>
│ │
│ └──
<span
class=
"m"
>
2
</span>
├──
output
└── recommendation
`--
paddle-cluster-job
|-- 0
| `-- data
|-- 1
| `-- data
|-- 2
| `-- data
|--
output
|-- quick_start
</pre></div>
</div>
<p>
目录中paddle-cluster-job是本次训练对应的job name,本次训练要求有3个PaddlePaddle节点,在paddle-cluster-job/data目录中存放切分好的数据,文件夹0,1,2分别代表3个节点的trainer_id。recommendation文件夹内存放训练文件,output文件夹存放训练结果与日志。
</p>
...
...
@@ -317,11 +348,16 @@ $ docker build -t <span class="o">[</span>YOUR_REPO<span class="o">]</span>/padd
</div>
<p>
文件中,
<code
class=
"docutils literal"
><span
class=
"pre"
>
metadata
</span></code>
下的
<code
class=
"docutils literal"
><span
class=
"pre"
>
name
</span></code>
表示这个job的名字。
<code
class=
"docutils literal"
><span
class=
"pre"
>
parallelism,completions
</span></code>
字段表示这个job会同时开启3个PaddlePaddle节点,成功训练且退出的pod数目为3时,这个job才算成功结束。然后申明一个存储卷
<code
class=
"docutils literal"
><span
class=
"pre"
>
jobpath
</span></code>
,代表宿主机目录
<code
class=
"docutils literal"
><span
class=
"pre"
>
/home/work/mfs
</span></code>
,在对容器的描述
<code
class=
"docutils literal"
><span
class=
"pre"
>
containers
</span></code>
字段中,将此目录挂载为容器的
<code
class=
"docutils literal"
><span
class=
"pre"
>
/home/jobpath
</span></code>
目录,这样容器的
<code
class=
"docutils literal"
><span
class=
"pre"
>
/home/jobpath
</span></code>
目录就成为了共享存储,放在这个目录里的文件其实是保存到了MFS上。
</p>
<p><code
class=
"docutils literal"
><span
class=
"pre"
>
env
</span></code>
字段表示容器的环境变量,我们将
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle
</span></code>
运行的一些参数通过这种方式传递到容器内。
</p>
<p><code
class=
"docutils literal"
><span
class=
"pre"
>
JOB_PATH
</span></code>
表示共享存储挂载的路径,
<code
class=
"docutils literal"
><span
class=
"pre"
>
JOB_NAME
</span></code>
表示job名字,
<code
class=
"docutils literal"
><span
class=
"pre"
>
TRAIN_CONFIG_DIR
</span></code>
表示本次训练文件所在目录,这三个变量组合就可以找到本次训练需要的文件路径。
</p>
<p><code
class=
"docutils literal"
><span
class=
"pre"
>
CONF_PADDLE_NIC
</span></code>
表示
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle
</span>
<span
class=
"pre"
>
pserver
</span></code>
进程需要的
<code
class=
"docutils literal"
><span
class=
"pre"
>
--nics
</span></code>
参数,即网卡名
</p>
<p><code
class=
"docutils literal"
><span
class=
"pre"
>
CONF_PADDLE_PORT
</span></code>
表示
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle
</span>
<span
class=
"pre"
>
pserver
</span></code>
的
<code
class=
"docutils literal"
><span
class=
"pre"
>
--port
</span></code>
参数,
<code
class=
"docutils literal"
><span
class=
"pre"
>
CONF_PADDLE_PORTS_NUM
</span></code>
则表示稠密更新的端口数量,也就是
<code
class=
"docutils literal"
><span
class=
"pre"
>
--ports_num
</span></code>
参数。
</p>
<p><code
class=
"docutils literal"
><span
class=
"pre"
>
CONF_PADDLE_PORTS_NUM_SPARSE
</span></code>
表示稀疏更新的端口数量,也就是
<code
class=
"docutils literal"
><span
class=
"pre"
>
--ports_num_for_sparse
</span></code>
参数。
</p>
<p><code
class=
"docutils literal"
><span
class=
"pre"
>
CONF_PADDLE_GRADIENT_NUM
</span></code>
表示训练节点数量,即
<code
class=
"docutils literal"
><span
class=
"pre"
>
--num_gradient_servers
</span></code>
参数
</p>
<p>
环境变量 | 说明
—
|
—
JOB_PATH | 共享存储挂在的路径
JOB_NAME | Job的名字
TRAIN_CONFIG_DIR | 本次训练文件所在目录,与JOB_PATH,JOB_NAME组合可以找到本次训练需要的文件路径
CONF_PADDLE_NIC |
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle
</span>
<span
class=
"pre"
>
pserver
</span></code>
进程需要的
<code
class=
"docutils literal"
><span
class=
"pre"
>
--nics
</span></code>
参数,即网卡名
CONF_PADDLE_PORT |
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle
</span>
<span
class=
"pre"
>
paserver
</span></code>
的
<code
class=
"docutils literal"
><span
class=
"pre"
>
--port
</span></code>
参数
CONF_PADDLE_PORTS_NUM | 稠密更新的端口数量,即
<code
class=
"docutils literal"
><span
class=
"pre"
>
--ports_num
</span></code>
参数
CONF_PADDLE_PORTS_NUM_SPARSE | 稀疏更新的端口数量,即
<code
class=
"docutils literal"
><span
class=
"pre"
>
--ports_num_for_sparse
</span></code>
参数
CONF_PADDLE_GRADIENT_NUM | 训练节点数量,即
<code
class=
"docutils literal"
><span
class=
"pre"
>
--num_gradient_servers参数
</span></code></p>
<p>
这些参数的具体描述,读者可以查看
<a
class=
"reference external"
href=
"http://www.paddlepaddle.org/doc/ui/cmd_argument/detail_introduction.html#parameter-server-and-distributed-communication"
>
这里
</a>
。
</p>
<p>
编写完YAML文件后,可以使用Kubernetes的命令行工具创建job。
</p>
<div
class=
"highlight-bash"
><div
class=
"highlight"
><pre><span></span>
kubectl create -f job.yaml
...
...
develop/doc_cn/searchindex.js
浏览文件 @
57119f61
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录