分布式同步训练

    API详细使用方法参考 DistributeTranspiler ,简单实例用法:

    以上参数中:

    • trainer_id : trainer节点的id,从0到n-1,n为当前训练任务中trainer节点的个数
    • program : 被转换的 program 默认使用 fluid.default_main_program()
    • pservers : 当前训练任务中pserver节点的IP端口列表
      • : int类型,当前训练任务中trainer节点的个数。注意:
        • pserver模式下,trainer节点个数可以和pserver节点个数不一致,比如使用20个pserver和50个trainer。在实际训练任务中,您可以通过调整pserver节点和trainer节点个数找到最佳性能
        • NCCL2模式中,此项参数是字符串,指定trainer节点的IP端口列表
    • slice_var_up : 配置是否切分一个参数到多个pserver上进行优化,默认开启。此选项适用于模型参数个数少,但需要使用大量节点的场景,有利于提升pserver端计算并行度
    • split_method : 配置transpiler分配参数(或参数的切片)到多个pserver的方式,默认为"RoundRobin",也可以使用"HashName"
    • min_block_size : 如果配置了参数切分,指定最小Tensor的切分大小,防止RPC请求包过小,默认为8192,一般情况不需要调整此项参数
    • enable_dc_asgd : 是否开启 DC-ASGD 此选项在异步训练中生效,启用异步训练补偿算法
    • mode : 可以选择"pserver"或"nccl2",指定使用pserver模式或NCCL2模式分布式训练
    • print_log : 是否开启transpiler debug日志,此项为开发调试使用

    通用环境变量配置:

    • FLAGS_rpc_send_thread_num :int,指定RPC通信发送时线程的个数
    • : int,指定RPC通信接受时线程的个数
    • FLAGS_rpc_prefetch_thread_num : int,分布式lookup table执行RPC通信时,prefetch线程的个数
    • FLAGS_rpc_deadline : int,RPC通信最长等待时间,单位为毫秒,默认180000

    NCCL2模式分布式训练

    基于NCCL2 (Collective Communication) 的多机同步训练模式,仅支持在GPU集群下进行。 此部分详细API说明可以参考 DistributeTranspiler 。

    使用以下代码,将当前 Program 转化成适用于NCCL2分布式计算的Fluid Program

    1. config.mode = "nccl2"
    2. t = fluid.DistributeTranspiler(config=config)
    3. t.transpile(trainer_id,
    4. program=main_program,
    5. startup_program=startup_program,
    6. trainers="192.168.0.1:6174,192.168.0.2:6174",
    7. current_endpoint="192.168.0.1:6174")

    其中:

    • trainer_id : trainer节点的id,从0到n-1,n为当前训练任务中trainer节点的个数
    • programstartup_program : 分别为Fluid 模型的主配置program和初始化startup_program
    • trainers : 字符串类型,指定当前任务所有trainer的IP和端口号,仅用于NCCL2初始化(pserver模式中,此参数为int,指定trainer节点的个数)