Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
models
提交
e032eb7e
M
models
项目概览
PaddlePaddle
/
models
大约 1 年 前同步成功
通知
222
Star
6828
Fork
2962
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
602
列表
看板
标记
里程碑
合并请求
255
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
602
Issue
602
列表
看板
标记
里程碑
合并请求
255
合并请求
255
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
e032eb7e
编写于
3月 27, 2020
作者:
C
Chengmo
提交者:
GitHub
3月 27, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix download_data & add distribute train (#4489)
修复了文档中与实际代码命名有区别的问题,增加了如何启动分布式训练的通用介绍
上级
f60fffbd
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
109 addition
and
2 deletion
+109
-2
PaddleRec/ctr/dnn/README.md
PaddleRec/ctr/dnn/README.md
+109
-2
未找到文件。
PaddleRec/ctr/dnn/README.md
浏览文件 @
e032eb7e
...
...
@@ -53,6 +53,11 @@
*
[
AUC的清零步骤
](
#auc的清零步骤
)
*
[
运行Infer
](
#运行infer
)
*
[
benchmark
](
#benchmark
)
*
[
启动分布式训练
](
#启动分布式训练
)
*
[
训练代码准备
](
#训练代码准备
)
*
[
运行环境准备
](
#运行环境准备
)
*
[
启动server
](
#启动server
)
*
[
启动worker
](
#启动worker
)
#
## 运行环境
...
...
@@ -87,7 +92,7 @@ sh download_data.sh
执行该脚本的理想输出为:
```
bash
>
sh
get
_data.sh
>
sh
download
_data.sh
--2019-11-26
06:31:33-- https://fleet.bj.bcebos.com/ctr_data.tar.gz
Resolving fleet.bj.bcebos.com... 10.180.112.31
Connecting to fleet.bj.bcebos.com|10.180.112.31|:443... connected.
...
...
@@ -677,4 +682,106 @@ open file success
### benchmark
全量数据的训练与预测,请修改对应
`train.py`
与
`infer.py`
中对应的
`train_files_path`
与
`test_files_path`
超参数,分别修改为
`./train_data_full`
与
`./test_data_full`
。在全量数据中训练三轮后,加载epoch_2的模型,
`auc=0.79395`
。
分布式benchmark相关代码及复现方式见
[
Fleet Repo
](
https://github.com/PaddlePaddle/Fleet.git
)
,路径为Fleet/benchmark/ps/distribute_ctr/paddle/。
\ No newline at end of file
分布式benchmark相关代码及复现方式见
[
Fleet Repo
](
https://github.com/PaddlePaddle/Fleet.git
)
,路径为Fleet/benchmark/ps/distribute_ctr/paddle/。
## 启动分布式训练
在
`本地模拟分布式`
小节,我们简要介绍了运行的方法,下面,将更详细地介绍启动参数服务器进行分布式训练的方法。
### 训练代码准备
参数服务器架构,有两个重要的组成部分:Server与Worker。为了启动训练,我们是否要准备两套代码分别运行呢?答案是不需要的。Paddle Fleet API将两者运行的逻辑进行了很好的统一,用户只需使用
`fleet.init(role)`
就可以判断当前启动的程序扮演server还是worker。使用如下的编程范式,只需10行,便可将单机代码转变为分布式代码:
```
python
role
=
role_maker
.
PaddleCloudRoleMaker
()
fleet
.
init
(
role
)
# Define your network, choose your optimizer(SGD/Adam/Adagrad etc.)
strategy
=
StrategyFactory
.
create_sync_strategy
()
optimizer
=
fleet
.
distributed_optimizer
(
optimizer
,
strategy
)
if
fleet
.
is_server
():
fleet
.
init_server
()
fleet
.
run_server
()
if
fleet
.
is_worker
():
fleet
.
init_worker
()
# run training
fleet
.
stop_worker
()
```
### 运行环境准备
-
Paddle参数服务器模式的训练,目前只支持在
`Liunx`
环境下运行,推荐使用
`ubuntu`
或
`CentOS`
-
Paddle参数服务器模式的前端代码支持
`python 2.7`
及
`python 3.5+`
,若使用
`Dataset`
模式的高性能IO,需使用
`python 2.7`
-
使用多台机器进行分布式训练,请确保各自之间可以通过
`ip:port`
的方式访问
`rpc`
服务,使用
`http/https`
代理会导致通信失败
-
各个机器之间的通信耗费应尽量少
假设我们有两台机器,想要在每台机器上分别启动一个
`server`
进程以及一个
`worker`
进程,完成2x2(2个参数服务器,2个训练节点)的参数服务器模式分布式训练,按照如下步骤操作。
### 启动server
机器A,IP地址是
`10.89.176.11`
,通信端口是
`36000`
,配置如下环境变量后,运行训练的入口程序:
```
bash
export
PADDLE_PSERVERS_IP_PORT_LIST
=
"10.89.176.11:36000,10.89.176.12:36000"
export
TRAINING_ROLE
=
PSERVER
export
POD_IP
=
10.89.176.11
# node A:10.89.176.11
export
PADDLE_PORT
=
36000
export
PADDLE_TRAINERS_NUM
=
2
python
-u
train.py
--is_cloud
=
1
```
应能在日志中看到如下输出:
> I0318 21:47:01.298220 188592128 grpc_server.cc:470] Server listening on 127.0.0.1:36000 selected port: 36000
查看系统进程
> 8624 | ttys000 | 0:02.31 | python -u train.py --is_cloud=1
查看系统进程及端口占用:
> python3.7 | 8624 | paddle | 8u | IPv6 | 0xe149b87d093872e5 | 0t0 | TCP | localhost:36000 (LISTEN)
也可以看到我们的
`server`
进程8624的确在
`36000`
端口开始了监听,等待
`worker`
的通信。
机器B,IP地址是
`10.89.176.12`
,通信端口是
`36000`
,配置如下环境变量后,运行训练的入口程序:
```
bash
export
PADDLE_PSERVERS_IP_PORT_LIST
=
"10.89.176.11:36000,10.89.176.12:36000"
export
TRAINING_ROLE
=
PSERVER
export
POD_IP
=
10.89.176.12
# node B: 10.89.176.12
export
PADDLE_PORT
=
36000
export
PADDLE_TRAINERS_NUM
=
2
python
-u
train.py
--is_cloud
=
1
```
也可以看到相似的日志输出与进程状况。(进行验证时,请务必确保IP与端口的正确性)
### 启动worker
接下来我们分别在机器A与B上开启训练进程。配置如下环境变量并开启训练进程:
机器A:
```
bash
export
PADDLE_PSERVERS_IP_PORT_LIST
=
"10.89.176.11:36000,10.89.176.12:36000"
export
TRAINING_ROLE
=
TRAINER
export
PADDLE_TRAINERS_NUM
=
2
export
PADDLE_TRAINER_ID
=
0
# node A:trainer_id = 0
python
-u
train.py
--is_cloud
=
1
```
机器B:
```
bash
export
PADDLE_PSERVERS_IP_PORT_LIST
=
"10.89.176.11:36000,10.89.176.12:36000"
export
TRAINING_ROLE
=
TRAINER
export
PADDLE_TRAINERS_NUM
=
2
export
PADDLE_TRAINER_ID
=
1
# node B: trainer_id = 1
python
-u
train.py
--is_cloud
=
1
```
运行该命令时,若pserver还未就绪,可在日志输出中看到如下信息:
> server not ready, wait 3 sec to retry...
>
> not ready endpoints:['10.89.176.11:36000', '10.89.176.12:36000']
worker进程将持续等待,直到server开始监听,或等待超时。
当pserver都准备就绪后,可以在日志输出看到如下信息:
> I0317 11:38:48.099179 16719 communicator.cc:271] Communicator start
>
> I0317 11:38:49.838711 16719 rpc_client.h:107] init rpc client with trainer_id 0
至此,分布式训练启动完毕,将开始训练,祝您好运。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录