提交 b23853a2 编写于 作者: W Wu Yi 提交者: Cheerego

refine dist doc (#733)

上级 868d40e7
...@@ -40,8 +40,11 @@ ...@@ -40,8 +40,11 @@
pserver进程个数通常需要根据实际情况调整,以达到最佳的性能,然而通常来说pserver的进程不会比trainer\ pserver进程个数通常需要根据实际情况调整,以达到最佳的性能,然而通常来说pserver的进程不会比trainer\
更多。 更多。
在使用GPU训练时,pserver可以选择使用GPU或只使用CPU,如果pserver也使用GPU,则会增加一次从CPU拷贝\ **注:** 在使用GPU训练时,pserver可以选择使用GPU或只使用CPU,如果pserver也使用GPU,则会增加一次从CPU拷贝\
接收到的梯度数据到GPU的开销,在某些情况下会导致整体训练性能降低。 接收到的梯度数据到GPU的开销,在某些情况下会导致整体训练性能降低。
**注:** 在使用GPU训练时,如果每个trainer节点有多个GPU卡,则会先在每个trainer节点的多个卡之间执行\
NCCL2通信方式的梯度聚合,然后再通过pserver聚合多个节点的梯度。
- NCCL2通信方式的结构: - NCCL2通信方式的结构:
...@@ -191,7 +194,10 @@ NCCL2模式的分布式训练,由于没有parameter server角色,是trainer ...@@ -191,7 +194,10 @@ NCCL2模式的分布式训练,由于没有parameter server角色,是trainer
* 配置 :code:`fluid.DistributeTranspilerConfig` 中 :code:`mode="nccl2"` 。 * 配置 :code:`fluid.DistributeTranspilerConfig` 中 :code:`mode="nccl2"` 。
* 调用 :code:`transpile` 时,:code:`trainers` 传入所有trainer节点的endpoint,并且传入参数 :code:`current_endpoint` 。 * 调用 :code:`transpile` 时,:code:`trainers` 传入所有trainer节点的endpoint,并且传入参数 :code:`current_endpoint` 。
在此步骤中,会在 :code:`startup program` 中增加 :code:`gen_nccl_id_op` 用于在多机程序初始化时同步NCCLID信息。
* 初始化 :code:`ParallelExecutor` 时传入 :code:`num_trainers` 和 :code:`trainer_id` 。 * 初始化 :code:`ParallelExecutor` 时传入 :code:`num_trainers` 和 :code:`trainer_id` 。
在此步骤中,:code:`ParallelExecutor` 会使用多机方式初始化NCCL2并可以开始在多个节点对每个参数对应的梯度执行跨节点的
:code:`allreduce` 操作,执行多机同步训练
一个例子: 一个例子:
...@@ -211,9 +217,9 @@ NCCL2模式的分布式训练,由于没有parameter server角色,是trainer ...@@ -211,9 +217,9 @@ NCCL2模式的分布式训练,由于没有parameter server角色,是trainer
.. csv-table:: NCCL2模式必要参数说明 .. csv-table:: NCCL2模式必要参数说明
:header: "参数", "说明" :header: "参数", "说明"
"trainer_id", "任务中每个trainer节点的唯一ID,从0开始,不能有重复" "trainer_id", "(int) 任务中每个trainer节点的唯一ID,从0开始,不能有重复"
"trainers", "任务中所有trainer节点的endpoint,用于在NCCL2初始化时,广播NCCL ID" "trainers", "(int) 任务中所有trainer节点的endpoint,用于在NCCL2初始化时,广播NCCL ID"
"current_endpoint", "当前节点的endpoint" "current_endpoint", "(string) 当前节点的endpoint"
目前使用NCCL2进行分布式训练仅支持同步训练方式。使用NCCL2方式的分布式训练,更适合模型体积较大,并需要使用\ 目前使用NCCL2进行分布式训练仅支持同步训练方式。使用NCCL2方式的分布式训练,更适合模型体积较大,并需要使用\
同步训练和GPU训练,如果硬件设备支持RDMA和GPU Direct,可以达到很高的分布式训练性能。 同步训练和GPU训练,如果硬件设备支持RDMA和GPU Direct,可以达到很高的分布式训练性能。
...@@ -247,8 +253,11 @@ NCCL2分布式训练注意事项 ...@@ -247,8 +253,11 @@ NCCL2分布式训练注意事项
- 随机采样一些数据,补全分配到较少数据的节点上。(推荐使用这种方法,以训练完整的数据集)。 - 随机采样一些数据,补全分配到较少数据的节点上。(推荐使用这种方法,以训练完整的数据集)。
- 在python代码中,每个节点每个pass只训练固定的batch数,如果这个节点数据较多,则不训练这些多出来的数据。 - 在python代码中,每个节点每个pass只训练固定的batch数,如果这个节点数据较多,则不训练这些多出来的数据。
**说明:** 使用NCCL2模式分布式训练时,如果只希望使用一个节点上的部分卡,可以通过配置环境变量::code:`export CUDA_VISIBLE_DEVICES=0,1,2,3` 指定。
**注意:** 如果系统中有多个网络设备,需要手动指定NCCL2使用的设备,假设需要使用 :code:`eth2` 为通信设备,需要设定如下环境变量: **注意:** 如果系统中有多个网络设备,需要手动指定NCCL2使用的设备,假设需要使用 :code:`eth2` 为通信设备,需要设定如下环境变量:
.. code-block:: bash .. code-block:: bash
export NCCL_SOCKET_IFNAME=eth2 export NCCL_SOCKET_IFNAME=eth2
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册