DistributeTranspiler_cn.rst 7.8 KB
Newer Older
T
tangwei12 已提交
1
.. _cn_api_fluid_transpiler_DistributeTranspiler:
H
Hao Wang 已提交
2 3 4 5 6 7 8

DistributeTranspiler
-------------------------------

.. py:class:: paddle.fluid.DistributeTranspiler (config=None)


S
swtkiwi 已提交
9 10 11



T
tangwei12 已提交
12 13 14 15
该类可以把fluid program转变为分布式数据并行计算的program, 有PServer和NCCL2两种模式。
在Pserver(全称:parameter server)模式下, 通过 ``transpile`` 将用于单机训练的 ``program``  转译为可用于parameter server的分布式架构(即PServer,参数服务器)来进行训练的program。
在NCCL2模式下, 通过 ``transpile`` 将用于单机训练的 ``program``  转译为可用于NCCL2的分布式架构来进行训练的program。在NCCL2模式下,transpiler会在 ``startup_program`` 中附加一个 ``NCCL_ID`` 广播
算子(broadcasting operators)来实现在该集群中所有工作结点共享``NCCL_ID`` 。 调用 ``transpile_nccl2`` 后, 你 **必须** 将 ``trainer_id`` , ``num_trainers`` 参数提供给 ``Executor`` 来启动NCCL2分布式模式。
H
Hao Wang 已提交
16 17


T
tangwei12 已提交
18 19 20 21 22 23
参数:
        - **config** (DistributeTranspilerConfig) DistributeTranspiler属性配置实例,定义了program转变所需要的属性, 请参考:`DistributeTranspilerConfig` 相关文档。

返回:初始化后的DistributeTranspiler实例

返回类型:实例(DistributeTranspiler)
H
Hao Wang 已提交
24 25 26 27 28 29


**代码示例**

.. code-block:: python

T
tangwei12 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    x = fluid.layers.data(name='x', shape=[13], dtype='float32')
    y = fluid.layers.data(name='y', shape=[1], dtype='float32')
    y_predict = fluid.layers.fc(input=x, size=1, act=None)

    cost = fluid.layers.square_error_cost(input=y_predict, label=y)
    avg_loss = fluid.layers.mean(cost)

    sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
    sgd_optimizer.minimize(avg_loss)

    # pserver 模式下
    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 = "PSERVER"
    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()

    # nccl2 模式下
    trainer_num = 2
    trainer_id = 0
    config = fluid.DistributeTranspilerConfig()
    config.mode = "nccl2"
    trainer_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
    t = fluid.DistributeTranspiler(config=config)
    t.transpile(trainer_id=trainer_id, trainers=trainer_endpoints, current_endpoint="192.168.0.1:6174")
    exe = fluid.ParallelExecutor(
        use_cuda=True,
        loss_name=avg_loss.name,
        num_trainers=trainer_num,
        trainer_id=trainer_id
    )
H
Hao Wang 已提交
71 72 73 74 75



.. py:method:: 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')

T
tangwei12 已提交
76
通过此方法,可根据用户配置将单机的program转换为当前节点可用的数据并行的分布式program。
H
Hao Wang 已提交
77 78

参数:
T
tangwei12 已提交
79 80 81 82 83 84 85 86 87 88 89
    - **trainer_id** (int) – 当前Trainer worker的id, 如果有n个Trainer worker, id 取值范围为0 ~ n-1
    - **program** (Program|None) – 待transpile(转译)的program, 缺省为 ``fluid.default_main_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(转译)的startup_program,默认为 ``fluid.default_main_program()``
    - **current_endpoint** (str) – 当需要把program转译(transpile)至NCCL2模式下时,需要将当前endpoint(终端)传入该参数。PServer模型下,当用户需要使用增量训练时,必须要指定该参数。

返回:None

H
Hao Wang 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

**代码示例**

.. code-block:: python

    transpiler = fluid.DistributeTranspiler()
    t.transpile(
        trainer_id=0,
        pservers="127.0.0.1:7000,127.0.0.1:7001",
        trainers=2,
        sync_mode=False,
        current_endpoint="127.0.0.1:7000")


