From 94b321a4ee8c9bb8a246bacdebab3a6b8d8276c5 Mon Sep 17 00:00:00 2001 From: sandyhouse Date: Tue, 18 Jan 2022 20:37:40 +0800 Subject: [PATCH] update --- .../images/data_parallel.png | Bin 13429 -> 37698 bytes .../train_fleet_infer_python.md | 190 ++++++++++-------- 2 files changed, 108 insertions(+), 82 deletions(-) diff --git a/tutorials/tipc/train_fleet_infer_python/images/data_parallel.png b/tutorials/tipc/train_fleet_infer_python/images/data_parallel.png index 3bbf67714e53458c9bd70bd75e9391b7f91f126c..0a0f75654d65fac70150f06b585874d232f58ce9 100644 GIT binary patch literal 37698 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

wO`h?4N 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
SFvs{H=&r_NH~ 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 - 如上图所示,与单机单卡的普通模型训练相比,使用飞桨分布式训练的代码都只需要补充三个部分代码: - -1. 导入分布式训练需要的依赖包 - -2. 初始化分布式环境 - -3. 使用DataParallel封装用户组网 - - 下面将逐一进行讲解。 -- 2.1 导入依赖 - - ```python - from paddle.distributed as dist - ``` - -- 2.2 初始化分布式环境 - - ```python - dist.init_parallel_env() - ``` - -- 2.3 使用DataParallel封装用户组网 - - ```python - model = paddle.DataParallel(model) - ``` - -假设用户训练脚本文件名为train.py,下面我们说明如何启动分布式训练任务。 - -1. 启动单机多卡任务 - - 当使用单机多卡时,可以通过如下的命令启动分布式训练任务: - - ```shell - python -m paddle.distributed.launch --gpus="0,1" train.py - ``` - - 其中,``--gpus``选项指定用户分布式训练使用的GPU卡。 - -2. 启动多机多卡任务 - - 我们以2台机器为例,说明如何启动多机多卡分布式训练任务。假设两台机器的ip地址分别为192.168.0.1和192.168.0.2。 - - 首先,我们需要确保两台机器间的网络是互通的,可以通过``ping``命令验证机器间网络的互通性,如下所示: - - ```shell - # 在ip地址为192.168.0.1的机器上 - ping 192.168.0.2 - ``` - - 接着,我们分别在两台机器上启动分布式任务: - - ```shell - # 在ip地址为192.168.0.1的机器上 - python -m paddle.distributed.launch --ips="192.168.0.1,192.168.0.2" --gpus="0,1" train.py - ``` - - ```shell - # 在ip地址为192.168.0.2的机器上 - python -m paddle.distributed.launch --ips="192.168.0.1,192.168.0.2" --gpus="0,1" train.py - ``` - - 启动上述命令后,将在控制台上输出类似如下所示的信息: - - ```shell - WARNING 2021-01-04 17:59:08,725 launch.py:314] Not found distinct arguments and compiled with cuda. Default use collective mode - launch train in GPU mode - INFO 2021-01-04 17:59:08,727 launch_utils.py:472] Local start 2 processes. First process distributed environment info (Only For Debug): - +=======================================================================================+ - | Distributed Envs Value | - +---------------------------------------------------------------------------------------+ - | PADDLE_CURRENT_ENDPOINT 127.0.0.1:17901 | - | PADDLE_TRAINERS_NUM 2 | - | PADDLE_TRAINER_ENDPOINTS 127.0.0.1:17901,127.0.0.1:18846 | - | FLAGS_selected_gpus 0 | - | PADDLE_TRAINER_ID 0 | - +=======================================================================================+ - - ... - W0104 17:59:19.018365 43338 device_context.cc:342] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.2, Runtime API Version: 9.2 - W0104 17:59:19.022523 43338 device_context.cc:352] device: 0, cuDNN Version: 7.4. - W0104 17:59:23.193490 43338 fuse_all_reduce_op_pass.cc:78] Find all_reduce operators: 161. To make the speed faster, some all_reduce ops are fused during training, after fusion, the number of all_reduce ops is 5. +如上图所示,与单机单卡的普通模型训练相比,使用飞桨分布式训练的代码都只需要补充三个部分代码: +1. 准备多机多卡环境 + +2. 导入依赖 + +3. 初始化分布式环境 + +4. 使用数据并行算子封装模型 + +5. 验证多机多卡程序运行正确 + +6. 开发模型推理程序 + +下面将逐一讲解每一步骤。 + +### 2.1 准备多机多卡环境 + +准备两台机器,每台机器包含至少两张GPU卡。假设两台机器的IP地址分别为192.168.0.1和192.168.0.2。那么,通过ping命令验证两台机器的网络是否是连通的: + +```shell +# 在ip地址为192.168.0.1的机器上 +ping 192.168.0.2 +``` + +如果控制台输出类似如下的信息,则表示两台机器的网络是连通的。 + +```shell +PING 192.168.0.2 (192.168.0.2): 56 data bytes +64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=0.090 ms +64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.111 ms +64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.094 ms +64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.089 ms +``` + +反之,如果输出如下的信息,则表示两台机器间的网络是不可连通的,请咨询您的网络管理员。 + +```shell +PING 192.168.0.2 (192.168.0.2): 56 data bytes +Request timeout for icmp_seq 0 +Request timeout for icmp_seq 1 +``` + +### 2.2 导入依赖 + +```python +import paddle +from paddle.distributed as dist +``` + +### 2.3 初始化分布式环境 + +```python +dist.init_parallel_env() +``` + +### 2.4 使用数据并行算子封装模型 + +```python +model = paddle.DataParallel(model) +``` + +### 2.5 验证多机多卡程序运行正确 + +假设用户训练脚本文件名为train.py,下面我们说明如何启动分布式训练任务,并验证程序的正确性。 + +我们分别在两台机器上启动分布式任务: + +```shell +# 在ip地址为192.168.0.1的机器上 +python -m paddle.distributed.launch --ips="192.168.0.1,192.168.0.2" --gpus="0,1" train.py ``` + +```shell +# 在ip地址为192.168.0.2的机器上 +python -m paddle.distributed.launch --ips="192.168.0.1,192.168.0.2" --gpus="0,1" train.py +``` + +启动上述命令后,将在控制台上输出类似如下所示的信息: + +```shell +WARNING 2021-01-04 17:59:08,725 launch.py:314] Not found distinct arguments and compiled with cuda. Default use collective mode +launch train in GPU mode +INFO 2021-01-04 17:59:08,727 launch_utils.py:472] Local start 4 processes. First process distributed environment info (Only For Debug): + +=======================================================================================+ + | Distributed Envs Value | + +---------------------------------------------------------------------------------------+ + | PADDLE_CURRENT_ENDPOINT 192.168.0.1:17901 | + | PADDLE_TRAINERS_NUM 2 | + | PADDLE_TRAINER_ENDPOINTS 192.168.0.1:17901,192.168.0.0.1:18846... | + | FLAGS_selected_gpus 0 | + | PADDLE_TRAINER_ID 0 | + +=======================================================================================+ + +... +W0104 17:59:19.018365 43338 device_context.cc:342] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.2, Runtime API Version: 9.2 +W0104 17:59:19.022523 43338 device_context.cc:352] device: 0, cuDNN Version: 7.4. +W0104 17:59:23.193490 43338 fuse_all_reduce_op_pass.cc:78] Find all_reduce operators: 161. To make the speed faster, some all_reduce ops are fused during training, after fusion, the number of all_reduce ops is +``` + 当使用paddle.distributed.launch模块启动分布式任务时,所有日志将保存在./log目录下,日志文件名为workerlog.xx,其中xx为整数;每个卡训练进程对应一个日志文件。 +用户也可以通过--log_dir选项指定日志的保存目录,比如下面的例子中将日志保存在./my_log目录下: + +```shell +python -m paddle.distributed.launch --ips="192.168.0.1,192.168.0.2" --gpus="0,1" --log_dir=./my_log train.py +``` + +### 2.6 开发模型推理程序 + +请参考第3部分。 + ## 3. [多机多卡推理功能开发](#3) 由于数据并行训练各个卡上包含完整的模型副本,因此只需要保存某张卡上的模型用于推理即可。通常,可以选择保存第一张卡上的模型用于推理。 -- GitLab