From 31206399ffcb87648490932665ee2bcfdf66d25e Mon Sep 17 00:00:00 2001 From: SunAhong1993 Date: Wed, 11 Nov 2020 12:35:55 +0800 Subject: [PATCH] add tf optimizer --- x2paddle/convert.py | 24 +- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 158 bytes .../__pycache__/optimizer.cpython-37.pyc | Bin 0 -> 1590 bytes .../__pycache__/pass_.cpython-37.pyc | Bin 0 -> 746 bytes .../__pycache__/pass_manager.cpython-37.pyc | Bin 0 -> 1106 bytes .../pattern_matcher.cpython-37.pyc | Bin 0 -> 8387 bytes x2paddle/optimizer/elimination/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 173 bytes .../optimizer/elimination/dygraph/__init__.py | 16 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 334 bytes .../transpose_eliminate_pass.cpython-37.pyc | Bin 0 -> 969 bytes .../transpose_elimination.cpython-37.pyc | Bin 0 -> 5701 bytes .../dygraph/transpose_eliminate_pass.py | 33 +++ .../dygraph/transpose_elimination.py | 276 ++++++++++++++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 165 bytes x2paddle/optimizer/fusion/dygraph/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1520 bytes .../adaptive_pool2d_fuse_pass.cpython-37.pyc | Bin 0 -> 1011 bytes .../adaptive_pool2d_fuser.cpython-37.pyc | Bin 0 -> 3922 bytes .../batchnorm2d_fuse_pass.cpython-37.pyc | Bin 0 -> 987 bytes .../batchnorm2d_fuser.cpython-37.pyc | Bin 0 -> 4239 bytes .../bn_scale_fuse_pass.cpython-37.pyc | Bin 0 -> 962 bytes .../__pycache__/bn_scale_fuser.cpython-37.pyc | Bin 0 -> 2954 bytes .../constant_fuse_pass.cpython-37.pyc | Bin 0 -> 966 bytes .../__pycache__/constant_fuser.cpython-37.pyc | Bin 0 -> 2192 bytes .../conv2d_add_fuse_pass.cpython-37.pyc | Bin 0 -> 966 bytes .../conv2d_add_fuser.cpython-37.pyc | Bin 0 -> 3808 bytes .../dropout_fuse_pass.cpython-37.pyc | Bin 0 -> 959 bytes .../__pycache__/dropout_fuser.cpython-37.pyc | Bin 0 -> 2173 bytes .../__pycache__/fc_fuse_pass.cpython-37.pyc | Bin 0 -> 924 bytes .../__pycache__/fc_fuser.cpython-37.pyc | Bin 0 -> 4382 bytes ...erpolate_bilinear_fuse_pass.cpython-37.pyc | Bin 0 -> 1046 bytes .../interpolate_bilinear_fuser.cpython-37.pyc | Bin 0 -> 23156 bytes .../reshape_fuse_pass.cpython-37.pyc | Bin 0 -> 959 bytes .../__pycache__/reshape_fuser.cpython-37.pyc | Bin 0 -> 2318 bytes .../tf_batchnorm_fuse_pass.cpython-37.pyc | Bin 0 -> 978 bytes .../tf_batchnorm_fuser.cpython-37.pyc | Bin 0 -> 4273 bytes .../fusion/dygraph/conv2d_add_fuse_pass.py | 33 +++ .../fusion/dygraph/conv2d_add_fuser.py | 119 ++++++++ .../fusion/dygraph/tf_batchnorm_fuse_pass.py | 33 +++ .../fusion/dygraph/tf_batchnorm_fuser.py | 172 +++++++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 298 bytes .../bn_scale_fuse_pass.cpython-37.pyc | Bin 0 -> 958 bytes .../__pycache__/bn_scale_fuser.cpython-37.pyc | Bin 0 -> 3695 bytes x2paddle/optimizer/optimizer.py | 20 +- x2paddle/optimizer/pattern_matcher.py | 109 +++++-- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 172 bytes .../__pycache__/batch_norm.cpython-37.pyc | Bin 0 -> 3708 bytes .../__pycache__/bias.cpython-37.pyc | Bin 0 -> 1801 bytes .../__pycache__/transpose.cpython-37.pyc | Bin 0 -> 5631 bytes x2paddle/optimizer/tensorflow/batch_norm.py | 1 + x2paddle/optimizer/tensorflow/bias.py | 5 - 52 files changed, 801 insertions(+), 44 deletions(-) create mode 100644 x2paddle/optimizer/__pycache__/__init__.cpython-37.pyc create mode 100644 x2paddle/optimizer/__pycache__/optimizer.cpython-37.pyc create mode 100644 x2paddle/optimizer/__pycache__/pass_.cpython-37.pyc create mode 100644 x2paddle/optimizer/__pycache__/pass_manager.cpython-37.pyc create mode 100644 x2paddle/optimizer/__pycache__/pattern_matcher.cpython-37.pyc create mode 100644 x2paddle/optimizer/elimination/__init__.py create mode 100644 x2paddle/optimizer/elimination/__pycache__/__init__.cpython-37.pyc create mode 100644 x2paddle/optimizer/elimination/dygraph/__init__.py create mode 100644 x2paddle/optimizer/elimination/dygraph/__pycache__/__init__.cpython-37.pyc create mode 100644 x2paddle/optimizer/elimination/dygraph/__pycache__/transpose_eliminate_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/elimination/dygraph/__pycache__/transpose_elimination.cpython-37.pyc create mode 100644 x2paddle/optimizer/elimination/dygraph/transpose_eliminate_pass.py create mode 100644 x2paddle/optimizer/elimination/dygraph/transpose_elimination.py create mode 100644 x2paddle/optimizer/fusion/__pycache__/__init__.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/__init__.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/adaptive_pool2d_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/adaptive_pool2d_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/batchnorm2d_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/batchnorm2d_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/bn_scale_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/bn_scale_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/constant_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/constant_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/conv2d_add_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/conv2d_add_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/dropout_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/dropout_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/fc_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/fc_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/interpolate_bilinear_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/interpolate_bilinear_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/reshape_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/reshape_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/tf_batchnorm_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/__pycache__/tf_batchnorm_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/dygraph/conv2d_add_fuse_pass.py create mode 100644 x2paddle/optimizer/fusion/dygraph/conv2d_add_fuser.py create mode 100644 x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuse_pass.py create mode 100644 x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuser.py create mode 100644 x2paddle/optimizer/fusion/static/__pycache__/__init__.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/static/__pycache__/bn_scale_fuse_pass.cpython-37.pyc create mode 100644 x2paddle/optimizer/fusion/static/__pycache__/bn_scale_fuser.cpython-37.pyc create mode 100644 x2paddle/optimizer/tensorflow/__pycache__/__init__.cpython-37.pyc create mode 100644 x2paddle/optimizer/tensorflow/__pycache__/batch_norm.cpython-37.pyc create mode 100644 x2paddle/optimizer/tensorflow/__pycache__/bias.cpython-37.pyc create mode 100644 x2paddle/optimizer/tensorflow/__pycache__/transpose.cpython-37.pyc diff --git a/x2paddle/convert.py b/x2paddle/convert.py index 857856f..b52aefb 100644 --- a/x2paddle/convert.py +++ b/x2paddle/convert.py @@ -128,19 +128,25 @@ def tf2paddle(model_path, else: from x2paddle.op_mapper.static.tf2paddle.tf_op_mapper import TFOpMapper - from x2paddle.optimizer.tensorflow.bias import BiasOpt - from x2paddle.optimizer.tensorflow.transpose import TransposeOpt - from x2paddle.optimizer.tensorflow.batch_norm import BatchNormOpt + print("Now translating model from tensorflow to paddle.") model = TFDecoder(model_path, define_input_shape=define_input_shape) mapper = TFOpMapper(model) mapper.paddle_graph.build() - bias_opt = BiasOpt() - transpose_opt = TransposeOpt() - batch_norm_opt = BatchNormOpt() - bias_opt.run(program) - batch_norm_opt.run(program) - transpose_opt.run(program) + if paddle_type == "dygraph": + from x2paddle.optimizer.optimizer import GraphOptimizer + graph_opt = GraphOptimizer(source_frame="tf", paddle_type=paddle_type) + graph_opt.optimize(mapper.paddle_graph) + else: + from x2paddle.optimizer.tensorflow.bias import BiasOpt + from x2paddle.optimizer.tensorflow.transpose import TransposeOpt + from x2paddle.optimizer.tensorflow.batch_norm import BatchNormOpt + bias_opt = BiasOpt() + transpose_opt = TransposeOpt() + batch_norm_opt = BatchNormOpt() + bias_opt.run(program) + batch_norm_opt.run(program) + transpose_opt.run(program) mapper.paddle_graph.gen_model(save_dir) diff --git a/x2paddle/optimizer/__pycache__/__init__.cpython-37.pyc b/x2paddle/optimizer/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca446d3b764e697952128ef0e6521418ec983c70 GIT binary patch literal 158 zcmZ?b<>g`kf|o&y;z9Id5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vVKR2&LzqmB7 zGBGbLF)!V~P(Q*bATcE+CpA7fKP45;)2}cp01NBq7nEe?W>%#Z>Bq-s=4F<|$LkeT U-r}&y%}*)KNwou6@EM310QFfXnE(I) literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/__pycache__/optimizer.cpython-37.pyc b/x2paddle/optimizer/__pycache__/optimizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9515ac170885096ddc66e6e0521b95ea0abb8210 GIT binary patch literal 1590 zcmZ`3O>f&al+>4H#YwiIYrCP#no9u>g`MV93`0?L19}*i1z3Rw#0G*EDO;&bDJ0#- znQ}^gNO~Ohk9gf_f1#&7N>Sph83{fhL;(-Xyd=l~SH#Cg?1#L9Mc5R<&{R@+9Dij>? zcd27^!w2L!EWHIlAc8p}9`A9F`{$T|SstDv67UF2#&+YSV%6-|%H;F>L@3+i%c-NJ z&Wsyw@4@;Jmi`?;jX8efsV!&F8RHQckEgvFQ6#?yZXdWWYL6$dKjmvv>^MgUe9&U@ zF379{?|^UcP5#-`Z!{qX;LzuLwpT4psnQww`qCAemQoug4b2u>&}KM{I0l#i#ls#>f|GkUdw0}nr=HV<5y5iFZhBV%a$MBt5dDPyn4EeB zUwF0m9-pC8zxFPCj^AT7s{M%II96)Fzb9OTK`f zp>{y&(Sj8%M{U9t%3ZYLifbt4{88@1yaP)+1gd_oq3jKNUO|HCGg zWcwB=_&oAbjxJvZdHDY#?dv0tZjtC-%!(x&m6Jn}n#RT3qOtK0Z4#cjpmhvj0Idwu F`v`CC&cy%# literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/__pycache__/pass_.cpython-37.pyc b/x2paddle/optimizer/__pycache__/pass_.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29bad22565afd2c285dcc7d618002cf977857135 GIT binary patch literal 746 zcmZuv&uiN-6qaNsRkH>LErs5^(+G@u>v@c_b&Oq1*>)IaAY4mHTx{8sWLUyZOa7AG z`Y-9aQ_s8YwD*)I9ixKxL+?Gm_q|VkJsyt;oZAmS#g~YXUwGM`7@Ttudj#qokwnrp zh$5>fr;>dnlc7ma!aw9jKuk%DpvN(R@#G=(F$R z%feb8cc4pp*AXqs8xV_NB!OC*-GK73RrS>1$e{jQq>Xl|?e(J2(?ZXlzeqoyT^3T- zN|dcsyIcD0tPA0^?OfGVOJ!0VD^9zG=R#DvazY&9Oa_Y3*_@^?RDv@RwqqwU2>(8s_AOgDD9Md0^1yBt$TkTdTUH; zCd}Z{elRmdH@{!i3_>(CJ_dISa};2P@WT`iq4+zw-jIkC>Y`C#qq4UDx92nE1m;h6 z6WARQ+e|j$$QKp~;YUI=t?Yqq;SYrP+86aEWAFzvINR)l@{h_I=xmgmx6&YO|BMdL riR&4B_s1ZXgW@!1JmOJ^W)tRz?bWp^UARB=x#ur8U|wO5-yq~K1m&c> literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/__pycache__/pass_manager.cpython-37.pyc b/x2paddle/optimizer/__pycache__/pass_manager.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9e3e2a06dd25f50fec45584fed01413415e6943 GIT binary patch literal 1106 zcmZuvJ8u&~5Z>K;_~M+UfFejFgd!T`CWh1zib6qwup(%Xo7HiJl=4QV6W{x|ZHUatb@;hI+gk0fcCGaLkaP&R6 zo)JL=ox_o2<_xG{!kLo+6YeY0^rBLi>wr!QN=72cf8 z=pX>y7cHxAfF6hqtG7iPvTv4~Cy~}KqC6T(HNFE`_eNm2{3V;h1%9@_s2SLte*o+<`bd;NXh%W~7xCl8ID3#KE%)+5YIF3^-5n#Bh!%H5MUsvfY5czY2)06a4r^$}HF& zP^QF?GkV@q+f$0#lpL-a=rVk1|<$*0OF(VcTU0czG`0bM)?l#j-(I zn@)C`pqgPZgw=xJEU*w1LuSNK&X#O;ozhJcZ7N7UmXNxE0ROFEcyTHtbsydpC2Vr5 zS>1a78(v)&x3l74w;JJ+0p)|EOH~VN*h1@Sep(dgH#JlShZSc}Y*&bT>+V16 CKkQrp literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/__pycache__/pattern_matcher.cpython-37.pyc b/x2paddle/optimizer/__pycache__/pattern_matcher.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8b5c8f598d54b0fbd5edfac0b3cbb5ebd9d3f8d GIT binary patch literal 8387 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 literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/elimination/__init__.py b/x2paddle/optimizer/elimination/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/x2paddle/optimizer/elimination/__pycache__/__init__.cpython-37.pyc b/x2paddle/optimizer/elimination/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61c937cb3a1cddc6660c3465133dbb4d94fbafdc GIT binary patch literal 173 zcmZ?b<>g`kg1D+x@gVv!h=2h`Aj1KOi&=m~3PUi1CZpdg`kg1nwp@h_Md7#@Q-FaYE;H~?|643J1+NMX!j$YqRTWCXF9a+q?NqnLqg z=3oX*mY0k`C7O)4WLzrKixLYm;zNoO^NI`di&I^5GIKNY5=%1k^MLYlIOS6V5{rxd zG+ClVOJG{#QxSTLK#sX3fhm_7UjWot#0->P$xy@!q`<_lIQ`tb68+-RyvoG9w8Xr0 z14I1?qkzPel$_M~;|E$<400V0BLK8SWZnP( literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/elimination/dygraph/__pycache__/transpose_eliminate_pass.cpython-37.pyc b/x2paddle/optimizer/elimination/dygraph/__pycache__/transpose_eliminate_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ad4f293a055ef6dfc95e94179415351dc25fa52 GIT binary patch literal 969 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 literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/elimination/dygraph/transpose_eliminate_pass.py b/x2paddle/optimizer/elimination/dygraph/transpose_eliminate_pass.py new file mode 100644 index 0000000..c60f034 --- /dev/null +++ b/x2paddle/optimizer/elimination/dygraph/transpose_eliminate_pass.py @@ -0,0 +1,33 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from x2paddle.optimizer.pass_ import Pass +from x2paddle.optimizer.elimination.dygraph import Dygraph_TransposeElimination +from x2paddle.optimizer.pass_manager import pass_register + + +@pass_register +class Dygraph_TransposeEliminatePass(Pass): + name = "transpose_eliminate_pass" + + def __init__(self): + Pass.__init__(self) + + def apply(self, graph): + fuser = Dygraph_TransposeElimination() + fuser.operate(graph) + + +# 用于注册 +transpose_eliminate_pass = Dygraph_TransposeEliminatePass() \ No newline at end of file diff --git a/x2paddle/optimizer/elimination/dygraph/transpose_elimination.py b/x2paddle/optimizer/elimination/dygraph/transpose_elimination.py new file mode 100644 index 0000000..8ac5c26 --- /dev/null +++ b/x2paddle/optimizer/elimination/dygraph/transpose_elimination.py @@ -0,0 +1,276 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import numpy as np +from x2paddle.optimizer.pattern_matcher import FuseBase +from x2paddle.core.program import PaddleGraph, PaddleLayer +from x2paddle.core.util import * + + +class Dygraph_TransposeElimination(FuseBase): + def __init__(self): + super(Dygraph_TransposeElimination, self).__init__(graph_type="dygraph") + self.direct_layers = [ + 'paddle.nn.ReLU', 'paddle.nn.ReLU6', 'paddle.abs', + 'paddle.nn.Sigmoid', 'paddle.exp', 'paddle.rsqrt', + 'paddle.nn.Swish', 'paddle.nn.Tanh', + 'paddle.nn.Softplus', 'paddle.nn.LeakyReLU', + 'paddle.nn.Softmax', 'paddle.erf', 'paddle.square' + ] + self.elementwise_layers = [ + 'paddle.add', 'fluid.layers.elementwise_sub', + 'paddle.multiply', 'paddle.divide' + ] + # self.reduce_layers = [] + self.reduce_layers = [ + 'paddle.mean', 'paddle.all', + 'paddle.max', 'paddle.any', + 'paddle.sum', 'paddle.prod' + ] + + def get_transpose_num(self, graph): + count = 0 + for layer_id, layer in graph.layers.items(): + if layer.kernel == "paddle.transpose": + count += 1 + return count + + def operate(self, graph): + total_layer_num = len(graph.layers) + scanned_layers = set() + optimized_transpose_layers = list() + optimized_reduce_layers = list() + optimized_concat_layers = list() + optimized_elementwise_layers = list() + + def strip_transpose(_graph): + layers = copy.deepcopy(_graph.layers) + for layer_id, layer in layers.items(): + if layer_id in scanned_layers: + continue + scanned_layers.add(layer_id) + percent = round(len(scanned_layers) / total_layer_num * 100, 2) + print("\rOptimize Transpose Layers...{}%".format( + percent)) + + if layer.kernel != "paddle.transpose": + continue + if layer.attrs["perm"] != [0, 2, 3, 1]: + continue + transpose_layers = list() + propagate_layers = list() + reduce_layers = list() + concat_layers = list() + # 此elementwise_layers专用于存储shape(4) + shape(1)的形式layer + elementwise_layers = list() + can_be_optimized = True + for out in _graph.edges_out.get(layer_id, []): + if _graph.layers[out].kernel == "paddle.transpose": + if _graph.layers[out].attrs["perm"] != [0, 3, 1, 2]: + can_be_optimized = False + break + transpose_layers.append(out) + elif _graph.layers[out].kernel in self.elementwise_layers: + propagate_layers.append(out) + elif _graph.layers[out].kernel in self.direct_layers: + ouput_index = 1 if _graph.layers[out].kernel.startswith("paddle.nn.") else 0 + if _graph.layers[out].outputs[ouput_index] in _graph.outputs: + can_be_optimized = False + break + propagate_layers.append(out) + elif _graph.layers[out].kernel in self.reduce_layers: + if _graph.layers[out].outputs[0] in _graph.outputs: + can_be_optimized = False + break + if not _graph.layers[out].attrs.get('keepdim', False): + can_be_optimized = False + break + propagate_layers.append(out) + reduce_layers.append(out) + elif _graph.layers[out].kernel == "paddle.concat": + if _graph.layers[out].outputs[0] in _graph.outputs: + can_be_optimized = False + break + propagate_layers.append(out) + concat_layers.append(out) + else: + can_be_optimized = False + break + + visited_layers = set() + while len(propagate_layers) > 0 and can_be_optimized: + current_id = propagate_layers.pop(0) + visited_layers.add(current_id) + for out in _graph.edges_out.get(current_id, []): + if _graph.layers[ + out].kernel == "paddle.transpose": + if _graph.layers[out].attrs["perm"] != [0, 3, 1, 2]: + can_be_optimized = False + break + transpose_layers.append(out) + elif _graph.layers[ + out].kernel in self.elementwise_layers: + if _graph.layers[out].outputs[0] in _graph.outputs: + can_be_optimized = False + break + if out not in visited_layers: + propagate_layers.append(out) + elif _graph.layers[out].kernel in self.direct_layers: + ouput_index = 1 if _graph.layers[out].kernel.startswith("paddle.nn.") else 0 + if _graph.layers[out].outputs[ouput_index] in _graph.outputs: + can_be_optimized = False + break + if out not in visited_layers: + propagate_layers.append(out) + elif _graph.layers[out].kernel in self.reduce_layers: + if _graph.layers[out].outputs[0] in _graph.outputs: + can_be_optimized = False + break + if not _graph.layers[out].attrs.get('keepdim', + False): + can_be_optimized = False + break + if out not in visited_layers: + propagate_layers.append(out) + reduce_layers.append(out) + elif _graph.layers[out].kernel == "paddle.concat": + if _graph.layers[out].outputs[0] in _graph.outputs: + can_be_optimized = False + break + if out not in visited_layers: + propagate_layers.append(out) + concat_layers.append(out) + else: + can_be_optimized = False + break + for ipt in _graph.edges_in.get(current_id, []): + if _graph.layers[ + current_id].kernel in self.elementwise_layers: + try: + x_shape = _graph.layers[ + current_id].input_shapes['x'] + y_shape = _graph.layers[ + current_id].input_shapes['y'] + if _graph.layers[ipt].outputs[ + 0] == _graph.layers[current_id].inputs[ + 'x']: + if len(x_shape) <= 1: + elementwise_layers.append(current_id) + continue + elif _graph.layers[ipt].outputs[ + 0] == _graph.layers[current_id].inputs[ + 'y']: + if len(y_shape) <= 1: + elementwise_layers.append(current_id) + continue + else: + raise Exception( + "Unexcepted situation happend while optimizing transpose" + ) + except Exception as e: + can_be_optimized = False + break + if _graph.layers[ + ipt].kernel == "paddle.transpose": + if _graph.layers[ipt].attrs["perm"] != [0, 2, 3, 1]: + can_be_optimized = False + break + if ipt not in visited_layers: + transpose_layers.append(ipt) + elif _graph.layers[ + ipt].kernel in self.elementwise_layers: + if _graph.layers[ipt].outputs[0] in _graph.outputs: + can_be_optimized = False + break + if ipt not in visited_layers: + propagate_layers.append(ipt) + elif _graph.layers[ipt].kernel in self.direct_layers: + ouput_index = 1 if _graph.layers[ipt].kernel.startswith("paddle.nn.") else 0 + if _graph.layers[ipt].outputs[ouput_index] in _graph.outputs: + can_be_optimized = False + break + if ipt not in visited_layers: + propagate_layers.append(ipt) + elif _graph.layers[ipt].kernel in self.reduce_layers: + if _graph.layers[ipt].outputs[0] in _graph.outputs: + can_be_optimized = False + break + if not _graph.layers[ipt].attrs.get('keepdim', + False): + can_be_optimized = False + break + if ipt not in visited_layers: + propagate_layers.append(ipt) + reduce_layers.append(ipt) + elif _graph.layers[ipt].kernel == "paddle.concat": + if _graph.layers[ipt].outputs[0] in _graph.outputs: + can_be_optimized = False + break + if ipt not in visited_layers: + propagate_layers.append(ipt) + concat_layers.append(ipt) + else: + can_be_optimized = False + break + if not can_be_optimized: + break + if not can_be_optimized: + continue + + transpose_layers.append(layer_id) + transpose_layers = list(set(transpose_layers)) + for l in transpose_layers: + if graph.layers[l].outputs[0] in graph.outputs: + can_be_optimized = False + break + if not can_be_optimized: + continue + + for l in transpose_layers: + self.delete_layer_with_associated(_graph, l) + + optimized_transpose_layers.extend(transpose_layers) + optimized_reduce_layers.extend(reduce_layers) + optimized_concat_layers.extend(concat_layers) + optimized_elementwise_layers.extend(elementwise_layers) + return True + return False + + before_transpose_num = self.get_transpose_num(graph) + opt_graph = copy.deepcopy(graph) + total_layer_num = len(opt_graph.layers) + + while strip_transpose(opt_graph): + pass + + for layer_id in list(set(optimized_transpose_layers)): + self.delete_layer_with_associated(graph, layer_id) + for layer_id in list(set(optimized_reduce_layers)): + dim = graph.layers[layer_id].attrs.get('dim', None) + if dim is not None: + for i in range(len(dim)): + dim[i] = [0, 2, 3, 1][dim[i]] + graph.layers[layer_id].attrs['dim'] = dim + for layer_id in list(set(optimized_concat_layers)): + axis = graph.layers[layer_id].attrs.get('axis', 0) + graph.layers[layer_id].attrs['axis'] = [0, 2, 3, 1][axis] + for layer_id in list(set(optimized_elementwise_layers)): + axis = graph.layers[layer_id].attrs.get('axis', -1) + graph.layers[layer_id].attrs['axis'] = [0, 2, 3, 1][axis] + + current_transpose_num = self.get_transpose_num(graph) + print( + "\nTranspose layers optimized, before: transpose_num={}, after: transpose_num={}". + format(before_transpose_num, current_transpose_num)) diff --git a/x2paddle/optimizer/fusion/__pycache__/__init__.cpython-37.pyc b/x2paddle/optimizer/fusion/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68d33562260803641aea99a589562e288659609a GIT binary patch literal 165 zcmZ?b<>g`kf|o&y;z9Id5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vHKR2&LzqmB7 zGBGbLF)!V~P(Q*bATcE+CpA7fKP45;)2}cp01NBq7nEe?W>%#Z>8F(zXXfYW$H!;p bWtPOp>lIYq;;_lhPbtkwwFBAn8HgDGEG8;r literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__init__.py b/x2paddle/optimizer/fusion/dygraph/__init__.py index 1276449..4bbcf48 100644 --- a/x2paddle/optimizer/fusion/dygraph/__init__.py +++ b/x2paddle/optimizer/fusion/dygraph/__init__.py @@ -20,6 +20,8 @@ from .bn_scale_fuser import Dygraph_BNScaleFuser from .bn_scale_fuse_pass import Dygraph_BNScaleFusePass from .constant_fuser import Dygraph_ConstantFuser from .constant_fuse_pass import Dygraph_ConstantFusePass +from .conv2d_add_fuser import Dygraph_Conv2D_AddFuser +from .conv2d_add_fuse_pass import Dygraph_Conv2D_AddFusePass from .dropout_fuser import Dygraph_DropoutFuser from .dropout_fuse_pass import Dygraph_DropoutFusePass from .fc_fuser import Dygraph_FcFuser @@ -28,3 +30,5 @@ from .interpolate_bilinear_fuser import Dygraph_InterpolateBilinearFuser from .interpolate_bilinear_fuse_pass import Dygraph_InterpolateBilinearFusePass from .reshape_fuser import Dygraph_ReshapeFuser from .reshape_fuse_pass import Dygraph_ReshapeFusePass +from .tf_batchnorm_fuser import Dygraph_TF_BatchNormFuser +from .tf_batchnorm_fuse_pass import Dygraph_TF_BatchNormFusePass diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/__init__.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cca494b2fd65d17a698b810a259e38e71577d94 GIT binary patch literal 1520 zcma)6O>fgM7*5)C{Y=}mO}p-++ZfyEg+LFS5Q0%n;xbK)1M|gln{j{PPlnpRQRQF!$o|5#U)pL~!UIR@UcfB2i7EX7hm zp(;{Uj&qQsd6XA84{Nl53IeaeIxV82zy&DLGAawa4i#EORe_68qZ-l#E8X%F=T)?kD7QD5LXY|<^XC2#|_=?>ZvxCsNgi*^Op zVUO;keSur>gdU&+f!pwu9->2mJ8(pg(J{lug);2^QrV*q)!VJ{%~e4BYy8e4e&j6d zbI*g3bvh62fXRc^@;M1Z=GaIaCnTC)pLqejOQ*$`G#Txr(X)#w0Xw;A?-5=`j6{0x zxnV@yD9NPL$O&UnohDOj-KV5+ zFJV8pksbIRkjOr9z;SI7B*}w+c$TO6(GIVP|8N~Myo~gd%AZbgx;e>hw^xZgd^UWB z3?iEa`=VR$jJHd`Un|sqOv64)26?XQ6W%AT=o6V+Jt}-yhCJwz0V42 z-6LanQMjkFH>A5H-1o@XUFJfQ35$`1iDgMY|8Ahp5*;V1T+*z#8>GF)IX%n8UXAmm z*;LxW}4hESZRo>=-i|Q@z%>=i*tIGi@j~mx1t$N7h488 zTb!?}Ay+!=ANUc59vkIvZ&vK^XwmVGyhX6BcXFBH>b v-xun9wF8s2i{rVb6@Pk6j2+jBFn;de+?HNb&zgh%hA&Qd#7;H!e|~=fole;f literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/adaptive_pool2d_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/adaptive_pool2d_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b5380ef4f02e956a3af14a24c3780805ea9d3a9 GIT binary patch literal 1011 zcmah{J&zMH5VgG@S)v3QibE#>Cn2G2vT*eY9S4Fgil9MmEGu?$3;Tt=K_m)QuH`=f z9e>F!)%^u3X1vLXA_1>vY_IK^_ukCKaM&j>uHXC+>yVINxY>;e7Uy900-Pd>7Nn${ zQe3lwl>ra@Iw-<2;t?e}dQDWQqAQ{zO*g@Y@>s_k!h0%yOVZvo#33nl;Y3;s^YP2& z+{orqJXf-5^G|wG*Tt!NwXoX2@vwnw!svN!TWzNJcsCd<&cW}Jt|i~-ntb=V082Vf znL&Im5hAbhRtThQbus%%%q=+hJ81FPR|=%S5Uy7@+Q?R?fk|*5`MUE6r_dY)?X*y*TC$ z#Q!Tlmd79ngUx>z%*Nmn7P2Jp|Hf&;k9K7l-IQh2^{TJ?$)4k`YNKt{I#C|%x#z=_ jvXXPq1=;(g?%u&N?*s3WvyS;Qq-T-OfWj9HXfpT%H?<5# literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/adaptive_pool2d_fuser.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/adaptive_pool2d_fuser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ba78663f8229a5755d98b764a792bba94532455 GIT binary patch literal 3922 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 literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/batchnorm2d_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/batchnorm2d_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a27d176022bea80695ed1c38a970b4fcbf002753 GIT binary patch literal 987 zcmaJLeitfA}O+yv#NZOO(dlL6iE;XeFm5iwK_1D^v3jsP+WEpXxPfn9)^``}vgoo>kwrv`ANvzTcF zW+Tq?DsMSQqDB?-Uqs)7i$7UXR&8Qd)ml_@Q7vA)Og>C5g_MQjSuNG=Dfv2S+~=fj z+Pus+N+*CQud8GaHaQA*+^lsEI*q^#Vj*<%{0{Ep1JcYTLq0NuSJ1JK|{#%u%BRXa60hi}gY zqG^it34{iF6B^RZ>0Pj0{wxkr>PnP~bKB>wt0k_dv$NJR+M2}ns6n@@-MuWeecLMkT literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/batchnorm2d_fuser.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/batchnorm2d_fuser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87f85018b34020a79081d658fe1d29dfcf40cb2a GIT binary patch literal 4239 zcmb7H%WoUU8Q&+lq$OGLBe7i9rPDSxothG*<-Iof%f;!>{6sC7tJnqc6Pq^ zZ@&3&<+2)E_d21o)Cirj7N2;v!InlvS0fOxv;QI@6i4qtp#)yl%2Qv+$jJPcf8w z9xfE(b3fc#BUAQLBWkWMw|T3^$Q#~NQ|Wly*KXgcip zTMd7;;jhh9r+-qDsMyUmbNXM?o3%iIHQf#(x8-&nKE2ur-L^lSIx@XNQTZY&8zhHU zf-O!HOo4^BwE1p5}xo=Kq8=4?gNkwWkV&vndz!MmF2e8HI?Oe zkrgS;Vul=l0=>YB1N0L@evFOp8dAfa$|i&cP=tn)#PKN8uSL4BqwN`wlx>wwPAOB$ zeJwJ38heVJ+STssJslpNb`@ATBeb7oPYdnZUaqGm8$B8|Xf*YILP(AY$!FNP z%&(2(Et}9~4p~0LW=iOg*pN@>*|*>mMnzl~1U1LLEi4dSBA3xG9+Cczzzw59x+JJ4 zQ`|`Ul0Xew1^wA0(%%(SND1oqwrTFZ4<0R@J6*(wb_mxTqRXYx<$HNpc}{o%NulTR zkQYQhFC#VV2Rt|)4GU;kLukk>lag7MS(y(5+=U*E z7KCRedRZ1`nPc>5RAeDTJ|UVKqLFKDw!hZq1ZMN_Q)3HkkzHpu*v;L1nz zEtb-2kpAa)_y73l@!uZ=ThV&kfBdHp4}ST{SD*dvVDFuS-~a8a&wp{VFGa$ev$G4O z+oe^ny5y<;`%`+x()hV`8WyB@vo5Z2yqeWgw{*9OLIe#?kW)$OT!+J z7rfzyPU$sjU*2pwD4cEo%H@9d@~{!;x!3R@Fsf*CcE0+}!jT}%*M!&e)t}D%Y{=)7 zJPWdnc)mL9Ov*4PU%>E~SO=lde%;6Q@*|B2ZK;dS~aj-g>{gf+UYK116AZ8=sq@r&2Ph_*1A z%lJ5WWHW(YY^^!I?KfIZjTEH+$!@w^cy`cJrd=JNzVA6XH*316bDi8NB#e zG_kssvbn1Xd7k_S7ta%$$}POQ6GDrVEwzNUQE{Qa-UhYt)1cjhAiWclq{oExniIK^ z(~1qx4Wop1QG;R>9dkAlvYNUdc2*K$y(q1})oFMM?OVD9G2pe^!P>02N-rj~sYwN~ zok~uSevMzmiYX6q+}ZJ+y1@|CX-5-d+3m$N&7tk5^v3Th0xjo_9k#a>6Jc^E)lOx!&-7 z#|vYt)owX{)M>?eCkS1y?E_1it7U9-^J&J!1;l8J@*C%56&9h!#+%Mo$mR49%L+2< zO(7neBIn9QPSEgEXzB%bRVt~*6RBn?F>~a*ddOOfiv+xstDhYfOQq|@OmVGxJWKWH z`WYWu5je9b;a|`wQ9;p8ko{)}0 zJ!MbnY1m6>_YE9X^gT`Nh*j)|%^vpP8+y;gE<)eK?t*q6;`pL1%aUNmJvuI*HXa`6}%7oYyhn%<=G&sr^>JjQli*nitl(<+Kl zR0b18B-n~IKZu{rPL!4YiL#O{Q#rAmQ<<-y?K3vp+^Gb-jZ|of>cJ@&<5R;7oyhfs Xy+a3OPyPXK$$;-rrObS!rKbNES=kwu literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/bn_scale_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/bn_scale_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e23945af42f930c88de2ed7dd5994d09a32397b GIT binary patch literal 962 zcmZ`%OK%e~5VpOKEKvdoRiXkR%5g7Q=oz6ZAh@ln_Ja0e%-Ts8_JzHXNEA-#mHzR;f*j5n!}ntCTY#_sP5)ZB*4~ePuPlYisAG}%4 zwP-K+G(FEnsopM((y%{n;hbwVFHEO&j(_b2gWv?r9D!3LqmpDy(#(@gdY2^gd;Bcu z5$(f05QuIc$u0KBni~Y?GeGBvoKwh+17{EHHJG^zt|LF_n*4Mv075j4nZ}B2#CcH{ z9p}i-sB-q3=sR%m_d`^aLU+~XGErC3yu!E*mT68M*bcE}`iE0CEsCI4W9lkUhh_)@4 zk0CUOO=w70Pi`yO-A&^V`&)}jac+m4SB+di`?wu({$(M`?TL@GYlprMiT?veB{ZUI ze9{MCCIlBTpGBVAOXJ8M?i83@D=_IFqLcX9p5tDi$yT7g8&CJ#b7?A3i#ap|X**E+ b;HIMcsSsQn*$^npv;r28*$;=QqVlT8z9YsPP8-h1=rz4v>b z`EuEk;2C^=m--Wu^cV-jM+M?TXc2ZyV#Jqh0$ETg^7NHD)jq#`-l$m23k{D5OWucb0K0 zI=^tS;rK3E!W$&lj9=UZTl5Nau@sX;T9;R4+~YdIBZ3}fAvIX02+XuHjd3S*t4gXx z?a<|12kF$L)C;_rQs7b}*I$BffzpQWL=mOGOaFdVZw7HaY6l%BSaO2p>6!YMvzbR| zqs83OsJ=EE3P;sjVeB=%uFLC7?Z|5d_1uv9Vn8E25`}q}*TN3R$l@s?89Iq{U*GTW zwV{n8FW~7lXdgj~9ziGkEA_w=tI{e#FEh;}31Rv=StiW54yll@nVtmmg`Ig%>d6^r zA~Wl3z6x{^=uBTJL5}i{%$Tl;o%viBaE^4r>X@!WLf7FP8KFyNFQLV3Qbh1&h~Sa- zBM5e7>*md85AO|bUw-!Mm91M3x31sa{%K>;i5n|Hi#KQ4(_0U=@BgrMXXEkZt5zj{ zcCY_=b?djyr+?oJJMl^@c>2ek?Hl)=-2ZvIe`WiZzn(n!{)3Se3PXq*t>D|4%3KAr zp*GSqeL~Dv$GEd-iUryT9qu$og8M8TDB5iMuwRxvH5kNR=yy)6%?*t?Rq4#_qwiG3 zS@WW~nHSkKJ3P$uI%W^D2}G9sw#RBdB0Z|PzT0$z_>vd76tWzQ+pP?2-rvUA=WQG% z@es-vF^NkeiDO8(b#fE|EH9*F4Zx^GF%}xxW4sJJSqEhhpu6k_G;o^kTc{uh(3yP! zwAl81Mnfl#T^`iV`Yk|Vbgnj3(4ESC9|W~|Osxe>t@Eko1z|hxT8qJHL7krFXf)JB zU5umDXtiTtiMmrFTN>PTViz`oOmJbZ0kZQ$Xf5e<5ABKY0Bs&1mb0qO-Khu zj!8W&Q4_MNBpTEtrLQL1Cdn(kypRP&OUojj?xoxls_#W{s($TuqEye)I90+{Sk;AZ zQce66Qfm|~2xk+c??!1M7^x|ZNcwyZ9`*vLDv6FLceb(mPB`_8@|*(=w; zG{6T_8yzE@@(&Pz3As|G|*(-mJ{Pg`3C8glQQ7En1wGbUUI$Vm6!rXd0JTXoJf%TRd4~vUu3uN zU9Xlgam>@M0b}Gl0KHXN;Dk>BZ`I^)qMqZ}A$r7Ys^Ml4e;X!JeF-q{#2gc{I+3C0 zUF3WZR|{GGKnA3mAnlU)z~uqqZyQjmu@t4nY+5L`%h@2W5w^vg*qIi5b}^^h&9IX# z%#3;EbttYTim-a zC;}!XDJf>vG{h|2{xos$R1U)Q`0zqi8(pYsdBLL@PC3U4YEO+A8!hhELf!&oH#s6o hgfpESXK2TsFZSCpFr%{H%GvC|=df%KZ3HNr%73gf9fAM= literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/constant_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/constant_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e49bf6f83ede19ba0d38aa6862ff0290ad33f01 GIT binary patch literal 966 zcmZ`%O>Yx15cS7yvP21>3Zw`mpvS#rp=VT8ErMHA(F@v(vDQwyuwU34iA3R)UilBe zjlbk8r~U;_%y^Rusi~tGkJpoV^XB<4tA;+S7bP(!T0lkhp&hbx2HIa4xNd{qdXS z+{orqoYj?WW!1i2SZ&~9)IfqTdY;=>n+*T9TMU8|F#7_WCMi`UWs0U;F~zS)8gvb$ zVF&5P`!EpSJyBcqY>O^t051?aqfi_d?i}n4%-#prk{@(Ue)=H*B|43n!IoSkL|)~s z5XjH!V)mPudvNjhV^UUaVi(m?Rx?@6U%pB{9Gy$03N5l)>6=sX^{DZmle%g1GGA$v zKu399CEHGu+nr9DrRf9A7|dcLgsu+nqCDC4nE6adMs6T`#}8|?WJA8OHTy)@R8hsg zGn5#Z@~I2jx~YNQppmeqyR&DXJdJxe;YyZT2saR-tknVrDBMtpFAG_0Zvx!?K+Hp^{2wxEVG!Qn zvwj3-d*C7#u!#F_(>QYDod%N|4JO@N^dcYbx$Y#IY$fW(@qAC7FH_1&&S4_R+k?7; a+nVm{+C{HB%Eu3|btE#R@Z&=o4gUelHvHBA literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/constant_fuser.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/constant_fuser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc9fce845563df7b10eac9f83303bb93a490de0f GIT binary patch literal 2192 zcma)7&5smC6tC*9=^18lSw({yGHN6YF*AG^O$-nN8}VQ^L`~Lo&`L91yYx;^cW+e> z&TM*=K}fubA-iadUJP8tz(3%@b6tU5_FwR#?^VytW()_bQ`N6N-mCY1@1xGt zY83))=i@s}0QCqbqhe`;&bv#GUt*G=VIY$CJ zaMnrSaC6P{+<<;U8l@eOLS`FOxgYc-KjTZ@Fw~y&eh@_bobc02qsd49fD1TBkF=3x z)XX6v-vWYbRXpPwnWq5_jCI#D12eGJiDwm;d-gSA5zoP^)&7~m0$#z+Cb7)?I71ag zn+`?dAH`#rFT#+KjOJv`STs=hb&9ruAahogfZmdxr~Kz zm@x*YEXkvJ_?H=LN4}Jd{Yw76(CWrnOZMV{AJ6;o!qH=`&yE*Ruyzvg@vPN9o@#_z zNt%V-aG8tNd{2f++!`v2wgt-OzWE?B`07&{m&wA6Na2D zl10Eb1g9@h#P_;I_3DPPNdOdB#WTzdY=Fn<-26XB(C(rGA!i5vwxzhea5(%D&hOqd-g}GZlN_ zCu-wiFHowcPp~2H0a%hQ45Z}HDO#b+Z#>&o6I^XfOl;_98@dkLRUme=;cE!t+}xm> zWDWdwfUH=04qhA1?c833jDZ~oC@ZjlD&=(1-f(g&FgK0B?3g0&AI7yDc4x@vFR!>T zE9EYnEq_Jwa_;1%H7Ep2U(6K=V$Zfw8Ej}42GjG<EhNcyOMA_Gr0kZ$>e+;w@ zcYe5H_s@W_&QR9dAj<)x?ZwiDn>%BpZw3~w<<0@pal}n96oAPMZRpK8va~ujcDbx0 zCrXlZxunT(USKiV`3G8~EcOAd>@ee9smwGar zb?sG^)E9sSn1@jLb}S>QqPZy9bL}FOQ=Z; z22~qAByAo=jO`W}P`8SQv`aDb_CuFQfICgMs-LDtS=n)~n+}u_r|R|5>(U&*F3n+S zVg;H)U?ueSj}NvJ!JDZ_0ROJQTo+i4)b!+mUKU3BzFqZp<4w6I3rkNw2dujOVZcpM G*ZdcS#$WaT literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/conv2d_add_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/conv2d_add_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29cd8df57ad0191b25aa886e6f159994c38a4c12 GIT binary patch literal 966 zcmaJFJ(QG_59J}^yTCN;7Tp>M(IDVZkE2AwBD08 zZC6yqN}Ci&6-}LP>8AVWj@zXf0M;RhMK*-49{#)b@s4WlV<8+%gdOP1#4H`zkoRoO zUePsGRIv{X=M4q(sSC84Yp8Nq$u7SXuZvni6EKAvG_5wW(+M{*zC%A`7h+?LZ%40i z^IRy~wp`u?(;_yZ5nUbqhqVu%CK0x}mX#L54TY#0wSZ0vHxlB_LY7-kfVXdoxe2-d z!p5N(Bw%pMZ-LkdRLlYvbN_9c#O`o6iSh4AjQhp((|)kW-4ANK9aP_t`+MSino8Dk f4n4ujJ*Ytv`)IoOxUcca4djZx_v$ogS+uh9W zrM}ai6o@4rij#-F0YWydP}_$pydj9f1OLUmlGymE>MKut-|XJnXW3HdL%Gw=e)G*Y z-}lY;bM`{LUM2ARZ{=U?nh0l@FzNnVG66HWut&fm1H!CVXUuF*Cq;`G4m zT5YRqw{0~y0_O^Ojc}7&>x5gLaa(U!IDLaO?OotT7MoN$ul5q}f}40vO-@{PIS;(o zgd4AnCYRj4CxDKg>fn~qPcMMvB>+6qrku33_sJ6FlxyowTjx4A)=AsQg||&^a|h065uW5S zSWP*B3~356!Ho?%)G}?Aa?>Xn<<@PwOu4&Rz}%ki8FM$myj`LPC2ZH$-3pF&;u3G{77R`pFI z)3(shk8={xa_l5~8lq%4-I(O@QyeLoKMj#}vR4DYG`8>F{qE~~yC2{B?z4BdKl*xm za2;O}3(Sx0@{<{6i`nR{*I?59bdIh@UP*xcG2 zyXHe4CyjFrjN#T}l9%j@s7!?$CUKN_Z0;psmB(_c#7?iBJB0BoHHh{=hCI!eNkfv1tkvD=R?80=$$+QyD{`&86kWu@`dSUPtav zA5#}rf-^=iCyzX<4w31sxWM7N5sRJ{ViEnq2&F!u(8pJ;=Xja=fw&#{nYCw%7s#o zqqu1+gG*Cgwj}tn2r~$*uA6pNyrf+#0Jth4FXcSub7?B*pm(PH5UxZi3r9Nq0gRBS z3o@;N(T~G3m_Ev=2RC;xXz*8or?jht38zDS?X8S%5@p3pU`1mHc7uD8c3l&v0MfYr z3<1j`&H&tRxH;6-%!1h^fOKvHg{^Q7;3hL;=-ilmldRn=Ij`>HTmhOp8E|AqrYCnY z+zC9+l9IzcTm{Kh!0E}of?}eeKrL1>2kvBMW;{c#TQDnm+*m2RU0Zzh2xm(JZn~mO z&a$gt*&hX}LX>ZCc`2@XABR zM08Tr38a&b$CteX?&Hl$p1N2D#WW15IH-UV{5W>Gvyd8zH%6X2Tq(|rOSdugy{Gvd8;ESTlSU2Lm0O1;AH+pW6 zuc#Zocn&lWr*S~7WWD&x=y*ZE*q-80^(K)BJB0dX!OEIoRd;C3aLzln!ZxeodB90C z>~$fvv@n*>jXpnG<>yDMsDmueLm{wqw@;LWok)1CSVWM*T~%ZSCW<^hPS8vJKndN` ZGKcamb~ZotdF*Z~TOBBsH7Jmd{sRyREgb*= literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/dropout_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/dropout_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45423a23839a0cde1d526fb461de3384cb7017e4 GIT binary patch literal 959 zcmZ`%OK;Oa5Z;IFm?+^PRiX$X%F!1adPb-!6`Y7FxFBCvtL!E<_{FXxktm$fEB^tw z@t5|>segeJGwY;6YP#0U&OSWfeDm$;cswL9uHOF=?*c;p;9@sI2u{H4DL6$GElEXl zN-<_7t9Z_R%*&t(^Nxbi|)?=p7U*z`Uq2*?d9*-bCR=b~1?9aFeL(`q9-op2N5I`opd5c_F-7kY>9%!RUT%jIJT zEn*WI(bbdNO7?drNrdgKWu=91Lm{e0EueeCjfD8JkmdFyz}dIM+=s;f0izHG(G5Q6 z127wbi&?;8?)N51><)JVq}KwZ{WJ6mKihNM>yvKv>AUfC&pn@}lC_*eLy)!ybq{U` Yy02&#zw8;mx`&k`j}e8Bk7zvl2Xxf>J^%m! literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/dropout_fuser.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/dropout_fuser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fffac02b323126cfb0401d7e3b3f4be77cdeaedd GIT binary patch literal 2173 zcma)7-H#MS5bvJvU3U36!2}hvAtACvb`LNyF()BNga>mWXu@Uv=nUI^$K1}&%=OIT z?q)6l?h-TxdC&(Vh5#C)F9u%4!2i*&z#aE5_@Y%kb9*_%gFTt*>h7xQ>R(q?pRU)d z1lq=h`-}kh6bGBl0_GI_DH2XN4M~SWZ-hqQ?3fhi%+TuF9lP&z96h!|_Y-oKaGN`; zgge4qF*_coACsoL0anOtlPd4SK`KuBsc0H%$9bRgP@I*1a(Q#`kv|d=$k zoA=j$TPK7Yroxl{@1N!lwFRa=YQN;|MtPN zM?bIMy|(_#pU)nD^WH=SHHRk}?>CN3Z=0KsWrGdhoo)nCLjua;@bE-)yBeytTCIuN zcuxU$D~eiWs3<##l0i1!RRVof506emSQp4oD`R*JLfO#^sd6E{Kp`EwrDT)JJpjgR z(^78YXPJEeh zxOlWKvA$Zj~-me0)l|^4e?C0iPdXKD7Ztf?`mL40Ev7OtCkY}*s00-9& zoSV}{`>vB)+`MOSvuDbDco^q$kUK*@e{I==k(+xUTltFQmE6hQ6$qrIFD@3D<;-@` z8EhW>m_@I^pZ)-3cm(4LT>?{Yd}b`0%T{jXv}ed#Zs1yO&XDtDsdf<~6H>Nkq^C4z zfXw&93&5M8dv4hto<^rjTkn7^2b{OH^UlQiId0)x?(8Q$N6vx6aKPNq4$oaAOXo_b z?b&f9kwL!|#&I%sH5<%JtR@@(Kx?}C-XVZ8(NC4rgNqlTaxR5&w+CZ={i*T%da9r|1<3A2g?`mx^#=0atFxL)ocI zk%WF%uq%Ez5Jg~NOvyt)4#ThO9ie-vN2?G^RrqQ!nxZ@Dc;=-s6+}>IG8Tz1iyd1t z;D8^dCtKV1(l{WIyMVyCtT0G3W%a}e4zK-5b<`IqRSFm&dE^09dL5OjIv%OKwRUm~`@-HxBnnlo+=4rVXFDWYgeD#|Iv zn3b#wc;Mrp46BGol<4R!QK5=%h>A4b1v|=P9q$MqsQ5ie2e*)iq|}91(ps2L-mI5K zw%6h^zg$^uU~AmMkuZ8$*iM@qe>e;V!8w?H3QiMF72!-#9w?@Q8^XgLnnyjDd;D*9 z#B`@>kGROi0w4v#&SPyB|p4m5J2ZCGf2ZFLKJn;34v;?E*HOu zc>o80cvjV2W>@uE)(crLpTEdH%&w$Tr51Uk^xZ1^GHd;I*0fzw6&r0bU{o}9w&$4L z=QwTGW&i*aFpCrj-JJa|aC+dC`#W$A^+02LP55_5cH}GDvX6926;|> z2wQ(`p2k?uT2@*JHx#03)C$Ta+(?MeD_QPOLY#dO%p=Ho4-+eI5ZK_8Jq5EdxP*l) z3H;tXP2A*A@#$T~r~Pa5Eq!+6xNpdG-;ll#PmbL4X)0OECDZ~Hdr&vJ-@#*iUGlOQ R`|1Qqql6KKFBs8e^cT)=>L&mI literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/fc_fuser.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/fc_fuser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca5925bbdce516b907721120f0dbe6ac106e69d5 GIT binary patch literal 4382 zcmcH+U2hx5@%FxWq)1s&;t#pDOS@@n+A=B0ia$~*Xwx=%35=pCih@CKIB}QKDaYe^ z?-)z;5ltcmc_p4!st8bO%m=`Evfw9L9G z=DL^rh4QLG4Qg&H)MVP0R<|g5U8&>-z(u)JA&K=$CuA=>A*-m##LpZ`J@zVhg0=p@gd2R$ZeS)wh+pE``?(nxhuX%?}h^spmk2 zd~)I^o2w|wex-p*@CHelVvhpw3(rAANvzmPL?Sg-w$ycvs#Mz{xJO{5-{DA*Aq}I41Y>QZO&j3Gm&w6(1MS2lEkX{wBISa9Q zt#c28xV-n^!8eaTA3S{Ln@``}`}pzR&ZGU0wwsM7AAh<3#c%gM+5YOC_X_3o2jD-y zxA)oZlfOO)Hlww+|Kv}f?0@+A*I)d8zyI$3AO7<7m%n*2Lq?j7`Rmuq%g`;{s)lP$ zz>Zt>n12}&E8~lcf)qI{mlsAB-6pbLERRYx9RugA2zg za}%&-@~T1#Yqc)Be$a_V)j-{q-BOPA^U&W_16E^uAukragHq~YIQs~rbDKN+e+U@ey@_hNqsKY(& z7^R^X=Q2ZQH^=ZkeI0L(A~cjlklVJ%X}mwxI|it{K8u4xE{3wCyE&Nt4m(H;dtRo)gf(ndc@&Hq$Y-NwQix=xF$x| z<_5?fY7tY+!z9=4MBt5K*9y4XszMxhb7I8q)-`r_Zh%EXMdNsz^3%{DbUwv#n*+RH z2mgQ{&mkh=7IfVUQkV2;UOGBtZIvYz|P-ihi)MM8|MT3=wSI zTxu`S679n7b{wx;O8H42t*C+*zX*&5SUC)d<_G8m-MpZLkhcdVly%66{CNZrA^c9I zl;qN5P4b8?a+WZ5Vmd*LZ zt6$v8D8&SdDWt%DPGOGfE64 zG#Gpc0UZD`v82#qKL@3-wM%-17|w9rqWPPOs@Rsq?dNG}7mM~uz$@&MB_%3AAxUD8 zE#N0Icv0?+PBmd)F_!v;*n}eZnTKke|DF0F=}p8FkkF^)G0SWM??{EuV1o}SehHev z-!UDY$LR%Vk_p$ho6Lzi9L}@|`8Jz%E%|i1--BF&xFVZ%^Y?pIS@v{uFkFG!pgWbO z9^bFNCZ1bBk>%t{i66LF28C1>Mc_|5bsG`9%dmFiRg{9sD#>RlHBtQ_$%S`2jKRAK zn|s?)VRo z{pe-LZvgCl_`(Hf(0_~Izw(=gej2jNH2g8XRmdke!_1?@huPt1#E*nx#llA^3b*Z~ zVB4)W?RYpY+BT+mxgy?=`~{HDm$5;el2ZC`Z7|QX?E|$TjbnP}c$JH1?@1Vl=z}b$ zTg);A6dvS;-)X_)^ry(}((plB%^tMXVKSES&pBSz^^+N5qs>`0;BCklEs^}iQ6UL?>vFo7IxtqsODRj%a^ zPyro(XT&n?`UqKDmJU>t+kLr|JzRFRA+ znsLPxKO$=Gh3nOgHcY??Zc#%33XeV&Mitd|b$4 zdlKO6X)-q<$Uh*kS_Y9A{55WY*a%e20v2<>H%Vf5u&dJOqDrH#iG3T~+jHC%akMRB s$IRV5_q>}@R&oyHAO$|CyK{Nf_hsPXCtdnaZ(tgj)PTar2Q(i10p$oCu>b%7 literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/interpolate_bilinear_fuser.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/interpolate_bilinear_fuser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1abdfdb88802ce8c532dddf07b6ee81570e10824 GIT binary patch literal 23156 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 literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/reshape_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/reshape_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0c278fdf16654ea2467c6aeecd344b6505616e3 GIT binary patch literal 959 zcmZ`%OOMkq5cVTUL)G$-R$>uCEXQ0L*z*dl76iAdS}rIT%ZlALkfgy*C0dnJ_sV|& zZu})*IqhHI#EjFfkhbe+#^Xokn{Pf}42OLJfpcN>tgx*%IsUaD41#kodjd|Aj4F~bMKi9L;#VXKI{Yl` z5Z&Vg5Qy%cs2#THu*DR>1p?<3QscmxgS`Q>_rbN~2i=gLz5~FAjuU3EAQuZ!)I}=< zlC!#;{wC%g9Q+k&Rkx{K)+>;kQ38p!o4+2(Wcxu_Lz#}ux&Xta^7PPmD29ePP!i2XFa3!TGv=0e#trKln`=(xNf?#o$*l@PF)AXiNVEKl$G5UMok9yO}q?nR)Z(y*KZ@xim0P zAn@&6dB{Hi^b7~x&jj!xG=)SEL48uA&@-PkjG94l&hX8KRkIqoT27BmKmR$oOoSzJ z%S7Z{W67x5f?g%%{0>MVGi93CpTx?&>bRx* z85vM#0k~R~8oNhksi1-_+ciTN!dxabGd;X!iM+63oV!O%Qpok*$J)VM19RU)Nh<3;lyTR~`6^bT;9AhTQi&PM(Sx6;DtC5n^WVtd*Q$*ms;W3>Il-(G%$**qemS0cgx8zG-5pgI z#zXC>YBP+yhSzpwbv9OBGpJ^YRAp)rhiO+j zXsCyS!S#U@F(_VJGsQve^h4nE;rJOSQ`%Zxeev|s&f4u4zuein|8#5R;r5TqneChR zpKL$=Ve7&2v)gwIrR?jj{c(5e*Nx4;R>M{_-wZZ?f3W@iqvwx*+Frl2{qvvCpL}p-bZz2LuFVWXA2-!?R7a*Vv6=AY4Psjn_Ny#9f z#GZ2l9yks6C<@4;;OxFp@OA9@f`?8NxiY9s`OUiHtBaMcfVLe&JIce0z95U-n8l zQ)co2nr~_6?x5Xevz^Zr?Sio`81I5JWh#e(c?Q(TXRb*4AnUlkyu{K@0_pw0Bo89# zarnSXZX5v)bpi;nZ6ik+&Cx+1%fEt^R(4uuoBnaxJn3=A(O_CxyM$9*@cr$ovSJ8UjLS5&i=FMLJAv z+CI9kJO6#FWgA~6EDW3{1TL~Y|A9>Qsr literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/__pycache__/tf_batchnorm_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/dygraph/__pycache__/tf_batchnorm_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34b99e01000178accba564a4fae84a7dc0e234e5 GIT binary patch literal 978 zcmaJ{bZI35cD5Qbf^` zR5YU$ZC0|1XWZMo45}~-Dbe8zq5>6O5EW{=;TxJoI@*wIprV%~8T^DeB%v-ilh(q1 z^Z7D2vOO2CPQ^rav-4?Vs?&wl2Al^iToOj-h3&MN;nUq>V4Q&1d!RJQs3I9tG~z8HFUcaOWV;KBqPqQQ!0Xd)$4y#@lxFl-%8O l&xfgGEpuQ6YxhYFg4hSs#ZUSgpI$?(hY~=b!NZ0{1B~gIW7;=-wr-5oR%ak1(5CyLzk4=(>5`N21 zctexrU;2!N{59eCHz$*y`#W3!AHC8>4U?Z<0Lk|N;G{(vX=(3~4rP>SdrnJdIy3f2 z%U~w6;B7LSIqN;897g+}_zhQ{LS>-Yq|EZ?5%3gzktoE!5*1P2rPVf`QSD zcqFB%mXTept22%1`xF-sDvdRP0@7x=VsP8dEu=er-Y}%I9(zH|__j2YL7xj@BfH}P zGDtlS_>F{z9e9^KuO0eH;(322|8B2Fak`oe;vGNk`0>WoYpcJyp6`{{?lFEeOFOIE z*ZXQ0S9|?5h=L&(tDQj-^y1aRtJSpQt>bcISgr>&E}H!vQ2|$$;YlzU2({?&^11ud zoOnFlC=FyRczy;?@&tB4odX%cc6CXYGCd#}WyUVupv>IYDJk%l!rKaO1I^ioC@W~C zTmnX*Gxq}xpz;|F6;{ph0fl$%3_Z6za|U0}xnTraq5Z-cu3UQd3?8Kc3nR!B(sO6H za_RXq_yv#yEQ}yiNH3n@sX={>h!!6L06z{$kFfju>`A`Q)IvYIpVn5=SQ2|CDp~D}YAF%6#AY@+O zPg5@9=FPCz_QT}W=0wYI0q29?hR4|hUNT@H9Lba z9OGIVx>$ghScCyC_om)6o51*FiOG5R{J6eN*siByrsm}16w_l7eCF&czv z&<}UUCX(=WjWJ)09b~%H2?qgdhL|3cCJ%YUMQQ7S-TigCv4) zhq?-?7Z`U+$vGzYiNtyHN+E~z;miN$S+`X>1Gj4E8aygP{R@DM9FR=UAgdhe_qCBR zGE;h>W%?lp(vwx5*nffM$=J?Ph8)x=R6bc~r{m%*aYBq-#FV#EncpuqN|E zO3BuZdt~cd_eg5*l98*%vKlK)8&$XOXSC}S+ShXJSyepAoUD@BH_6r>Xh*&O+`c@u zxd=9u#jHHB1e|}l2laSV1xYuTyhk$kpp=!-3k6kjD5IV;DN#`T$(_3mS5{T@^EZnV zH`=}aj&vC3eFd38%A-V@0xAv{b08)4ey=YufTfiOp0oyi23Mw0Q*k0qRqiB2esP1~ z&O}&icp}|+Vk&7>p|+*DT`yp=Qt&`ELl=~8#G836(x6rC3*HH~bCIOwMnMs%peq@4 zj+27Ki#cZ?e>!68K@7z%1#+?GU&B(8D=-i`3qd*yfmNf+5Ult&=sY~G<^XOHpbBuf zba>_bz&ove8ha~X0q>EDz5B3%kn89HJ%oHWGBTs9r8=XSpC8lh8$dBI@*dMSu0V8{ zBP+AICet7y;>;S^nclTBa|KR*g^ZkxW)8+7GZbC#+BjDb`FnDET}FT10<(v7xXI;A7m zd?C94>pDrtHCHpx`@jY%tLrda;q2B+aNFR9Fc&PBmk6t{QZ@@!uX^BSvxnGq=&S}k z;LL`>>igzsj$Hr>>B3DJ&1cXPcFWBEA<>9ehKx|@R?vUYypSz)t7xoXR3}^f`I+{GLsjs|G-ab z-nC)9s9PyyjHKU7_;Bv6kvE-rou2U4V}bccT!f)v=2^vh05zG1#|o$cy>T>jBQ7>L zh`cod{nv+ch5k5hPTO^9s&Y0o!P0sx-A)jO-a|he@Vkw&QZH_zy`$n>i3gF_-t=QI z3E7GFlOXJYq)J&HGzdbL)&oDu!Ftqt7{nW1#QnVAkn;uRp)UeIZgbUzNE@FD_XKbD tMGxwIB(TL2DsE>_G7QonRBjykokMvKe>2~QSFy2F9|2CW)phFV{{?%9V+8;J literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/dygraph/conv2d_add_fuse_pass.py b/x2paddle/optimizer/fusion/dygraph/conv2d_add_fuse_pass.py new file mode 100644 index 0000000..8d796e9 --- /dev/null +++ b/x2paddle/optimizer/fusion/dygraph/conv2d_add_fuse_pass.py @@ -0,0 +1,33 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from x2paddle.optimizer.pass_ import Pass +from x2paddle.optimizer.fusion.dygraph import Dygraph_Conv2D_AddFuser +from x2paddle.optimizer.pass_manager import pass_register + + +@pass_register +class Dygraph_Conv2D_AddFusePass(Pass): + name = "dygraph_conv2d_add_fuse_pass" + + def __init__(self): + Pass.__init__(self) + + def apply(self, graph): + fuser = Dygraph_Conv2D_AddFuser() + fuser.operate(graph, match_kind="edge") + + +# 用于注册 +dygraph_conv2d_add_fuse_pass = Dygraph_Conv2D_AddFusePass() \ No newline at end of file diff --git a/x2paddle/optimizer/fusion/dygraph/conv2d_add_fuser.py b/x2paddle/optimizer/fusion/dygraph/conv2d_add_fuser.py new file mode 100644 index 0000000..6d34621 --- /dev/null +++ b/x2paddle/optimizer/fusion/dygraph/conv2d_add_fuser.py @@ -0,0 +1,119 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import numpy as np +from x2paddle.optimizer.pattern_matcher import FuseBase +from x2paddle.core.program import PaddleGraph, PaddleLayer +from x2paddle.core.util import * + + +class Dygraph_Conv2D_AddFuser(FuseBase): + def __init__(self): + super(Dygraph_Conv2D_AddFuser, self).__init__(graph_type="dygraph") + self.patterns = list() + + def build_pattern(self): + """ 描述需要替换的conv2d+add图结构。 + conv2d+add层模式python实现代码示例: + 模式一: + MobilenetV1_Logits_Conv2d_1c_1x1_biases = self.MobilenetV1_Logits_Conv2d_1c_1x1_biases + conv2d_transpose_14 = paddle.transpose(x=MobilenetV1_Logits_AvgPool_1a_AvgPool, perm=[0, 3, 1, 2]) + MobilenetV1_Logits_Conv2d_1c_1x1_Conv2D = self.conv27(conv2d_transpose_14) + MobilenetV1_Logits_Conv2d_1c_1x1_Conv2D = paddle.transpose(x=MobilenetV1_Logits_Conv2d_1c_1x1_Conv2D, perm=[0, 2, 3, 1]) + MobilenetV1_Logits_Conv2d_1c_1x1_BiasAdd = paddle.add(x=MobilenetV1_Logits_Conv2d_1c_1x1_Conv2D, y=MobilenetV1_Logits_Conv2d_1c_1x1_biases) + 模式二: + MobilenetV1_Logits_Conv2d_1c_1x1_biases = self.MobilenetV1_Logits_Conv2d_1c_1x1_biases + MobilenetV1_Logits_Conv2d_1c_1x1_Conv2D = self.conv27(conv2d_transpose_14) + MobilenetV1_Logits_Conv2d_1c_1x1_BiasAdd = paddle.add(x=MobilenetV1_Logits_Conv2d_1c_1x1_Conv2D, y=MobilenetV1_Logits_Conv2d_1c_1x1_biases) + """ + + def gen_name(id): + return "x" + str(id) + + pattern = PaddleGraph(graph_type="dygraph") + pattern.add_layer( + "self.create_parameter", + inputs={}, + outputs=[gen_name(0)]) + pattern.add_layer( + kernel="paddle.transpose", + inputs={"x": "conv-input-0"}, + outputs=[gen_name(1)], + perm=[0, 3, 1, 2]) + pattern.add_layer( + kernel="paddle.nn.Conv2D", + inputs={"input": gen_name(1)}, + outputs=[gen_name(2)]) + pattern.add_layer( + kernel="paddle.transpose", + inputs={"x": gen_name(2)}, + outputs=[gen_name(2)], + perm=[0, 2, 3, 1]) + pattern.add_layer( + kernel="paddle.add", + inputs={"x": gen_name(2), + "y": gen_name(0)}, + outputs=[gen_name(3)]) + pattern.build(inputs={"input-0": "conv-input-0", }) + self.patterns.append(pattern) + + pattern = PaddleGraph(graph_type="dygraph") + pattern.add_layer( + "self.create_parameter", + inputs={}, + outputs=[gen_name(0)]) + pattern.add_layer( + kernel="paddle.nn.Conv2D", + inputs={"input": "conv-input-0"}, + outputs=[gen_name(1)]) + pattern.add_layer( + kernel="paddle.add", + inputs={"x": gen_name(1), + "y": gen_name(0)}, + outputs=[gen_name(2)]) + pattern.build(inputs={"input-0": "conv-input-0", }) + self.patterns.append(pattern) + + def insert_new_layer(self, graph, parameters, matches): + self.gen_new_layer(matches, graph) + matches_copy = copy.deepcopy(matches) + for layer_id, layer in matches_copy.items(): + if layer.kernel not in ["self.create_parameter", "paddle.add"]: + matches.pop(layer_id) + + def gen_new_layer(self, matches, graph): + is_transpose = False + for layer_id, layer in matches.items(): + if layer.kernel == "self.create_parameter": + bias_name = layer.attrs["attr"] + if layer.kernel == "paddle.transpose": + is_transpose = True + if layer.kernel == "paddle.add": + output_name = layer.outputs[0] + if layer.kernel == "paddle.nn.Conv2D": + conv_id = layer_id + for layer_id, layer in matches.items(): + if layer.kernel == "paddle.nn.functional.conv2d_transpose": + layer.bias = bias_name + if not is_transpose: + layer.outputs[0] = output_name + if layer.kernel == "paddle.nn.Conv2D": + layer.attrs["bias_attr"] = bias_name + if not is_transpose: + layer.outputs[1] = output_name + if layer.kernel == "paddle.transpose": + if conv_id in graph.edges_in[layer_id]: + layer.outputs[0] = output_name + diff --git a/x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuse_pass.py b/x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuse_pass.py new file mode 100644 index 0000000..52265fb --- /dev/null +++ b/x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuse_pass.py @@ -0,0 +1,33 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from x2paddle.optimizer.pass_ import Pass +from x2paddle.optimizer.fusion.dygraph import Dygraph_TF_BatchNormFuser +from x2paddle.optimizer.pass_manager import pass_register + + +@pass_register +class Dygraph_TF_BatchNormFusePass(Pass): + name = "dygraph_tf_batchnorm_fuse_pass" + + def __init__(self): + Pass.__init__(self) + + def apply(self, graph): + fuser = Dygraph_TF_BatchNormFuser() + fuser.operate(graph, match_kind="edge") + + +# 用于注册 +dygraph_tf_batchnorm_fuse_pass = Dygraph_TF_BatchNormFusePass() \ No newline at end of file diff --git a/x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuser.py b/x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuser.py new file mode 100644 index 0000000..e739121 --- /dev/null +++ b/x2paddle/optimizer/fusion/dygraph/tf_batchnorm_fuser.py @@ -0,0 +1,172 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import numpy as np +from collections import OrderedDict +from x2paddle.optimizer.pattern_matcher import FuseBase +from x2paddle.core.program import PaddleGraph, PaddleLayer +from x2paddle.core.util import * + + +class Dygraph_TF_BatchNormFuser(FuseBase): + def __init__(self): + self.bn_index = 0 + super(Dygraph_TF_BatchNormFuser, self).__init__(graph_type="dygraph") + + def build_pattern(self): + """ 描述需要替换的batchnorm图结构。 + batchnorm层模式python实现代码示例: + + """ + + def gen_name(id): + return "x" + str(id) + + self.pattern.add_layer( + "self.create_parameter", + inputs={}, + outputs=[gen_name(0)]) + self.pattern.add_layer( + "paddle.full", + inputs={}, + outputs=[gen_name(1)], + shape=[1]) + self.pattern.add_layer( + "paddle.add", + inputs={"x": gen_name(0), "y": gen_name(1)}, + outputs=[gen_name(2)]) + self.pattern.add_layer( + "paddle.rsqrt", + inputs={"x": gen_name(2)}, + outputs=[gen_name(3)]) + self.pattern.add_layer( + "self.create_parameter", + inputs={}, + outputs=[gen_name(4)]) + self.pattern.add_layer( + "paddle.multiply", + inputs={"x": gen_name(3), "y": gen_name(4)}, + outputs=[gen_name(5)]) + self.pattern.add_layer( + "self.create_parameter", + inputs={}, + outputs=[gen_name(6)]) + self.pattern.add_layer( + "paddle.multiply", + inputs={"x": gen_name(6), "y": gen_name(5)}, + outputs=[gen_name(7)]) + self.pattern.add_layer( + "self.create_parameter", + inputs={}, + outputs=[gen_name(8)]) + self.pattern.add_layer( + "fluid.layers.elementwise_sub", + inputs={"x": gen_name(8), "y": gen_name(7)}, + outputs=[gen_name(9)]) + self.pattern.add_layer( + "paddle.multiply", + inputs={"x": "bn-input-0", "y": gen_name(5)}, + outputs=[gen_name(10)]) + self.pattern.add_layer( + "paddle.add", + inputs={"x": gen_name(10), "y": gen_name(9)}, + outputs=[gen_name(11)]) + self.pattern.build(inputs={"input-0": "bn-input-0", }) + + + def insert_new_layer(self, graph, parameters, matches): + new_layers, last_layer_id = self.gen_new_layer(matches, parameters, graph) + matches_copy = copy.deepcopy(matches) + for layer_id, layer in matches_copy.items(): + for i in range(3): + if layer_id == new_layers[i].id: + matches.pop(new_layers[i].id) + prefix_layers = OrderedDict() + mid_layers = OrderedDict() + suffix_layers = OrderedDict() + is_need_id = False + for layer_id, layer in graph.layers.items(): + if is_need_id: + suffix_layers[layer_id] = layer + else: + if layer_id == last_layer_id: + for i in range(3): + mid_layers[new_layers[i].id] = new_layers[i] + is_need_id = True + prefix_layers[layer_id] = layer + prefix_layers.update(mid_layers) + prefix_layers.update(suffix_layers) + graph.layers = prefix_layers + + def gen_new_layer(self, matches, parameters, graph): + layer_id_list = list(matches.keys()) + layer_id_list.sort(key = int) + for layer_id, layer in matches.items(): + if layer.kernel == "paddle.full": + full_layer = layer + out_layer_id = graph.edges_out[layer_id][0] + if matches[out_layer_id].kernel == "paddle.add": + var_layer_id = graph.edges_in[out_layer_id][0] + var_layer = matches[var_layer_id] + if layer.kernel == "paddle.rsqrt": + out_layer_id = graph.edges_out[layer_id][0] + if matches[out_layer_id].kernel == "paddle.multiply": + gamma_layer_id = graph.edges_in[out_layer_id][1] + gamma_layer = matches[gamma_layer_id] + if layer.kernel == "fluid.layers.elementwise_sub": + in_layer_id = graph.edges_in[layer_id][0] + beta_layer = matches[in_layer_id] + in_layer_id = graph.edges_in[layer_id][1] + in_layer_id = graph.edges_in[in_layer_id][0] + mean_layer = matches[in_layer_id] + out_layer_id = graph.edges_out[layer_id][0] + add_layer = matches[out_layer_id] + if layer.kernel == "paddle.multiply": + in_layer_id = graph.edges_in[layer_id][1] + mul_layer = matches[in_layer_id] + if mul_layer.kernel == "paddle.multiply": + in_layer_id = graph.edges_in[layer_id][0] + if in_layer_id not in matches: + input_name = layer.inputs["x"] + transpose0 = PaddleLayer( + id=layer_id_list[-1] + "_1", + kernel="paddle.transpose", + inputs={"x": input_name}, + outputs=["{}_transpose_for_bn".format(input_name)], + perm=[0, 3, 1, 2]) + bn_name = "merge_bn{}".format(self.bn_index) + self.bn_index += 1 + params = parameters[gamma_layer.outputs[0]] + c = params.shape[0] + bn = PaddleLayer( + id=layer_id_list[-1] + "_2", + kernel="paddle.nn.BatchNorm", + inputs={"input": "{}_transpose_for_bn".format(input_name)}, + outputs=[bn_name, "{}_bn".format(input_name)], + num_channels=c, + epsilon=full_layer.attrs["fill_value"], + param_attr=string(gamma_layer.outputs[0]), + bias_attr=string(beta_layer.outputs[0]), + moving_mean_name=string(mean_layer.outputs[0]), + moving_variance_name=string(var_layer.outputs[0]), + is_test=True) + transpose1 = PaddleLayer( + id=layer_id_list[-1] + "_3", + kernel="paddle.transpose", + inputs={"x": "{}_bn".format(input_name)}, + outputs=add_layer.outputs, + perm=[0, 2, 3, 1]) + return [transpose0, bn, transpose1], layer_id_list[-1] + diff --git a/x2paddle/optimizer/fusion/static/__pycache__/__init__.cpython-37.pyc b/x2paddle/optimizer/fusion/static/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc38809625f72dd47887e9556a56b091d81dc0a0 GIT binary patch literal 298 zcmZ?b<>g`kf|o&y;!iO#FgylvU;xNxZ~)?B86c6ukiwY5kjogw$OvLH>N;Da72?v)XmSiT!JNX4CC+4KOl@_NK0fogdg#!|ci~TfNZt*4M#TSFr z#;1W47lACjC4?dvUjS5F#0->J$xy@wq`<_l2>sl=68+-RyvoG9w8Xr014I1?qkzPe z6rfqj`6;OgUP+pMg;4=mMnAuxBr`X&Dz!)-XkTW2o_;ad#rpB_nR%Hd@$q^EmA5!- Ua`RJ4b5ia2ftD46T*Si&06@!CO#lD@ literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/static/__pycache__/bn_scale_fuse_pass.cpython-37.pyc b/x2paddle/optimizer/fusion/static/__pycache__/bn_scale_fuse_pass.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f45c17e9f43a5ff4f02e220d7f19e8d983ca2e6a GIT binary patch literal 958 zcmZ`%O^?$s5Vf6;hN=Yw2rU9>_nJ!sdq!wgB)FhxMK359%Nx7hK)%*?C0dnJ_sV|& zZu})*IqhHI#7sf~sm0Zd#~F9tyf>bX$3p_^=IuBB#wX+l9(F5$;0(-6!AT-%Nh+FA ziZLr$(zS4*Qbd>*%u=2|TZW0lVFPrJn+I0G{$;1tQIBpH)5^CXkrHOc%QJ_~w4 z_i!HpvE3unBVW|qAT*x?Hb>l?LSJ0&{6kSoV2>r-plOvBR>hu<@Ek0(XfIuWit0{>-r+lQfoR)u z^%z2f*o203{p3F#cURLmM15;fDbC%H^Qw_ckdM0&=T}Qn{?7QgcVg(fQ1>5PoPgsKf`XsCkN8~bSC|DdM%C*Tj$g=RM;Wcd&EhF{1GEMl>4z0@W+`Q2+n{ literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/fusion/static/__pycache__/bn_scale_fuser.cpython-37.pyc b/x2paddle/optimizer/fusion/static/__pycache__/bn_scale_fuser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06a4974a2bac54b6eecbbcc8ebf0ebbc3a8e9d50 GIT binary patch literal 3695 zcmb_f-;Wzd9pBksUi*AWxF!t|MKYx*=W_8~E=@yGTtO-k9;#DC`hbjJwC5RL_E_(l z+1)fYYpHDx^#P@M-~owN)m^C&yrA+*QTu<)Yn!`T;xFI@zTcVk+P+*;Bv@-_XTI~D z@Ao^OnePwZSYECf@JxR4A-%a`7@y-{`q|U(WcpY|CwT!nT$$1_-!XcG5oYdr9gA7a-ZMJ3R^D+~g?TV`-!W{X zQvnmI@~K;?p9WoeW9wGe4>=klx}*?{UsQr`@-#H5k&@iFXYQJ);y%G0f*5N{R@iU{ zO$IA#szcM^fHy7aB-wxq;lgU^Q5r-+N-1#J2@iYlty0N4rQ6O{C z8Vm&)+@aPYF+kV=;9mS%*$sWG<>Cq>@JN#hp^EcnFHHv3`{%>y|{`uhHKOPK* z>Fqdr_}34P-u?KCPyTqc|JKn*fB)js-+sSbg^Rm!bmuDFjvDPoFU$hg3ei)NmXb(O znUSC%ql6{q;L2pa}I>P73wgSr9U~@+sW+sC7Mz zAzdUdx2Eey=N}VQq@%*hsJ0zlQoTzX0~KF zeNWoxd=oTXoQ6h{;pmx#74xtI$P>&_6Rb}rn5mw?3}-aKWIU=AhBt{g3*#-w)s+GX zSp_bt?x=JWMomjB0h54=$dF5Vim*3y@v__Trs* zL?1IDPh>SJ#nj6#ee@=u2_mRmQd;u73fo9LXbgbt45^XPb0-0Ed|4N-2R?X+WhwJd z7=UA$`vh?qTZj#!0eINCy=x*WyNWV)p=XaPsl&{DH+K&RlnE7PT{nPY&ruLRl;W0B ztg)vkl^I1L?&f5_f|AD7yqYU%7Yry+-QSoOj6#a{m1~^&HL0iVXVspWJGsYd@0)q$ z_vX7~T+3?^I+pZVj=W!wb!Awbj>`F?Do}N}mDREmnEV?afij<2QT$@W6yFA#inbfj!K;P-Sc7*3e%PK`Ljn(_Q?fjX?j@uqn(t>8m0Z1Wl)z>S*P?@nIGyIRi2Ay(Y{OApjC3Y z_pyIu BA0q$& literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/optimizer.py b/x2paddle/optimizer/optimizer.py index 173383a..7e014bf 100644 --- a/x2paddle/optimizer/optimizer.py +++ b/x2paddle/optimizer/optimizer.py @@ -15,6 +15,7 @@ from x2paddle.optimizer.pass_manager import PassManager from x2paddle.optimizer.fusion.dygraph import * from x2paddle.optimizer.fusion.static import * +from x2paddle.optimizer.elimination.dygraph import * class GraphOptimizer(object): def __init__(self, source_frame, paddle_type="dygraph"): @@ -30,6 +31,12 @@ class GraphOptimizer(object): self.passes = ["dygraph_bn_scale_fuse_pass"] else: self.passes = ["static_bn_scale_fuse_pass"] + elif source_frame == "tf": + self.passes = [ + "dygraph_conv2d_add_fuse_pass", + "dygraph_tf_batchnorm_fuse_pass", + "transpose_eliminate_pass" + ] else: # TODO pass @@ -37,11 +44,14 @@ class GraphOptimizer(object): def optimize(self, graph): for pass_name in self.passes: pass_ = PassManager.lookup(pass_name)() - while True: - before_len = len(graph.layers) + if pass_name.endswith("_eliminate_pass"): pass_.apply(graph) - after_len = len(graph.layers) - if before_len == after_len: - break + else: + while True: + before_len = len(graph.layers) + pass_.apply(graph) + after_len = len(graph.layers) + if before_len == after_len: + break print("{} done!".format(pass_name)) return graph diff --git a/x2paddle/optimizer/pattern_matcher.py b/x2paddle/optimizer/pattern_matcher.py index c5b38b0..cc86025 100644 --- a/x2paddle/optimizer/pattern_matcher.py +++ b/x2paddle/optimizer/pattern_matcher.py @@ -19,6 +19,7 @@ class PatternMatcher(object): def __init__(self, pattern): self.pattern = pattern # matches的每个match是按照拓扑排序组成layer的dict + self.matches = list() def operate(self, graph, match_kind="topo"): @@ -154,7 +155,7 @@ class PatternMatcher(object): if len(block.layers) > 0: self.detect_patterns_by_topo(layer.blocks[j]) - def detect_patterns_by_edge(self, graph, ignore_list_inputs=True): + def detect_patterns_by_edge(self, graph): """当遇见顺序没有强制规定的pattern时使用该方式 """ @@ -163,8 +164,8 @@ class PatternMatcher(object): pattern_ids = list(pattern_id2layers.keys()) pattern_layer_id = pattern_ids[0] subgraph_id2layers = dict() - graph_layers = dict(list(graph.layers.items())[start_index:]) - layer_id = list(graph_layers.keys())[0] + layer_id = list(graph.layers.keys())[start_index] + graph_layers = graph.layers def update(layer_id, pattern_layer_id): layer = graph_layers[layer_id] @@ -172,14 +173,25 @@ class PatternMatcher(object): if layer.kernel != pattern_layer.kernel: return False subgraph_id2layers[layer_id] = layer - for i, pattern_layer_id_in in enumerate(pattern.edges_in[ - pattern_layer_id]): - if pattern_layer_id_in == -1 or ignore_list_inputs: - continue - layer_id_in = graph.edges_in[layer_id][i] - subgraph_ids = list(subgraph_id2layers.keys()) - if layer_id_in not in subgraph_ids: +# for k, v in subgraph_id2layers.items(): +# print(k) +# print(v.kernel) +# print(v.outputs) +# print("=========") + + if pattern.edges_in.get(pattern_layer_id, 0) != 0: + if len(pattern.edges_in[pattern_layer_id]) != \ + len(graph.edges_in[layer_id]): return False + for i, pattern_layer_id_in in enumerate(pattern.edges_in[ + pattern_layer_id]): + if pattern_layer_id_in == -1: + continue + if pattern_layer_id_in in pattern_ids: + new_layer_id_in = graph.edges_in[layer_id][i] + if new_layer_id_in in subgraph_id2layers: + continue + update(new_layer_id_in, pattern_layer_id_in) if pattern.edges_out.get(pattern_layer_id, 0) != 0: if len(pattern.edges_out[pattern_layer_id]) != \ len(graph.edges_out[layer_id]): @@ -188,17 +200,8 @@ class PatternMatcher(object): pattern_layer_id]): if pattern_layer_id_out in pattern_ids: new_layer_id_out = graph.edges_out[layer_id][i] - for j, new_new_layer_id_in in enumerate( - graph.edges_in[new_layer_id_out]): - if new_new_layer_id_in not in subgraph_id2layers: - if ignore_list_inputs: - continue - new_new_pattern_layer_id_in = pattern.edges_in[ - pattern_layer_id_out][j] - if new_new_pattern_layer_id_in == -1: - continue - update(new_new_layer_id_in, - new_new_pattern_layer_id_in) + if new_layer_id_out in subgraph_id2layers: + continue update(new_layer_id_out, pattern_layer_id_out) while len(subgraph_id2layers) != len(pattern_id2layers): @@ -258,6 +261,7 @@ def get_subgraph(prefix_layer_id, suffix_layer_id, graph): class FuseBase(object): def __init__(self, graph_type): self.pattern = PaddleGraph(graph_type=graph_type) + self.patterns = list() def operate(self, graph, match_kind="topo"): parameters = graph.parameters @@ -267,16 +271,22 @@ class FuseBase(object): first_layer_id = list(match.keys())[0] subgraph = get_subgraph("", first_layer_id, graph) self.insert_new_layer(subgraph, parameters, match) - self.delete_inter_layer(graph) + self.delete_layer(graph) graph.build() def perform_pattern_matcher(self, graph, match_kind="topo"): """ 执行模式匹配,找到匹配的子图。 """ - pattern_matcher = PatternMatcher(self.pattern) - self.matches = pattern_matcher.operate(graph, match_kind) + if len(self.patterns) > 0: + self.matches = list() + for pattern in self.patterns: + pattern_matcher = PatternMatcher(pattern) + self.matches.extend(pattern_matcher.operate(graph, match_kind)) + else: + pattern_matcher = PatternMatcher(self.pattern) + self.matches = pattern_matcher.operate(graph, match_kind) - def delete_inter_layer(self, graph): + def delete_layer(self, graph): """ 删除不需要的中间layer及其对应参数。 """ for match in self.matches: @@ -291,3 +301,52 @@ class FuseBase(object): if layer_id in subgraph.layers: # layer_id可能是属于子图的,此时删除父layer,即删除整个子图 subgraph.layers.pop(layer_id) + + def delete_layer_with_associated(self, graph, layer_id): + """ 删除不需要的中间layer及其相关连接点。 + """ + layer = graph.layers[layer_id] + outputs = graph.edges_out.get(layer_id, []) + inputs = graph.edges_in.get(layer_id, []) + + assert len( + inputs) <= 1, "There should be 0 or 1 input for deleted layer." + + if len(inputs) == 0: + for out in outputs: + while layer_id in graph.edges_in[out]: + index = graph.edges_in[out].index(layer_id) + del graph.edges_in[out][index] + + input_keys = list(graph.layers[out].inputs.keys()) + for k in input_keys: + if graph.layers[out].inputs[k] == layer.outputs[0]: + del graph.layers[out].inputs[k] + + del graph.layers[layer_id] + if layer_id in graph.edges_in: + del graph.edges_in[layer_id] + if layer_id in graph.edges_out: + del graph.edges_out[layer_id] + return + + # 将所有输出layer的输入layer进行替换 + for out in outputs: + for i in range(len(graph.edges_in[out])): + if graph.edges_in[out][i] == layer_id: + graph.edges_in[out][i] = inputs[0] + + # 将输出layer赋给输入layer的输出 + replace_index = graph.edges_out[inputs[0]].index(layer_id) + del graph.edges_out[inputs[0]][replace_index] + for i, out in enumerate(outputs): + graph.edges_out[inputs[0]].insert(replace_index + i, out) + for k, v in graph.layers[out].inputs.items(): + if v == layer.outputs[0]: + graph.layers[out].inputs[k] = list(layer.inputs.values())[0] + + del graph.layers[layer_id] + if layer_id in graph.edges_out: + del graph.edges_out[layer_id] + if layer_id in graph.edges_in: + del graph.edges_in[layer_id] diff --git a/x2paddle/optimizer/tensorflow/__pycache__/__init__.cpython-37.pyc b/x2paddle/optimizer/tensorflow/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5ed09037dfc2e4c8329e2cd9de5a3577880cac5 GIT binary patch literal 172 zcmZ?b<>g`kf|o&y;z9Id5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o10WKR2&LzqmB7 zGBGbLF)!V~P(Q*bATcE+CpA7fKP45xD@oI@Fe(7c=;s%dWaeg8r55Rzq~;ap7p3Lo hm+QyJXXa&=#K-FuRNmsS$<0qG%}KQbS@#);832FnEn)xw literal 0 HcmV?d00001 diff --git a/x2paddle/optimizer/tensorflow/__pycache__/batch_norm.cpython-37.pyc b/x2paddle/optimizer/tensorflow/__pycache__/batch_norm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6acff6e41da67ad1e9a9ae862bfe702240f6d34 GIT binary patch literal 3708 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