.. _cluster_howto Fluid分布式训练使用手册 ==================== 分布式训练基本思想 --------------- 分布式深度学习训练通常分为两种并行化方法:数据并行,模型并行,参考下图: .. image:: src/parallelism.png 在模型并行方式下,模型的层和参数将被分布在多个节点上,模型在一个mini-batch的前向和反向训练中,将经过多次跨 节点之间的通信。每个节点只保存整个模型的一部分;在数据并行方式下,每个节点保存有完整的模型的层和参数,每个节点 独自完成前向和反向计算,然后完成梯度的聚合并同步的更新所有节点上的参数。Fluid目前版本仅提供数据并行方式,另外 诸如模型并行的特例实现(超大稀疏模型训练)功能将在后续的文档中予以说明。 在数据并行模式的训练中,Fluid使用了两种通信模式,用于应对不同训练任务对分布式训练的要求,分别为RPC通信和Collective 通信。其中RPC通信方式使用 `gRPC `_ ,Collective通信方式使用 `NCCL2 `_ 方式将参数分布在多个parameter server上。此方式在默认未关闭参数切分的情况下,参数会较平均的分布在所有的 parameter server上。如果需要使用其他,可以传入其他的方法,目前可选的方法有: :code:`RoundRobin` 和 :code:`HashName` 。也可以使用自定义的分布方式,只需要参考 `这里 `_ 编写自定义的分布函数。 关闭切分参数 ++++++++++ 参数 :code:`slice_var_up` 指定是否将较大(大于8192个元素)的参数切分到多个parameter server已均衡计算负载,默认为开启。 当模型中的可训练参数体积比较均匀或者使用自定义的参数分布方法是参数均匀分布在多个parameter server上, 可以选择关闭切分参数,这样可以降低切分和重组带来的计算和拷贝开销: .. code-block:: python t.transpile(trainer_id, pservers=pserver_endpoints, trainers=trainers, slice_var_up=False) 使用NCCL2通信方式的训练 -------------------- 注NCCL2模式目前仅支持trainer API,NCCL2方式并没有很多可选项,也没有"transpiler",所以并没有底层API。 使用NCCL2方式同样需要配置每个节点的环境变量,此处与parameter server模式有所不同,并不需要启动独立的 parameter server的进程,只需要启动多个trainer进程即可: .. csv-table:: pserver模式环境变量 :header: "环境变量", "说明" "PADDLE_TRAINER_IPS", "所有Trainer节点的IP列表,用逗号分隔" "PADDLE_TRAINER_ID", "trainer节点的id,从0~n-1,不能有重复" "PADDLE_PSERVER_PORT", "一个端口,用于在NCCL2初始化时,广播NCCL ID" "PADDLE_CURRENT_IP", "当前节点的IP" 目前使用NCCL2进行分布式训练仅支持同步训练方式。使用NCCL2方式的分布式训练,更适合模型体积较大,并需要使用 同步训练和GPU训练,如果硬件设备支持RDMA和GPU Direct,可以达到很高的分布式训练性能。 注意如果系统中有多个网络设备,需要手动指定NCCL2使用的设备, 假设需要使用 :code:`eth2` 为通信设备,需要设定如下环境变量: .. code-block:: bash export NCCL_SOCKET_IFNAME=eth2 另外NCCL2提供了其他的开关环境变量,比如指定是否开启GPU Direct,是否使用RDMA等,详情可以参考 `ncclknobs `_ 。