From d89a30680e2ea4dbc00fab710513c2ca3816cf25 Mon Sep 17 00:00:00 2001 From: whs Date: Sun, 22 Apr 2018 02:22:53 +0800 Subject: [PATCH 1/3] Fix a wrong variable name. (#10090) --- python/paddle/fluid/layers/nn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 752f4689be..5e6abceb0a 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -2688,7 +2688,7 @@ def edit_distance(input, label, normalized=True, ignored_tokens=None, helper.append_op( type="sequence_erase", inputs={"X": [label]}, - outputs={"Out": [erase_label]}, + outputs={"Out": [erased_label]}, attrs={"tokens": ignored_tokens}) label = erased_label From 7907b6a959ce42faa8b627cf3adff09377981438 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Sun, 22 Apr 2018 21:44:36 +0800 Subject: [PATCH 2/3] split optimization ops on pserver to independenty blocks --- python/paddle/fluid/distribute_transpiler.py | 40 ++++++++++++-------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/python/paddle/fluid/distribute_transpiler.py b/python/paddle/fluid/distribute_transpiler.py index 349427525d..d0b36fa90a 100644 --- a/python/paddle/fluid/distribute_transpiler.py +++ b/python/paddle/fluid/distribute_transpiler.py @@ -25,6 +25,8 @@ LOOKUP_TABLE_TYPE = "lookup_table" LOOKUP_TABLE_GRAD_TYPE = "lookup_table_grad" RPC_CLIENT_VAR_NAME = "RPC_CLIENT_VAR" +GLOBAL_BLOCK_IDX = 0 + class VarBlock: def __init__(self, varname, offset, size): @@ -368,8 +370,8 @@ class DistributeTranspiler: else: recv_inputs.append(single_trainer_var) - # step3 - optimize_block = pserver_program.create_block(0) + optimize_block = None + # step 4 # Create a union-find data structure from optimize ops, # If two ops are connected, we could add these two ops @@ -415,29 +417,34 @@ class DistributeTranspiler: else: self._append_pserver_non_opt_ops(block, op) - append_block = optimize_block # append lr decay ops to the child block if exists + lr_decay_block = None lr_ops = self._get_lr_ops() if len(lr_ops) > 0: + lr_decay_block = pserver_program.create_block(GLOBAL_BLOCK_IDX) for _, op in enumerate(lr_ops): - self._append_pserver_non_opt_ops(append_block, op) - - append_block = pserver_program.create_block(append_block.idx) + self._append_pserver_non_opt_ops(lr_decay_block, op) # append op to the current block - per_opt_block = append_block + per_opt_block = None + pre_block_idx = GLOBAL_BLOCK_IDX + if lr_decay_block is not None: + pre_block_idx = lr_decay_block.idx for idx, opt_op in enumerate(opt_op_on_pserver): + per_opt_block = pserver_program.create_block(pre_block_idx) + if optimize_block is None: + optimize_block = per_opt_block for _, op in enumerate(self.optimize_ops): # optimizer is connected to itself - if ufind.is_connected(op, opt_op) and \ - op not in global_ops: + if ufind.is_connected(op, opt_op) and op not in global_ops: __append_optimize_op__(op, per_opt_block) - if idx == len(opt_op_on_pserver) - 1 and global_ops: - per_opt_block = pserver_program.create_block(append_block.idx) # append global ops + opt_state_block = None + if global_ops: + opt_state_block = pserver_program.create_block(per_opt_block.idx) for glb_op in global_ops: - __append_optimize_op__(glb_op, per_opt_block) + __append_optimize_op__(glb_op, opt_state_block) # NOT USED: single block version: # @@ -451,10 +458,11 @@ class DistributeTranspiler: prefetch_block = None if self.has_distributed_lookup_table: pserver_index = self.pserver_endpoints.index(endpoint) - self._create_table_optimize_block(pserver_index, pserver_program, - append_block) + table_opt_block = self._create_table_optimize_block( + pserver_index, pserver_program, opt_state_block or + pserver_program.global_block()) prefetch_block = self._create_prefetch_block( - pserver_index, pserver_program, optimize_block) + pserver_index, pserver_program, table_opt_block) # NOTE: if has_distributed_lookup_table is False, then prefetch_block will # not be executed, so it's safe to use optimize_block to hold the place @@ -724,6 +732,8 @@ class DistributeTranspiler: outputs=outputs, attrs=table_opt_op.attrs) + return table_opt_block + # ====================== private transpiler functions ===================== def _create_vars_from_blocklist(self, program, From e05f4dfb491dff2508baec4bc442ec7a355c7c97 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Sun, 22 Apr 2018 21:47:33 +0800 Subject: [PATCH 3/3] add some comment --- python/paddle/fluid/distribute_transpiler.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/paddle/fluid/distribute_transpiler.py b/python/paddle/fluid/distribute_transpiler.py index d0b36fa90a..9565e6f4fd 100644 --- a/python/paddle/fluid/distribute_transpiler.py +++ b/python/paddle/fluid/distribute_transpiler.py @@ -370,6 +370,8 @@ class DistributeTranspiler: else: recv_inputs.append(single_trainer_var) + # step 3 + # each optimization op will has a optimize block optimize_block = None # step 4 @@ -433,6 +435,7 @@ class DistributeTranspiler: for idx, opt_op in enumerate(opt_op_on_pserver): per_opt_block = pserver_program.create_block(pre_block_idx) if optimize_block is None: + # first optimize block optimize_block = per_opt_block for _, op in enumerate(self.optimize_ops): # optimizer is connected to itself