.. py:method:: get_trainer_program(wait_port=True)


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

T
tangwei12 已提交
109
返回:    Trainer侧的program
H
Hao Wang 已提交
110

T
tangwei12 已提交
111
返回类型:    Program
H
Hao Wang 已提交
112 113 114 115 116

**代码示例**

.. code-block:: python

T
tangwei12 已提交
117 118 119 120 121 122 123 124
        import paddle.fluid as fluid
        # 这是一个示例,请根据你的情况更改endpoint
        pserver_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
        trainer_id = 0
        trainers = 4
        t = fluid.DistributeTranspiler()
        t.transpile(trainer_id, trainers=trainers, pservers=pserver_endpoints)
        trainer_program = t.get_trainer_program()
H
Hao Wang 已提交
125 126 127 128 129 130 131 132


.. py:method:: get_pserver_program(endpoint)


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

参数:
T
tangwei12 已提交
133
    - **endpoint** (str) – 当前Pserver终端
H
Hao Wang 已提交
134

T
tangwei12 已提交
135
返回:    当前Pserver需要执行的program
H
Hao Wang 已提交
136

T
tangwei12 已提交
137
返回类型:    Program
H
Hao Wang 已提交
138 139 140 141 142

**代码示例**

.. code-block:: python

T
tangwei12 已提交
143 144 145 146 147 148 149 150 151 152
          import paddle.fluid as fluid
          # 这是一个示例,请根据你的情况更改endpoint
          pserver_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
          current_endpoint = "192.168.0.1:6174"
          trainer_id = 0
          trainers = 4
          t = fluid.DistributeTranspiler()
          t.transpile(
               trainer_id, pservers=pserver_endpoints, trainers=trainers)
          pserver_program = t.get_pserver_program(current_endpoint)
H
Hao Wang 已提交
153 154 155 156 157 158 159 160


.. py:method:: get_pserver_programs(endpoint)


该方法可以得到Pserver侧用于分布式训练的 ``main_program`` 和 ``startup_program`` 。

参数:
T
tangwei12 已提交
161
    - **endpoint** (str) – 当前Pserver终端
H
Hao Wang 已提交
162

T
tangwei12 已提交
163 164 165
返回:    (main_program, startup_program), “Program”类型的元组

返回类型:    tuple
H
Hao Wang 已提交
166 167 168 169 170 171


**代码示例**

.. code-block:: python

T
tangwei12 已提交
172 173 174 175 176 177 178 179 180 181
          import paddle.fluid as fluid
          # 这是一个示例,请根据你的情况更改endpoint
          pserver_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
          current_endpoint = "192.168.0.1:6174"
          trainer_id = 0
          trainers = 4
          t = fluid.DistributeTranspiler()
          t.transpile(
               trainer_id, pservers=pserver_endpoints, trainers=trainers)
          pserver_program, pserver_startup_program = t.get_pserver_programs(current_endpoint)
H
Hao Wang 已提交
182 183 184 185 186 187 188 189 190


.. py:method:: get_startup_program(endpoint, pserver_program=None, startup_program=None)


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

参数:
T
tangwei12 已提交
191 192 193
    - **endpoint** (str) – 当前Pserver终端
    - **pserver_program** (Program) – 已停止使用。 先调用get_pserver_program
    - **startup_program** (Program) – 已停止使用。应在初始化时传入startup_program
H
Hao Wang 已提交
194

T
tangwei12 已提交
195
返回:    Pserver侧的startup_program
H
Hao Wang 已提交
196

T
tangwei12 已提交
197
返回类型:    Program
H
Hao Wang 已提交
198 199 200 201 202

**代码示例**

.. code-block:: python

T
tangwei12 已提交
203 204 205 206 207 208 209 210 211 212 213
          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

          t = fluid.DistributeTranspiler()
          t.transpile(trainer_id, pservers=pserver_endpoints, trainers=trainers)
          pserver_program = t.get_pserver_program(current_endpoint)
          pserver_startup_program = t.get_startup_program(current_endpoint,
                                                          pserver_program)
H
Hao Wang 已提交
214 215 216