-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add PaddlePaddle QuickStart Demo on Kubernetes #293
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个patch里没有看到多机相关的配置,是否容易的实现一个多机的demo
@backyes 过几天会实现一个简单的多机训练demo |
Can refer cluster training: https://github.com/baidu/Paddle/blob/develop/doc/cluster/opensource/cluster_train.md |
@@ -0,0 +1,190 @@ | |||
# Paddle On Kubernetes | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里可以加一段summary。比如:
在这篇文档里,我们介绍如何在 Kubernetes 机群上启动一个单机单GPU的Paddle训练作业。在下一篇中,我们将介绍如何启动分布式训练作业。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
## 制作Docker镜像 | ||
|
||
本文使用QucikStart的例子来作为镜像,详细的Paddle镜像请参考[Docker installation guide](http://www.paddlepaddle.org/doc/build/docker_install.html),使用paddledev/paddle:cpu-demo-latest作为基础镜像。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这句话没有明白。建议改成说明为什么要制作镜像,而不能用标准镜像:
在一个功能齐全的Kubernetes机群里,通常我们会安装Ceph等分布式
操作系统来存储训练数据。这样的话,一个分布式Paddle训练任务中
的每个进程都可以从Ceph读取数据。在这个例子里,我们只演示一个
单机单GPU作业,所以可以简化对环境的要求,把训练数据直接放在
Paddle的Docker image里。为此,我们需要制作一个包含训练数据
的Paddle镜像。
Paddle 的 [Quick Start Tutorial](http://www.paddlepaddle.org/doc/demo/quick_start/index_en.html)
里介绍了用Paddle源码中的一个Python脚本下载训练数据的过程。
而 `paddledev/paddle` 镜像里有 Paddle 源码,(请注意,默认的
Paddle镜像 `paddle/paddle`是不包括源码的),所以我们可以执行
这个镜像来下载训练数据到Docker container里,然后把这个包含
了训练数据的container保存为一个新的镜像。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done,
通常我们会安装Ceph等分布式操作系统来存储训练数据
得改成分布式文件系统。。。我文档里也得改一下
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
棒!
|
||
``` | ||
|
||
下载完数据后,修改`/root/paddle/demo/quick_start/train.sh`文件,内容如下(增加了一条cd命令) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个看上去像Paddle的一个bug?是不是应该另外提交一个PR修复之?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
并不是bug,因为后面的cfg文件指定的是相对路径,加这条命令可以确保容器启动的时候顺利执行
Path: /home/work/paddle_output | ||
``` | ||
|
||
登录宿主机,查看结果。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我们还可以登录到宿主机上查看结果。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
我赞同单机训练和分布式训练写成两个文档。这个PR只描述单机训练。我的comment里有建议在这篇文档中解释一下还会有下一篇文档介绍分布式训练。 |
Coverage decreased (-0.01%) to 62.336% when pulling 5d6fcfb6406d66a5dcccc6cf160b99e9be9005e3 on drinktee:k8s into 93e4d0c on baidu:develop. |
分布式训练的文档已提交,有空请帮忙review一下吧 |
@drinktee 好的。这就来看。 之前我有些comments,如果说的不对,请回复指正我;如果已经修改过了,可以回复一个“done”,这样我就不用仔细查看你最新的commit和之前的commit的差别了。多谢呀! |
@@ -0,0 +1,290 @@ | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
文件名可以改成 distributed_training_on_kubernetes.md
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
# 使用Kubernetes进行分布式训练 | ||
|
||
>前一篇文章介绍了如何使用Kubernetes Job进行一次单机的Paddle训练。在这篇文档里,我们介绍如何使用 Kubernetes 进行Paddle的集群训练作业。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Markdown语法里,>
是用来表示引用的。这里没有引用什么。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done,已去掉 >
|
||
# 使用Kubernetes进行分布式训练 | ||
|
||
>前一篇文章介绍了如何使用Kubernetes Job进行一次单机的Paddle训练。在这篇文档里,我们介绍如何使用 Kubernetes 进行Paddle的集群训练作业。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
前一篇文章介绍了如何使用Kubernetes Job进行一次单机的Paddle训练。
前一篇文章介绍了如何在Kubernetes机群上启动一个单机Paddle训练作业(job)。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done, “Kubernetes机群”应该为集群吧
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
好的。“机群”和“集群“只要统一用一个我看就好。
|
||
# 使用Kubernetes进行分布式训练 | ||
|
||
>前一篇文章介绍了如何使用Kubernetes Job进行一次单机的Paddle训练。在这篇文档里,我们介绍如何使用 Kubernetes 进行Paddle的集群训练作业。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
到底用“文章”还是“文档”。请选一个。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done,选择使用“文章”
|
||
# 使用Kubernetes进行分布式训练 | ||
|
||
>前一篇文章介绍了如何使用Kubernetes Job进行一次单机的Paddle训练。在这篇文档里,我们介绍如何使用 Kubernetes 进行Paddle的集群训练作业。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我们介绍如何使用 Kubernetes 进行Paddle的集群训练作业
我们介绍如何在Kubernetes机群上启动分布式Paddle训练作业。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
@@ -0,0 +1,205 @@ | |||
# Paddle On Kubernetes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
是不是标题改成 Paddle on Kubernetes:单机训练
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
@@ -0,0 +1,290 @@ | |||
|
|||
# 使用Kubernetes进行分布式训练 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
标题改成“Paddle on Kubernetes:分布式训练”?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
## 制作Docker镜像 | ||
|
||
在一个功能齐全的Kubernetes机群里,通常我们会安装Ceph等分布式操作系统来存储训练数据。这样的话,一个分布式Paddle训练任务中的每个进程都可以从Ceph读取数据。在这个例子里,我们只演示一个单机作业,所以可以简化对环境的要求,把训练数据直接放在 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ceph等分布式文件系统
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
## 制作Docker镜像 | ||
|
||
在一个功能齐全的Kubernetes机群里,通常我们会安装Ceph等分布式操作系统来存储训练数据。这样的话,一个分布式Paddle训练任务中的每个进程都可以从Ceph读取数据。在这个例子里,我们只演示一个单机作业,所以可以简化对环境的要求,把训练数据直接放在 | ||
Paddle的Docker Image里。为此,我们需要制作一个包含训练数据的Paddle镜像。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Docker Image ==> Docker image
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
Paddle 的 [Quick Start Tutorial](http://www.paddlepaddle.org/doc/demo/quick_start/index_en.html) | ||
里介绍了用Paddle源码中的脚本下载训练数据的过程。 | ||
而 `paddledev/paddle:cpu-demo-latest` 镜像里有 Paddle 源码与Demo,( 请注意,默认的 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Demo ==> demo
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
Paddle 的 [Quick Start Tutorial](http://www.paddlepaddle.org/doc/demo/quick_start/index_en.html) | ||
里介绍了用Paddle源码中的脚本下载训练数据的过程。 | ||
而 `paddledev/paddle:cpu-demo-latest` 镜像里有 Paddle 源码与Demo,( 请注意,默认的 | ||
Paddle镜像 `paddledev/paddle:cpu-latest` 是不包括源码的, Paddle的各版本镜像可以参考 [Docker installation guide](http://www.paddlepaddle.org/doc/build/docker_install.html) ),所以我们使用这个镜像来下载训练数据到Docker Container中,然后把这个包含了训练数据的container保存为一个新的镜像。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Docker Container ==> Docker container
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
@drinktee 麻烦请先按照我的comments修改着。我发现此文引用的 https://github.com/baidu/Paddle/blob/develop/doc/cluster/opensource/cluster_train.md 文档需要写得更符合英语规范,所以我创建了 #391 在修复后者。花了不少时间,回头继续comment这个PR。 |
谢谢国彦和周倜的这个PR!内容和价值对paddle来说非常重要! 目前这个PR的两篇文档,我理解结构上还需要调整——才能清晰的描述Kubernetes是如何启动作业(尤其是分布式作业),以及这个tutorial是如何利用Kubernetes的机制,来启动分布式Paddle训练作业的。唯有如此,才能让读者知其然知其所以然。 我上学的时候,我的导师教我们写科技文章要做到:“环环相扣”和“滴水不漏”。希望我们这两篇文档也能达到这个要求。 所谓“环环相扣”是说句子之间要有逻辑传承——通常上一句是因,下一句是果。上一段是因,下一段是国。一个正例是某一篇技术文章的第一段是
一个负例是
这里“同时“没有承上启下的关系。而且fabric和ssh操作之前的关系到底是“谁方便了谁”没有说清楚。 所谓“滴水不漏”指的是逻辑推导过程中不能漏掉任何一环,别假设读者有足够的背景知识可以自行填补缺失的环节。 一个例子是:
这里其实没有说明白为什么需要引入workspace这么个概念,就开始引入了。 要实践好这两个目标看上去不容易。我努力做了一些comment,但是不全面,有不少其他地方需要做“类似修改”的。 此外,有一些基本文法可能需要注意。比如 “Docker Images”应该改成“Docker images”,因为Docker是专有名词,所以首字母大写;而images不是专有名词,所以首字母不大写。类似情况还有"Kubernetes pods"。 科技写作是一个想明白、说明白、写明白的过程。国彦可以在写的时候,架设有一帮听众在听。通常这个写作过程会比我们技术工作(验证Paddle分布式作业可以在Kubernetes机群上跑)化的时间更多,而不是更少。花费这个时间的价值在于,读者只需要读一遍就能明白,就能上手,中间不需要挠头不会有疑惑。唯有如此,我们的技术验证才有价值,否则就成了自己弄弄玩玩了。对吧? |
|
||
## 制作镜像 | ||
|
||
Paddle的集群训练需要有一个Paddle集群来实现,在本文中,我们使用Kubernetes来快速创建一个Paddle集群。我们使用 `paddledev/paddle:cpu-demo-latest` 镜像作为Paddle集群节点的运行环境,里面包含了 Paddle 运行所需要的相关依赖,同时,为了能将训练任务及配置统一分发到各个节点,需要使用到`sshd`以便使用`fabric`来操作。镜像的 Dockerfile 如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我们使用
paddledev/paddle:cpu-demo-latest
镜像作为Paddle集群节点的运行环境,里面包含了 Paddle 运行所需要的相关依赖,
“运行环境”这个词意思很泛,看上去没有这句话也不缺信息量。
“包含Paddle的所有依赖”的是 paddledev/paddle:cpu-demo-lastest 还是你从这个image derive出来的mypaddle呢?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
paddledev/paddle:cpu-demo-latest
镜像包括了Paddle运行demo所需要的依赖,mypaddle只是安装了sshd
FROM paddledev/paddle:cpu-demo-latest | ||
|
||
RUN apt-get update | ||
RUN apt-get install -y openssh-server |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
为什么需要一个image,里面除了paddle还有openssh server呢?
|
||
## 制作镜像 | ||
|
||
Paddle的集群训练需要有一个Paddle集群来实现,在本文中,我们使用Kubernetes来快速创建一个Paddle集群。我们使用 `paddledev/paddle:cpu-demo-latest` 镜像作为Paddle集群节点的运行环境,里面包含了 Paddle 运行所需要的相关依赖,同时,为了能将训练任务及配置统一分发到各个节点,需要使用到`sshd`以便使用`fabric`来操作。镜像的 Dockerfile 如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
使用 paddledev/ 下面的镜像是因为镜像里包含了Paddle的源码吗?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
使用 paddledev/ 下面的镜像是因为镜像里包含了Paddle的源码吗?
Paddle的所有镜像都在这个目录下面,在Docker hub上,Paddle官方只有这个paddledev
目录,paddledev/paddle:cpu-demo-latest
镜像包括了Paddle运行demo所需要的依赖
|
||
### 准备训练数据 | ||
|
||
在Paddle源码中,找到`demo/recommendation`文件夹,即为我们的Workspace, 在本文的环境中,路径为`/home/work/paddle-demo/Paddle/demo/recommendation` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/home/work/paddle-demo/Paddle
这个目录是在哪台机器上?—— 工作电脑?还是机群中的nodes?
在Paddle源码中,找到`demo/recommendation`文件夹,即为我们的Workspace, 在本文的环境中,路径为`/home/work/paddle-demo/Paddle/demo/recommendation` | ||
|
||
``` | ||
[root@paddle-k8s-node0 recommendation]# tree |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里看上去是要能ssh到Kubernetes机群中的某一个node?如果我们使用的是AWS的Kubernetes机群,可以ssh到node上去吗?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我担心即便AWS的权限允许我们这样做,似乎也不应该真的这么做。Kubernetes这样的分布式操作系统的设计基础,正是杜绝大家直接ssh到nodes上去提交作业,否则Kubernetes就无法正确估算每个node上的“空闲资源”,并且据此调度分布式作业了。
targetPort: 7164 | ||
``` | ||
|
||
为了创建多个Paddle节点,我们使用Kubernetes ReplicationController资源来控制Paddle集群中的节点数量,Paddle节点之间需要开放相关的端口来互相通信。下面的例子中,我们开放了每个Paddle节点的7164-7167端口,例如,一个包含4个节点的Paddle集群的yaml文件如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里的“节点”其实是“pod”吗?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里的Paddle节点其实就是k8s的pod,原来考虑到读者可能并不清楚k8s的一些名词,所以才使用了“节点”这个词
|
||
### 修改集群训练配置 | ||
|
||
参考[Cluster Training](https://github.com/baidu/Paddle/blob/develop/doc/cluster/opensource/cluster_train.md)中的介绍,我们使用`paddle/scripts/cluster_train/`中的文件来作为分布式训练任务的配置和启动脚本。在`run.sh`文件中,填入我们的workspace和训练配置文件路径。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里需要说明为什么需要“填入我们的workspace。。。”
targetPort: 7164 | ||
``` | ||
|
||
为了创建多个Paddle节点,我们使用Kubernetes ReplicationController资源来控制Paddle集群中的节点数量,Paddle节点之间需要开放相关的端口来互相通信。下面的例子中,我们开放了每个Paddle节点的7164-7167端口,例如,一个包含4个节点的Paddle集群的yaml文件如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
为什么是这四个端口,而不是其他四个端口?为什么是四个而不是其他数量?
|
||
## 开始集群训练 | ||
|
||
我们需要在`paddle/scripts/cluster_train/conf.py`文件中指定各个节点的IP地址以及开放的端口。根据上文创建的信息,`conf.py`文件修改如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个文档没有展示出在Kubernetes集群上启动分布式Paddle训练的全貌。没有能说明白其中的道理——Kubernetes是怎么描述和启动分布式作业的,我们是如何利用Kubernetes的特点来启动分布式Paddle训练作业的。
这个文档提到了要写一个yaml,但是没有说Kubernetes会根据这个yaml做什么;没有说明白这个yaml里的内容是如何启动Docker containers的;没有说明白Docker containers的入口是如何启动Paddle进程的;和run.sh以及Python脚本之间的关系如何。我理解需要一个比较大的结构调整,才能说得清楚。
|
||
# Paddle on Kubernetes:分布式训练 | ||
|
||
前一篇文章介绍了如何在Kubernetes集群上启动一个单机Paddle训练作业 (Job)。在这篇文章里,我们介绍如何在Kubernetes集群上启动分布式Paddle训练作业。关于Paddle的分布式集群训练,可以参考 [Cluster Training](https://github.com/baidu/Paddle/blob/develop/doc/cluster/opensource/cluster_train.md), 本文在此基础上,利用Kubernetes快速构建Paddle集群,进行分布式训练任务。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
“前一篇”需要一个超链接。
恩是的,多谢Yi哥指导,后续会提高质量,把内容写清楚,让读者容易理解。 |
@wangkuiyi @drinktee comment的时候注意对comments的聚合,避免触发的邮件太多。 |
``` | ||
#!/bin/sh | ||
python paddle.py \ | ||
--job_dispatch_package="/home/work/paddle-demo/Paddle/demo/recommendation" \ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里问题非常严重,直接导致训练结果是错误的。
paddle.py 提供了两个参数:
--job_dispatch_package
--job_workspace
其中,--job_dispatch_package直接将local的workspace推送到所有计算节点,因此最终每个节点的训练数据是一样的。该选项主要供初始用户调试熟悉多机训练,避免调试阶段准备所有节点workspace费时费力。
待用户将整个模型调通后,可以使用--job_workspace 选项指定所有节点都已经存在的某个workspace进行训练,但是用户仍然需要人工划分训练数据到不同节点,并修改所有节点的train.list和test.list.
综合来说,由于开源初期人力有限,准备了这样一个简单的多机训练脚本,但是最终完善的多机训练需要自动化用户对数据存储、手动划分、填充train.list/test.list的过程。
@drinktee 能否在K8S多机发布前,提供人力将这块完善起来?
另外关于K8S的用法,能否产出一些代码,降低用户使用的门槛,比如基于某商用云产出一套代码。 |
@backyes 恩,我们现在也在致力于降低用户使用门槛,方便paddle部署在各个公有云上,第一步是aws。 |
@wangkuiyi 我和国彦今天讨论了一下,感觉这个分布式系统的设计需要修改,我们自己这儿需要做一个包含服务发现以及trigger的镜像,作为paddle server镜像的一个sidekick起在同一个pod里,这样,我们不需要改动原有的paddle demo镜像,而完成分布式训练。 具体参考https://www.usenix.org/system/files/conference/hotcloud16/hotcloud16_burns.pdf 的scatter/gather pattern来做,但可能有所不同,如燕飞所提到的分发训练数据的mapper,我们可能需要和益哥进一步的讨论。 |
@drinktee |
第一篇没问题。明天早起看第二篇。 |
以后可以注意每个PR尽量小,这样更容易review和merge。:-) |
|
||
### Node | ||
|
||
[`Node`](http://kubernetes.io/docs/admin/node/) 表示一个k8s集群中的一个工作节点,这个节点可以是物理机或者虚拟机,k8s集群就是由`node`节点与`master`节点组成的。每个node都安装有Docker,在本文的例子中,`Paadle`容器就在node上运行。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
node
是物理机或者虚拟机
pod
个�pod中的所有容器会被调度到同一个node上
这里提到node可以是虚拟机,可以是container虚机么? 如果是,那么一个pod中所有容器(假如有两个container容器)能被调度到一个node上?, 抽象出来,就是多个container能运行到一个container,这个感觉逻辑上有点问题?
我理解node里提到的虚拟机应该是非container虚机,而是类似kvm这种虚机,对吧?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
node可以是虚拟机,虚拟机(VM)和和容器(container)是两个概念,这里说的虚拟机不包括container。就是你理解的类似kvm这种虚机,
|
||
### Pod | ||
|
||
一个[`Pod`](http://kubernetes.io/docs/user-guide/pods/) 是一组(一个或多个)容器,pod是k8s的最小调度单元,一个pod中的所有容器会被调度到同一个node上。Pod中的容器共享NET,PID,IPC,UTS等Linux namespace,它们使用同一个IP地址,可以通过`localhost`互相通信。不同pod之间可以通过IP地址访问。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
一个�pod中的所有容器会被调度到同一个node上
貌似有编码问题,有乱码。
|
||
### Node | ||
|
||
[`Node`](http://kubernetes.io/docs/admin/node/) 表示一个k8s集群中的一个工作节点,这个节点可以是物理机或者虚拟机,k8s集群就是由`node`节点与`master`节点组成的。每个node都安装有Docker,在本文的例子中,`Paadle`容器就在node上运行。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Paadle
容器就在node上运行。
Paadle -> PaddlePaddle。 文档中尽量都用PaddlePaddle产品名,paddle是code name
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
文章标题 是不是也得改成PaddlePaddle on XXXXX
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
嗯,
|
||
# Paddle on Kubernetes:分布式训练 | ||
|
||
前一篇文章介绍了如何在Kubernetes集群上启动一个单机Paddle训练作业 (Job)。在这篇文章里,我们介绍如何在Kubernetes集群上进行分布式Paddle训练作业。关于Paddle的分布式训练,可以参考 [Cluster Training](https://github.com/baidu/Paddle/blob/develop/doc/cluster/opensource/cluster_train.md), 本文利用Kubernetes的调度功能与容器编排能力,快速构建Paddle容器集群,进行分布式训练任务。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Paddle -> PaddlePaddle
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
### 前提条件 | ||
|
||
首先,我们需要拥有一个k8s集群,在这个集群中所有node与pod都可以互相通信。关于k8s集群搭建,可以参考[官方文档](http://kubernetes.io/docs/getting-started-guides/kubeadm/),在以后的文章中我们也会介绍AWS上搭建的方案。在本文的环境中,k8s集群中所有node都挂载了一个`mfs`(分布式文件系统)共享目录,我们通过这个目录来存放训练文件与最终输出的模型。在训练之前,用户将配置与训练数据切分好放在mfs目录中,训练时,程序从此目录拷贝文件到容器内进行训练,将结果保存到此目录里。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里能否给出一张简图, 描述一个PaddlePaddle多机作业如何映射到Node\Pod\Volume\Namespace的,会不会更加直观?我在理解文章的时候,也是要试图不断从上下文推断,才能画出一个架构图。
图可能比较直观的描述Paddle的分布式如何映射到k8s node\pod\volume\namespace的。
不知道是否正确?
- 示例中,具体node怎么映射的还不是很清楚(我理解应该是k8s基于最小粒度pod调度,所以三个pod都在一个node上,也可能在多个node上)
由于Paddle有trainer_count参数,一般设置等于host机器物理core-1。 这块可以稍微说明下,建议用户如何映射pod和node,不知道k8是否有这种功能。因为Paddle是计算密集的应用,从k8s的container到物理机之间的映射关系最好能稍微说一下建议的组织方式,以期望获取合理的训练体验。
是这样:
还是这样?
有说的不妥的,欢迎指正。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里能否给出一张简图, 描述一个PaddlePaddle多机作业如何映射到Node\Pod\Volume\Namespace的,会不会更加直观?
恩,我会加一个结构图进去,“pod是否在同一个node上,或者3个node上”,这个是不一定的,一般pod中是可以设置此pod的资源配额,比如CPU,内存数量(这个字段我没有在yaml文件中写出来),k8s会将pod调度到有足够资源的node上。
一般设置等于host机器物理core-1
这种情况下,一台机器就只能运行一个pod了。每个pod就会分配到不同机器上
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这种情况下,一台机器就只能运行一个pod了。每个pod就会分配到不同机器上
我是建议有这样一个section 描述如何配置pod资源配合来适配paddle本身并行机制, 否则这只能算一个toy demo。
@wangkuiyi 您的建议是?
|
||
### 启动训练 | ||
|
||
在容器启动后,会通过脚本来启动这次分布式训练,我们知道`paddle train`进程启动时需要知道其他节点的IP地址以及本节点的`trainer_id`,由于`Paddle`本身不提供类似服务发现的功能,所以在本文的启动脚本中,每个节点会根据`job name`向`k8s apiserver`查询这个`job`对应的所有`pod`信息(k8s默认会在每个容器的环境变量中写入`apiserver`的地址)。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
由于
Paddle
本身不提供类似服务发现的功能,所以在本文的启动脚本中,每个节点会根据job name
向k8s apiserver
查询这个job
对应的所有pod
信息python def getIdMap(podlist): ''' generate tainer_id by ip ''' ips = [] for pod in podlist["items"]: ips.append(pod["status"]["podIP"]) ips.sort() idMap = {} for i in range(len(ips)): idMap[ips[i]] = i return idMap
在各个节点已经获取到自己id编号以及总共节点数信息后,至于以后要做的数据自动划分问题,各个节点直接可以通过id编号以及总共节点数
自动划分并下载数据了。看起来实现自动数据划分也非常容易,只要扩展下容器内的start脚本即可。
CMD ["bash"," -c","/root/start.sh"] | ||
``` | ||
|
||
[`start.sh`](start.sh)文件拷贝训练文件到容器内,然后执行[`start_paddle.py`](start_paddle.py)脚本启动训练,前文提到的获取其他节点IP地址,分配`trainer_id`等都在`start_paddle.py`脚本中完成。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里如果可以附上关键代码,看起来会特别流畅,辅助理解。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok,准备在下次commit加入
|
||
```bash | ||
docker build -t registry.baidu.com/public/paddle:mypaddle . | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
registry.baidu.com/public/paddle:mypaddle .
这里要去掉百度域名么?要不直接改成docker hub 得了。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
## Kubernetes 基本概念 | ||
|
||
在介绍分布式训练之前,需要对Kubernetes(k8s)有一个基本的认识,下面先简要介绍一下本文用到的几个k8s概念。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
请不要使用k8s这个缩写。
另外,如果要定义缩写,一般使用中文圆括号。如果上下文是英语,以至于要使用ASCII圆括号,那么左括号之前应该有一个空格。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
在介绍分布式训练之前,需要对Kubernetes(k8s)有一个基本的认识,下面先简要介绍一下本文用到的几个k8s概念。 | ||
|
||
### Node |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这几个概念不需要各自定义为一个 ###
三级section。用 1.
设置为bullets就好了。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
### Node | ||
|
||
[`Node`](http://kubernetes.io/docs/admin/node/) 表示一个k8s集群中的一个工作节点,这个节点可以是物理机或者虚拟机,k8s集群就是由`node`节点与`master`节点组成的。每个node都安装有Docker,在本文的例子中,`Paadle`容器就在node上运行。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Paddle不是codename,不需要 ```。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
### Node | ||
|
||
[`Node`](http://kubernetes.io/docs/admin/node/) 表示一个k8s集群中的一个工作节点,这个节点可以是物理机或者虚拟机,k8s集群就是由`node`节点与`master`节点组成的。每个node都安装有Docker,在本文的例子中,`Paadle`容器就在node上运行。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Paddle以容器的形式运行,不是因为node上都有Docker,而是因为Kubernetes就是用来调度Docker containers的。而“Kubernetes就是用来调度Docker containers的”这个概念应该在本文最初提到Kubernetes的时候就说明,所以这里的
每个node都安装有Docker,在本文的例子中,
Paadle
容器就在node上运行。
这句话不需要了。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
### Node | ||
|
||
[`Node`](http://kubernetes.io/docs/admin/node/) 表示一个k8s集群中的一个工作节点,这个节点可以是物理机或者虚拟机,k8s集群就是由`node`节点与`master`节点组成的。每个node都安装有Docker,在本文的例子中,`Paadle`容器就在node上运行。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Paddle以容器的形式运行,不是因为node上都有Docker,而是因为Kubernetes就是用来调度Docker containers的。而“Kubernetes就是用来调度Docker containers的”这个概念应该在本文最初提到Kubernetes的时候就说明,所以这里的
每个node都安装有Docker,在本文的例子中,
Paadle
容器就在node上运行。
这句话不需要了。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
### 前提条件 | ||
|
||
首先,我们需要拥有一个k8s集群,在这个集群中所有node与pod都可以互相通信。关于k8s集群搭建,可以参考[官方文档](http://kubernetes.io/docs/getting-started-guides/kubeadm/),在以后的文章中我们也会介绍AWS上搭建的方案。在本文的环境中,k8s集群中所有node都挂载了一个`mfs`(分布式文件系统)共享目录,我们通过这个目录来存放训练文件与最终输出的模型。在训练之前,用户将配置与训练数据切分好放在mfs目录中,训练时,程序从此目录拷贝文件到容器内进行训练,将结果保存到此目录里。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里需要说明:
本文假设大家能找到几台物理机器,并且可以按照官方文档在上面部署Kubernetes。将来我们会另写文章介绍如何使用公有云上的Kubernetes集群。
|
||
### 前提条件 | ||
|
||
首先,我们需要拥有一个k8s集群,在这个集群中所有node与pod都可以互相通信。关于k8s集群搭建,可以参考[官方文档](http://kubernetes.io/docs/getting-started-guides/kubeadm/),在以后的文章中我们也会介绍AWS上搭建的方案。在本文的环境中,k8s集群中所有node都挂载了一个`mfs`(分布式文件系统)共享目录,我们通过这个目录来存放训练文件与最终输出的模型。在训练之前,用户将配置与训练数据切分好放在mfs目录中,训练时,程序从此目录拷贝文件到容器内进行训练,将结果保存到此目录里。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里误用了```
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
### 前提条件 | ||
|
||
首先,我们需要拥有一个k8s集群,在这个集群中所有node与pod都可以互相通信。关于k8s集群搭建,可以参考[官方文档](http://kubernetes.io/docs/getting-started-guides/kubeadm/),在以后的文章中我们也会介绍AWS上搭建的方案。在本文的环境中,k8s集群中所有node都挂载了一个`mfs`(分布式文件系统)共享目录,我们通过这个目录来存放训练文件与最终输出的模型。在训练之前,用户将配置与训练数据切分好放在mfs目录中,训练时,程序从此目录拷贝文件到容器内进行训练,将结果保存到此目录里。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
程序从此目录拷贝文件到容器内进行训练,
有这么一步拷贝吗?我以为mfs上的文件是通过volume映射到containers里的呢?
|
||
### 使用 `Job` | ||
|
||
我们使用k8s中的job这个概念来代表一次分布式训练。`Job`表示一次性作业,在作业完成后,k8s会销毁job产生的容器并且释放相关资源。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
“当我们用Kubernetes来执行一个PaddlePaddle的分布式训练作业的时候,需要写一个YAML文件来描述这个作业。”
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
我们使用k8s中的job这个概念来代表一次分布式训练。`Job`表示一次性作业,在作业完成后,k8s会销毁job产生的容器并且释放相关资源。 | ||
|
||
在k8s中,可以通过编写一个 `yaml` 文件,来描述这个job,在这个文件中,主要包含了一些配置信息,例如Paddle节点的个数,`paddle pserver`开放的端口个数与端口号,`paddle`使用的网卡设备等,这些信息通过环境变量的形式传递给容器内的程序使用。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里多处误用了```
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
@drinktee 我看到不少我的comments后面你都回复了done,但是没有git push,所以我看不到你修改后的结果。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
谢谢大家啦!这个版本真是相当相当好呀!
|
||
PaddlePaddle镜像需要提供`paddle pserver`与`paddle train`进程的运行环境,用这个镜像创建的容器需要有以下两个功能: | ||
|
||
- 拷贝训练文件到容器内 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
分布式训练的时候,数据是不是放在MFS上,而不用拷贝到Docker image里?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
是的,数据在MFS上,镜像只在官方镜像上加了个启动脚本
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
那这一句应该删掉?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
训练数据一开始是在MFS上的,容器启动的时候执行脚本会从mfs上把数据拉拷贝容器内,然后再开始训练。官方镜像里面是没有这个脚本的,我觉得这句话还是得存在吧。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
明白你的意思了。问一个细节:这里必须从MFS“拷贝”数据吗?还是可以在container里用Linux的mount
命令把MFS的一个目录mount到到container里的一个目录?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
还是可以在container里用Linux的mount命令把MFS的一个目录mount到到container里的一个目录?
其实容器起来后那个mfs目录已经mount到容器内一个目录了,只不过这个目录底层其实是mfs,我做这个拷贝是为了真正把数据放到容器里。当然也可以不拷贝,这样的话训练的时候就直接读取mfs上的数据
|
||
### 部署Kubernetes集群 | ||
|
||
首先,我们需要拥有一个Kubernetes集群,在这个集群中所有node与pod都可以互相通信。关于Kubernetes集群搭建,可以参考[官方文档](http://kubernetes.io/docs/getting-started-guides/kubeadm/),在以后的文章中我们也会介绍AWS上搭建的方案。本文假设大家能找到几台物理机,并且可以按照官方文档在上面部署Kubernetes。在本文的环境中,Kubernetes集群中所有node都挂载了一个*mfs*(分布式文件系统)共享目录,我们通过这个目录来存放训练文件与最终输出的模型。在训练之前,用户将配置与训练数据切分好放在mfs目录中,训练时,程序从此目录拷贝文件到容器内进行训练,将结果保存到此目录里。整体的结果图如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里是mfs第一次出现的地方,贴一个指向MFS(作为一个缩写,应该各个字母都是大写)首页的连接吧?
另外,这里应该有一个全名,因为MFS可以是Macintosh filesystem、Moose filesystem等多个意思:
都挂载了一个分布式文件系统 Moose filesystem(MFS)的目录。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
|
||
在Kubernetes中,可以通过编写一个YAML文件,来描述这个job,在这个文件中,主要包含了一些配置信息,例如PaddlePaddle的节点个数,`paddle pserver`开放的端口个数与端口号,使用的网卡设备等,这些信息通过环境变量的形式传递给容器内的程序使用。 | ||
|
||
在一次分布式训练中,用户确定好本次训练需要的PaddlePaddle节点个数,将切分好的训练数据与配置文件上传到mfs共享目录中。然后编写这次训练的job YAML文件,提交给Kubernetes集群创建并开始作业。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
有几处mfs应该改成MFS。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
## 制作Docker镜像 | ||
|
||
在一个功能齐全的Kubernetes机群里,通常我们会安装Ceph等分布式文件系统来存储训练数据。这样的话,一个分布式Paddle训练任务中的每个进程都可以从Ceph读取数据。在这个例子里,我们只演示一个单机作业,所以可以简化对环境的要求,把训练数据直接放在 | ||
Paddle的Docker image里。为此,我们需要制作一个包含训练数据的Paddle镜像。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
对了。这里可否用标准PaddlePaddle的Docker image,而数据放在本机,通过 docker run -v
挂载进去?
或者,数据可否打成另一个Docker image,然后以data volumn的形式挂载进标准PaddlePaddle image?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我认为这边可能都不太可行,因为虽然训练是单机的,但k8s集群是分布式的,最终在哪个机器上运行paddle是不确定的,将数据挂载进去的话,数据需要事先在每个节点都放好了。这个单机demo的为了方便,就直接在镜像里放数据比较简单
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
哦。是的。你说的对!我糊涂了
|
||
### 部署Kubernetes集群 | ||
|
||
首先,我们需要拥有一个Kubernetes集群,在这个集群中所有node与pod都可以互相通信。关于Kubernetes集群搭建,可以参考[官方文档](http://kubernetes.io/docs/getting-started-guides/kubeadm/),在以后的文章中我们也会介绍AWS上搭建的方案。本文假设大家能找到几台物理机,并且可以按照官方文档在上面部署Kubernetes。在本文的环境中,Kubernetes集群中所有node都挂载了一个*mfs*(分布式文件系统)共享目录,我们通过这个目录来存放训练文件与最终输出的模型。在训练之前,用户将配置与训练数据切分好放在mfs目录中,训练时,程序从此目录拷贝文件到容器内进行训练,将结果保存到此目录里。整体的结果图如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里需要介绍如何配置MFS。有没有一个链接?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
还有些细节再稍微润色下。
@@ -0,0 +1,307 @@ | |||
|
|||
# Paddle on Kubernetes:分布式训练 | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Paddle->PaddlePaddle
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
# Paddle on Kubernetes:分布式训练 | ||
|
||
前一篇文章介绍了如何在Kubernetes集群上启动一个单机PaddlePaddle训练作业 (Job)。在这篇文章里,我们介绍如何在Kubernetes集群上进行分布式PaddlePaddle训练作业。关于PaddlePaddle的分布式训练,可以参考 [Cluster Training](https://github.com/baidu/Paddle/blob/develop/doc/cluster/opensource/cluster_train.md),本文利用Kubernetes的调度功能与容器编排能力,快速构建PaddlePaddle容器集群,进行分布式训练任务。 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
可以参考 Cluster Training,
这里可以稍微润色下, 强调一下本文集群训练和被参考的集群训练的关系。乍看容易觉得,已经有了分布式训练,为嘛后面还有本文集群训练 呢?重点区分下两者的关系。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
关于PaddlePaddle的分布式训练,文章 Cluster Training介绍了一种通过SSH远程分发任务,进行分布式训练的方法,与此不同的是,本文将介绍在Kubernetes容器管理平台上快速构建PaddlePaddle容器集群,进行分布式训练的方案。
不知这样改合不合适? @backyes
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
好,很清楚了。
## Kubernetes 基本概念 | ||
|
||
[*Kubernetes*](http://kubernetes.io/)是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用。在介绍分布式训练之前,需要对[Kubernetes](http://kubernetes.io/)有一个基本的认识,下面先简要介绍一下本文用到的几个Kubernetes概念。 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
前面一段,添加几句描述下, 目前有哪些公有云环境支持Kubernetes部署, 会显得paddle支持Kubernetes的利好特性。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DONE
|
||
### 部署Kubernetes集群 | ||
|
||
首先,我们需要拥有一个Kubernetes集群,在这个集群中所有node与pod都可以互相通信。关于Kubernetes集群搭建,可以参考[官方文档](http://kubernetes.io/docs/getting-started-guides/kubeadm/),在以后的文章中我们也会介绍AWS上搭建的方案。本文假设大家能找到几台物理机,并且可以按照官方文档在上面部署Kubernetes。在本文的环境中,Kubernetes集群中所有node都挂载了一个*mfs*(分布式文件系统)共享目录,我们通过这个目录来存放训练文件与最终输出的模型。在训练之前,用户将配置与训练数据切分好放在mfs目录中,训练时,程序从此目录拷贝文件到容器内进行训练,将结果保存到此目录里。整体的结果图如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
整体的结果图如下:
应该是 整体的结构图?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
另外对图结构能稍微增加一点描述最好。 整个上下文只有提到了图中的mfs和Kubernetes任务的关系,其他描述并不明确,虽然有经验的人能推理出来。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DONE
|
||
### 上传训练文件 | ||
|
||
本文使用Paddle官方的[recommendation demo](http://www.paddlepaddle.org/doc/demo/index.html#recommendation)作为这次训练的内容,我们将训练文件与数据放在一个job name命名的目录中,上传到mfs共享存储。完成后mfs上的文件内容大致如下: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Paddle -> PaddlePaddle.
其他地方也都搜一下吧。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
我没什么意见了,内容和形式都蛮不错的了。 如果后面有空加一些高级的topic的话,可以专门给个demo验证多机比单机的加速效果(paddle默认是跑sync sgd的,所以多机scalability的demo在公有云环境下可能会比较有挑战力)。 |
|
…eduler Fix PaddlePaddle#293: Add Learning rate scheduler api_guide
fix command to run
update fom docs
Co-authored-by: root <[email protected]>
Co-authored-by: root <[email protected]>
Add a demo to run PaddlePaddle on Kubernetes. The demo uses the Kubernetes Job to run the PaddlePaddle docker container and when a train finishes the output is in hostpath.