数据并行执行引擎
ParallelExecutor
是以数据并行的方式在多个节点上分别执行 Program
的执行器。用户可以通过Python脚本驱动 ParallelExecutor
执行, ParallelExecutor
的执行过程:
- 首先根据
Program
、GPU
卡的数目(或者CPU
的核数)以及 BuildStrategy 构建SSA Graph
和一个线程池; 执行过程中,根据Op的输入是否Ready决定是否执行该Op,这样可以使没有相互依赖的多个Op可在线程池中并行执行;
ParallelExecutor
在构造时需要指定当前Program
的设备类型,GPU
或者CPU
:使用
GPU
执行:ParallelExecutor
会自动检测当前机器可以使用GPU
的个数,并在每个GPU
上分别执行Program
,用户也可以通过设置CUDA_VISIBLE_DEVICES
环境变量来指定执行器可使用的GPU
;使用
CPU
多线程执行:ParallelExecutor
会自动检测当前机器可利用的CPU
核数,并将CPU
核数作为执行器中线程的个数,每个线程分别执行Program
,用户也可以通过设置CPU_NUM
环境变量来指定当前训练使用的线程个数。ParallelExecutor
支持模型训练和模型预测:模型训练:
ParallelExecutor
在执行过程中对多个节点上的参数梯度进行聚合,然后进行参数的更新;模型预测:
ParallelExecutor
在执行过程中各个节点独立运行当前的Program
;ParallelExecutor
在模型训练时支持两种模式的梯度聚合,AllReduce
和Reduce
:AllReduce
模式下,ParallelExecutor
调用AllReduce操作使多个节点上参数梯度完全相等,然后各个节点独立进行参数的更新;Reduce
模式下,ParallelExecutor
会预先将所有参数的更新分派到不同的节点上,在执行过程中ParallelExecutor
调用Reduce操作将参数梯度在预先指定的节点上进行聚合,并进行参数更新,最后调用Broadcast操作将更新后的参数发送到其他节点。
这两种模式通过build_strategy
来指定,使用方法,请参考 BuildStrategy 。
注意 :如果在Reduce模式下使用 CPU
多线程执行 Program
, Program
的参数在多个线程间是共享的,在某些模型上,Reduce模式可以大幅节省内存。
由于模型的执行速度与模型结构和执行器的执行策略相关, ParallelExecutor
允许用户修改执行器的相关参数,如:线程池大小( num_threads
)、多少次迭代之后清理一次临时变量 num_iteration_per_drop_scope
等,更多信息请参考 ExecutionStrategy 。
- 相关API汇总:
- ParallelExecutor- BuildStrategy- ExecutionStrategy
原文: http://paddlepaddle.org/documentation/docs/zh/1.3/api_guides/low_level/parallel_executor.html