fluid.transpiler

SourceEnglish

DistributeTranspiler

SourceEnglish

class paddle.fluid.transpiler.DistributeTranspiler(config=None)

该类可以把fluid program转变为分布式数据并行计算程序(distributed data-parallelism programs),可以有Pserver和NCCL2两种模式。当program在Pserver(全称:parameter server)模式下, mainprogram (主程序)转为使用一架远程parameter server(即pserver,参数服务器)来进行参数优化,并且优化图会被输入到一个pserver program中。在NCCL2模式下,transpiler会在 startup_program 中附加一个 NCCL_ID 广播算子(broadcasting operators)来实现在该集群中所有工作结点共享NCCL_ID 。调用 transpile_nccl2 后, 你 必须trainer_id , num_trainers 参数提供给 ParallelExecutor 来启动NCCL2分布式模式。

代码示例




  1. # for pserver mode
    pserver_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
    trainer_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
    current_endpoint = "192.168.0.1:6174"
    trainer_id = 0
    trainers = 4
    role = os.getenv("PADDLE_TRAINING_ROLE")

    t = fluid.DistributeTranspiler()
    t.transpile(
    trainer_id, pservers=pserver_endpoints, trainers=trainers)
    if role == "PSERVER":
    pserver_program = t.get_pserver_program(current_endpoint)
    pserver_startup_program = t.get_startup_program(current_endpoint,
    pserver_program)
    elif role == "TRAINER":
    trainer_program = t.get_trainer_program()

    # for nccl2 mode
    config = fluid.DistributeTranspilerConfig()
    config.mode = "nccl2"
    t = fluid.DistributeTranspiler(config=config)
    t.transpile(trainer_id, workers=workers, current_endpoint=curr_ep)
    exe = fluid.ParallelExecutor(
    use_cuda,
    loss_name=loss_var.name,
    num_trainers=len(trainers.split(",)),
    trainer_id=trainer_id
    )



transpile(_trainer_id, program=None, pservers='127.0.0.1:6174', trainers=1, sync_mode=True, startup_program=None, current_endpoint='127.0.0.1:6174')

该方法可以运行该transpiler(转译器)。
参数:

- trainer_id (int) – 当前Trainer worker的id, 如果有n个Trainer worker, id 取值范围为0 ~ n-1
- program (Program|None) – 待transpile(转译)的program, 缺省为 fluid.defaultmain_program()
- startup_program (Program|None) - 要转译的 startup_program ,默认为 fluid.default_startup_program()
- pservers (str) – 内容为Pserver列表的字符串,格式为:按逗号区分不同的Pserver,每个Pserver的格式为 _ip地址:端口号

- trainers (int|str) – 在Pserver模式下,该参数指Trainer机的个数;在nccl2模式下,它是一个内容为Trainer终端列表的字符串
- sync_mode (bool) – 是否做同步训练(synchronous training), 默认为True
- startup_program (Program|None) – 待transpile(转译)的startupprogram,默认为 fluid.default_main_program()
- current_endpoint (str) – 当需要把program转译(transpile)至NCCL2模式下时,需要将当前endpoint(终端)传入该参数。Pserver模式不使用该参数
get_trainer_program(_wait_port=True)

该方法可以得到Trainer侧的program。

返回: Trainer侧的program

返回类型: Program
getpserver_program(_endpoint)

该方法可以得到Pserver(参数服务器)侧的程序
参数:

- endpoint (str) – 当前Pserver终端

返回: 当前Pserver需要执行的program

返回类型: Program
getpserver_programs(_endpoint)

该方法可以得到Pserver侧用于分布式训练的 mainprogramstartup_program
参数:

- endpoint (str) – 当前Pserver终端

返回: (main_program, startup_program), “Program”类型的元组

返回类型: tuple
get_startup_program(_endpoint, pserver_program=None, startup_program=None)

该函数已停止使用获取当前Pserver的startupprogram,如果有多个被分散到不同blocks的变量,则修改operator的输入变量。
参数:

- endpoint (str) – 当前Pserver终端
- pserver_program (Program) – 已停止使用。 先调用get_pserver_program
- startup_program (Program) – 已停止使用。应在初始化时传入startup_program

返回: Pserver侧的startup_program

返回类型: Program





## DistributeTranspilerConfig


SourceEnglish

_class paddle.fluid.transpiler.DistributeTranspilerConfig
slicevar_up(_bool)

为Pserver将张量切片, 默认为True
splitmethod(_PSDispatcher)

可使用 RoundRobin 或者 HashName

注意: 尝试选择最佳方法来达到负载均衡。
minblock_size(_int)

最小数据块的大小

注意: 根据:https://github.com/PaddlePaddle/Paddle/issues/8638#issuecomment-369912156 , 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看slicevariable函数。





## HashName


SourceEnglish

_class paddle.fluid.transpiler.HashName(pserver_endpoints)

使用 python Hash() 函数将变量名散列到多个pserver终端。
参数:

- pserver_endpoints (list) - endpoint (ip:port)的 list

memory_optimize

SourceEnglish

paddle.fluid.transpiler.memoryoptimize(_input_program, skip_opt_set=None, print_log=False, level=0, skip_grads=False)

通过重用var内存来优化内存。

注意:它不支持block中嵌套子block。
参数:

- input_program (str) – 输入Program。
- skip_opt_set (set) – set中的vars将不被内存优化。
- print_log (bool) – 是否打印debug日志。
- level (int) - 如果 level=0 并且shape是完全相等,则重用。

返回: None





## releasememory


SourceEnglish

paddle.fluid.transpiler.release_memory(_input_program, skip_opt_set=None)

该函数可以调整输入program,插入 deleteop 删除算子,提前删除不需要的变量。改动是在变量本身上进行的。

提醒 : 该API还在试验阶段,会在后期版本中删除。不建议用户使用。
参数:

- input_program (Program) – 在此program中插入 delete_op
- skip_opt_set (set) – 在内存优化时跳过的变量的集合

返回: None





## RoundRobin


SourceEnglish

_class paddle.fluid.transpiler.RoundRobin(pserver_endpoints)

使用 RondRobin 方法将变量分配给服务器端点。

RondRobin
参数:

- pserver_endpoints (list) - endpoint (ip:port)的 list

原文: http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/transpiler_cn.html