From 09dfc113f40354782434109ddb91fc8385294bec Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Sun, 19 Jun 2022 00:19:26 +0800 Subject: [PATCH] add dp performance opt docs --- .../data_parallel/img/allreduce_exam1.png | Bin 0 -> 37616 bytes .../data_parallel/img/comm_fusion.png | Bin 0 -> 17789 bytes .../data_parallel/img/comm_topo.png | Bin 0 -> 18763 bytes .../data_parallel/img/overlap.png | Bin 0 -> 28591 bytes .../data_parallel/index_cn.rst | 2 + .../performance_optimization_cn.rst | 283 ++++++++++++++++++ 6 files changed, 285 insertions(+) create mode 100644 docs/guides/06_distributed_training/data_parallel/img/allreduce_exam1.png create mode 100644 docs/guides/06_distributed_training/data_parallel/img/comm_fusion.png create mode 100644 docs/guides/06_distributed_training/data_parallel/img/comm_topo.png create mode 100644 docs/guides/06_distributed_training/data_parallel/img/overlap.png create mode 100644 docs/guides/06_distributed_training/data_parallel/performance_optimization_cn.rst diff --git a/docs/guides/06_distributed_training/data_parallel/img/allreduce_exam1.png b/docs/guides/06_distributed_training/data_parallel/img/allreduce_exam1.png new file mode 100644 index 0000000000000000000000000000000000000000..daeb839f31693d574dfa43b8de6d04063dc69834 GIT binary patch literal 37616 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 literal 0 HcmV?d00001 diff --git a/docs/guides/06_distributed_training/data_parallel/img/comm_fusion.png b/docs/guides/06_distributed_training/data_parallel/img/comm_fusion.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8b17955fa2310c5775d6da130ff9a7057cfc95 GIT binary patch literal 17789 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 A-2eap literal 0 HcmV?d00001 diff --git a/docs/guides/06_distributed_training/data_parallel/img/comm_topo.png b/docs/guides/06_distributed_training/data_parallel/img/comm_topo.png new file mode 100644 index 0000000000000000000000000000000000000000..44000fe02fe7139207413862b88556913dc88a22 GIT binary patch literal 18763 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 : 使用飞桨框架进行前向重计算训练。 - `自动混合精度 <./amp_cn.html>`_ : 使用飞桨框架进行自动混合精度训练。 - `Gradient Merge <./gradient_merge_cn.html>`_ : 使用飞桨框架进行 Gradient Merge 训练。 +- `性能优化 <./performance_optimization_cn.html>`: 飞桨框架性能优化策略。 .. toctree:: :hidden: @@ -16,3 +17,4 @@ recompute_cn.rst amp_cn.rst gradient_merge_cn.rst + performance_optimization_cn.rst diff --git a/docs/guides/06_distributed_training/data_parallel/performance_optimization_cn.rst b/docs/guides/06_distributed_training/data_parallel/performance_optimization_cn.rst new file mode 100644 index 00000000000..b81c2486d99 --- /dev/null +++ b/docs/guides/06_distributed_training/data_parallel/performance_optimization_cn.rst @@ -0,0 +1,283 @@ +.. _performance_optimization: + +性能优化 +=============== + +飞桨长期致力于分布式性能优化,给用户带来极高的性能体验。计算和通信是影响分布式深度学习任务性能的最主要的两部分。 + +在计算层面,高性能计算算子开发是提升模型性能的主要途径,尤其是计算算子融合。值得注意的是,高性能算子设计与开发与硬件架构密切相关,但优化思路是基本一致的。飞桨适配了包括NVIDIA GPU、百度昆仑、华为昇腾、Graphcore IPU、寒武纪MLU在内的多种AI加速芯片,致力于给户提供统一、性能优异的算子库体系。 + +在通信层面,尽可能地降低通信时间占比是提升通信性能的主要途径,特别是在大规模分布式训练场景下跨节点通信性能损耗尤为显著的场景下通信优化尤为关键。通信融合、计算与通信重叠等是较为常见的优化手段。 + + +一、融合优化 +----------------------- + +1.1 计算算子融合优化 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +计算算子融合,是指将网络中多个"小"算子替换为功能相同的"大"算子,以提升训练速度和减少显存消耗。 + +我们以计算a、b、c三个张量的和为例说明计算融合的原理。计算a + b + c有以下两种实现方式: + + +- 第一种方式:编写一个名为 \ ``add2`` \ 的算子,其功能是实现两个张量的加法,然后先计算中间结果张量tmp = a + b,最后再计算最终结果d = tmp + c。这种实现方式会存在以下几个问题: + + - 在计算a + b的过程中,需要将计算结果写到中间结果张量tmp中;在计算tmp + c的过程中,需要读取张量tmp的值,即引入了额外的显存读写开销。在现代GPU等硬件中,显存读写的耗时往往远大于计算的耗时。 + + - 中间结果张量tmp需要占用额外的显存中间,带来显存占用量的提高。 + +- 第二种方式:编写一个名为 \ ``add3`` \ 的融合算子,其功能是实现三个张量的加法,一次性直接计算d = a + b + c,不存储任何中间计算结果。相比于第一种方式,由于不存在中间结果张量的读写以及显存占用,性能会获得显著的提升。 + +在飞桨动态图中,算子融合往往是通过API的方式来使用的,包括但不限于: `FusedMultiHeadAttention` , `FusedFeedForward` ,`FusedLinear` 等。用户可查阅相应的API文档了解具体的实现方式。得益于飞桨的动静统一设计,算子融合API同时适用于动态图和静态图。 + +在飞桨静态图中,除了可通过算子融合API的方式来使用外,还可以通过配置开关的方式来打开对应的功能。目前飞桨静态图支持配置的算子融合开关包括但不限于: + +- `build_strategy.fuse_all_optimizer_ops`:表明是否融合优化器算子,目前可对SGD、Adam和Momentum优化器生效。 +- `build_strategy.fuse_elewise_add_act_ops`:表明是否融合elementwise_add算子和activation算子。 +- `build_strategy.fuse_bn_act_ops`:表明是否融合atch_norm算子和activation算子。 +- `build_strategy.fused_bn_add_act_ops`:表明是否融合atch_norm算子、elementwise_add算子和activation算子。 +- `build_strategy.fuse_gemm_epilogue`:表明是否融合matmul算子、elementwise_add算子和activation算子(可选)。 + +1.2 通信融合优化 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +深度学习模型训练过程分为前向计算、反向传播和参数更新三个阶段。数据并行模式下,需要使用AllReduce操作同步参数梯度。默认情形下,对每个参数梯度均需要调用一次AllReduce同步操作。通常来讲,当通信数据量较小时,无法充分利用网络带宽,且每次同步操作需要额外的通信开销。因此,一种直观的优化思路是将多个梯度的AllReduce操作合并为一次AllReduce通信操作,如下图所示。这即是我们要介绍的通信融合:将多次梯度AllReduce操作合并为单次AllReduce同步操作。 + +.. image:: ./img/comm_fusion.png + :width: 600 + :alt: Communication fusion + :align: center + +如图所示,一方面我们减少了AllReduce同步操作的次数;另一方面,我们增加了每次AllReduce同步操作的数据量。这有助于提升通信效率,从而提升训练速度。 + +默认情况下,AllReduce通信融合会将同一layer中多个参数梯度的多个AllReduce操作合并成一个。例如,对于全连接层FC中的Weight和Bias两个参数,通常需要两次AllReduce同步操作;但使用AllReduce通信融合后,只需要使用一次AllReduce同步操作,从而可以减少梯度同步的通信耗时。 + +此外,为支持更大粒度的参数梯度融合,飞桨提供了以下两个选项供用户选择,用户可以在DistributedStrategy中设置: + +- fuse_grad_size_in_MB: 指定每次AllReduce同步操作的梯度字节数。假如该参数值等于16,则飞桨底层会将多个参数梯度的AllReduce同步操作聚合为单次AllReduce同步操作,尽量保证每次AllReduce同步操作聚合的梯度大小达到16MB。该参数值通常设置为每次迭代总通信量的十分之一,即模型参数量的十分之一。 + +- _fuse_grad_size_in_TFLOPS: 指定每次AllReduce操作的最大层数,即当聚合的梯度层数达到该层数就进行一次AllReduce同步操作。假如该参数值等于50, 那么最多聚合50层参数梯度即做一次 AllReduce同步操作。 + +注意: 目前,AllReduce通信融合不支持稀疏参数的梯度。 + +1.3 操作实践 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: python + + # 计算融合 + build_strategy = paddle.static.BuildStrategy() + build_strategy.fuse_elewise_add_act_ops = True + build_strategy.fuse_bn_act_ops = True + build_strategy.fuse_relu_depthwise_conv = True + build_strategy.fuse_broadcast_ops = True + build_strategy.fuse_all_optimizer_ops = True + + strategy = paddle.distributed.fleet.DistributedStrategy() + strategy.build_strategy = build_strategy + + # 通信融合 + strategy.fuse_grad_size_in_MB = 16 + strategy._fuse_grad_size_in_TFLOPS = 50 + strategy.fuse_all_reduce_ops=True + + +完整示例请参考:`example/resnet/train_fleet_static_op_fusion.py `_。 + +假设要运行2卡训练任务,那么只需在命令行中执行: + +.. code-block:: sh + + python -m paddle.distributed.launch --gpus=0,1 train_fleet_static_op_fusion.py + +您将看到显示如下日志信息: + +.. code-block:: + + ----------- Configuration Arguments ----------- + gpus: None + heter_worker_num: None + heter_workers: + http_port: None + ips: 127.0.0.1 + log_dir: log + ... + ------------------------------------------------ + WARNING 2021-01-19 14:53:04,943 launch.py:316] Not found distinct arguments and compiled with cuda. Default use collective mode + launch train in GPU mode + INFO 2021-01-19 14:53:04,945 launch_utils.py:472] Local start 8 processes. First process distributed environment info (Only For Debug): + +=======================================================================================+ + | Distributed Envs Value | + +---------------------------------------------------------------------------------------+ + | PADDLE_CURRENT_ENDPOINT 127.0.0.1:28355 | + | PADDLE_TRAINERS_NUM 8 | + | PADDLE_TRAINER_ENDPOINTS ... 0.1:33653,127.0.0.1:27766,127.0.0.1:16631| + | FLAGS_selected_gpus 0 | + | PADDLE_TRAINER_ID 0 | + +=======================================================================================+ + ... + W0119 14:53:16.871562 68031 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.2, Runtime API Version: 9.2 + W0119 14:53:16.875859 68031 device_context.cc:372] device: 0, cuDNN Version: 7.4. + W0119 14:53:25.973377 68031 build_strategy.cc:116] Currently, fuse_broadcast_ops only works under Reduce mode. + I0119 14:53:27.382609 68031 graph_pattern_detector.cc:101] --- detected 16 subgraphs + I0119 14:53:27.390769 68031 graph_pattern_detector.cc:101] --- detected 16 subgraphs + W0119 14:53:27.407582 68031 fuse_optimizer_op_pass.cc:207] Find momentum operators : 161, and 161 for dense gradients. To make the speed faster, those optimization are fused during training. + W0119 14:53:27.436177 68031 fuse_all_reduce_op_pass.cc:79] 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 6. + [Epoch 0, batch 0] loss: 0.15131, acc1: 0.00000, acc5: 0.03125 + [Epoch 0, batch 5] loss: 1.15416, acc1: 0.00000, acc5: 0.03125 + +需要注意的是,不同飞桨版本,上述信息可能会有所差异。 + + +二、计算与通信重叠优化 +----------------------- + +2.1 原理介绍 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +通信与计算重叠(overlap)优化的思路是,尽可能使得计算算子和通信算子在模型训练过程中并发执行,从而使得通信开销掩盖在计算耗时中,提高模型分布式训练性能。 + +以数据并行为例,如上节所述,数据并行训练过程中需要对参数梯度进行AllReduce操作,从而引入了通信开销。这里存在多种选择:一种是串行执行机制,即在完成反向传播生成所有参数的梯度后,使用AllReduce通信参数梯度;另一种是在生成某个参数的梯度后,即使用AllReduce同步参数梯度,且反向传播计算过程和通信通常是可以并行执行的,即计算与通信重叠。当然,这里AllReduce通信操作也有多种可选方式,比如对每个参数梯度调用一次AllReduce同步操作,或者利用上节所述的通信融合技术将多个参数梯度的AllReduce操作聚合为一个。无论采用哪种方式,这种计算与通信重叠的技术均可以有效提升训练速度。 + +具体地,飞桨框架只支持单个计算流,但可以有多个通信流。每个流可以看作一个独立的执行序列,多个流之间可以并行执行。在通信为瓶颈的网络中,通过融合计算和通信流以及融合多个通信流,可以有效利用通信带宽,从而获得更优的通信和训练性能。多流相关的概念请参考:\ `cuda-streams-best-practices `_\ 。下图给出通信重叠的示意图,每个计算操作产生一份梯度,随后接着通信该梯度。图(a)中,所有的计算和通信操作共用一个计算流,所以计算和通信操作串行执行。图(b)中,有一条计算流和一条通信流,计算和通信操作分别在两条流上执行。当产生完一个梯度后,即可开始通过通信流通信该梯度。然而,由于通信时间大于计算时间,因此整体通信时间仍然较长。然而,相比于单条计算流的串行模式,这种计算和通信重叠的方式可以一定程度的降低执行时间。图(c)中,采用单个计算流和三条通信流,当产生完一个梯度后,即可开始通过通信流通信该梯度。可见,通过通信流重叠的方式,可以进一步优化执行时间。 + +.. image:: ./img/overlap.png + :width: 600 + :alt: Communication overlap + :align: center + + +2.2 操作实践 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +飞桨分布式默认实现了计算和通信的重叠,并提供多通信流重叠(overlap)功能。为了实现多通信流重叠,只需设置通信器数量nccl_comm_num,即可以加快GPU之间的通信效率。按照经验,建议在单机环境下将nccl_comm_num的值设置为1,在多机环境下将nccl_comm_num的值设置为2。设置方法如下所示: + +.. code:: python + + strategy = fleet.DistributedStrategy() + strategy.nccl_comm_num = 2 + strategy.sync_nccl_allreduce=False + + +完整的示例代码请参考:\ `example/resnet/train_fleet_static_overlap.py `_\ 。 + +假设要运行用2卡执行上述任务,那么只需在命令行中执行: + +.. code-block:: sh + + python -m paddle.distributed.launch --gpus=0,1 train_fleet_static_overlap.py + +您将看到显示如下日志信息: + +.. code-block:: + + ----------- Configuration Arguments ----------- + gpus: 0,1 + heter_worker_num: None + heter_workers: + http_port: None + ips: 127.0.0.1 + log_dir: log + ... + ------------------------------------------------ + ... + +=======================================================================================+ + | Distributed Envs Value | + +---------------------------------------------------------------------------------------+ + | PADDLE_CURRENT_ENDPOINT 127.0.0.1:10097 | + | PADDLE_TRAINERS_NUM 2 | + | PADDLE_TRAINER_ENDPOINTS 127.0.0.1:10097,127.0.0.1:59371 | + | FLAGS_selected_gpus 0 | + | PADDLE_TRAINER_ID 0 | + +=======================================================================================+ + ... + W0118 21:44:34.542804 70071 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.2, Runtime API Version: 9.2 + W0118 21:44:34.547377 70071 device_context.cc:372] device: 0, cuDNN Version: 7.4. + W0118 21:44:40.178053 70071 fuse_all_reduce_op_pass.cc:79] 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. + [Epoch 0, batch 0] loss: 0.14466, acc1: 0.00000, acc5: 0.03125 + [Epoch 0, batch 5] loss: 4.00225, acc1: 0.00000, acc5: 0.03125 + ... + +需要注意的是,不同飞桨版本,上述信息可能会有所差异。 + + +三、通信拓扑优化 +----------------------- + +3.1 原理介绍 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +数据并行训练过程分为前向计算、反向传播和参数更新三个阶段,在参数更新前需要使用AllReduce求和操作同步参数梯度。下图给出一种AllReduce求和操作实现方法示例。这种实现中,所有训练进程将数据发送到worker1,worker1进程计算数据的和值,并将结果发送到其它所有训练进程。 + +.. image:: ./img/allreduce_exam1.png + :width: 600 + :alt: AllReduce Example One + :align: center + +为了实现更高效的通信,AllReduce操作还存在其它多种实现方式,如Ring AllReduce。然而,随着训练设备的增加,通信依然成为影响训练效率的因素。一种解决方案是优化通信拓扑结果,使用层次化通信方式。 + +我们以下图为例说明层次化拓扑的原理。将所有计算设备分为多个组,并在每个组中选择一个计算设备作为\ ``leader``\ 。图中,16个计算设备被划分为4个组,每个组内包含4个计算设备。具体地将,worker0 ~ worker3为一个组,worker4 ~ worker7为一个组,worker8 ~ worker11为一个组,worker12 ~ worker15为最后一个组。各个组的\ ``leader``\ 分别为worker3、worker5、woker10和worker13。通信时,首先在组内做AllReduce,各个节点得到组内汇聚的结果。接着,在各个组的\ ``leader``\ 间做组间AllReduce操作;那么,\ ``leader``\ 设备上等价于获取了所有设备的汇聚结果。最后,各个组间\ ``leader``\ 设备将其结果广播到组内所有其它设备。 + +.. image:: ./img/comm_topo.png + :width: 600 + :alt: hierarchical allreduce + :align: center + + +3.2 操作实践 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +飞桨实现了层次化通信拓扑,支持分层AllReduce操作。用户只需要设置相应的DistributedStrategy策略即可使用该功能,如下面的例子所示: + +.. code:: python + + dist_strategy = fleet.DistributedStrategy() + dist_strategy.use_hierarchical_allreduce = True + dist_strategy.hierarchical_allreduce_inter_nranks = 8 + +其中,\ ``hierarchical_allreduce_inter_nranks``\ 表示\ ``leader``\ 设备的数量。每个组的大小可以根据该值自动推断。 + +需要说明的是,层次化通信拓扑目前只适用于多GPU训练。 + +上述例子存放在:\ `example/resnet/train_fleet_static_communication_topology.py `_\ 。 + +假设要运行8卡的任务,那么只需在命令行中执行: + +.. code-block:: sh + + python -m paddle.distributed.launch --gpus=0,1,2,3,4,5,6,7 train_fleet_static_communication_topology.py + +您将看到显示如下日志信息: + +.. code-block:: + + ----------- Configuration Arguments ----------- + gpus: None + heter_worker_num: None + heter_workers: + http_port: None + ips: 127.0.0.1 + log_dir: log + ... + ------------------------------------------------ + ... + INFO 2021-01-19 14:58:43,720 launch_utils.py:472] Local start 8 processes. First process distributed environment info (Only For Debug): + +=======================================================================================+ + | Distributed Envs Value | + +---------------------------------------------------------------------------------------+ + | PADDLE_CURRENT_ENDPOINT 127.0.0.1:53762 | + | PADDLE_TRAINERS_NUM 8 | + | PADDLE_TRAINER_ENDPOINTS ... 0.1:58938,127.0.0.1:54203,127.0.0.1:44221| + | FLAGS_selected_gpus 0 | + | PADDLE_TRAINER_ID 0 | + +=======================================================================================+ + ... + W0119 14:58:52.487838 95116 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.2, Runtime API Version: 9.2 + W0119 14:58:52.493592 95116 device_context.cc:372] device: 0, cuDNN Version: 7.4. + W0119 14:59:01.665702 95116 fuse_all_reduce_op_pass.cc:79] 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. + [Epoch 0, batch 0] loss: 0.13468, acc1: 0.00000, acc5: 0.06250 + [Epoch 0, batch 5] loss: 0.18902, acc1: 0.03125, acc5: 0.03125 + +需要注意的是,不同飞桨版本,上述信息可能会有所差异。 +