Exemplo n.º 1
0
    def __init__(self, decoder):
        self.support_op_sets = [9, ]
        self.default_op_set = 9
        self.graph = decoder.graph
        self.paddle_graph = PaddleGraph(parent_layer=None, source_type="onnx")
        self.paddle_graph.outputs = self.graph.output_nodes
        self.opset = self.create_opset(decoder)
        if not self.op_checker():
            raise Exception("Model is not supported yet.")

        print("Total nodes: {}".format(
            sum([
                isinstance(node, ONNXGraphNode)
                for name, node in self.graph.node_map.items()
            ])))
        print("Nodes converting ...")
        for i, node_name in enumerate(self.graph.topo_sort):
            sys.stderr.write("\rConverting node {} ...     ".format(i + 1))
            node = self.graph.get_node(node_name)
            op = node.layer_type
            if hasattr(self.opset, op):
                func = getattr(self.opset, op)
                func(node)
            elif op in self.opset.directly_map_ops:
                self.opset.directly_map(node)
            elif op in self.opset.elementwise_ops:
                self.opset.elementwise_map(node)
        print("\nNodes converted.")
        self.paddle_graph.set_name(self.graph.graph_name)
        self.paddle_graph.set_parameters(self.opset.weights)
        self.paddle_graph.set_inputs_info(self.opset.inputs_info)
Exemplo n.º 2
0
    def build_pattern(self):
        """ 描述需要替换的batchnorm2d图结构。
        batchnorm2d层模式python实现代码示例:
            模式一:
            bn_conv1 = self.batchnorm0(conv1)
            scale_conv1_cparam1 = self.scale_conv1_cparam1
            scale_conv1_mul = paddle.multiply(x=bn_conv1, y=scale_conv1_cparam1, axis=1)
            scale_conv1_cparam2 = self.scale_conv1_cparam2
            scale_conv1 = paddle.add(x=scale_conv1_mul, y=scale_conv1_cparam2, axis=1)
            模式二:
            bn_conv1 = self.batchnorm0(conv1)
            scale_conv1_cparam1 = self.scale_conv1_cparam1
            scale_conv1_mul = paddle.multiply(x=bn_conv1, y=scale_conv1_cparam1, axis=1)
            scale_conv1_cparam2 = self.scale_conv1_cparam2
            scale_conv1_cparam2 = paddle.reshape(x=scale_conv1_cparam2, shape=[32, 1, 1])
            scale_conv1 = paddle.add(x=scale_conv1_mul, y=scale_conv1_cparam2, axis=1)
        """

        def gen_name(id):
            return "x" + str(id)

        pattern = PaddleGraph()
        pattern.add_layer(
            "paddle.nn.BatchNorm2D",
            inputs={"input": "bn-input-0"},
            outputs=[gen_name(0)])
        pattern.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(1)])
        inputs_dict = {}
        inputs_dict['x'] = gen_name(0)
        inputs_dict['y'] = gen_name(1)
        pattern.add_layer(
            "paddle.multiply", inputs=inputs_dict, outputs=[gen_name(2)])
        pattern.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(3)])
        inputs_dict = {}
        inputs_dict['x'] = gen_name(2)
        inputs_dict['y'] = gen_name(3)
        pattern.add_layer(
            "paddle.add", inputs=inputs_dict, outputs=[gen_name(4)])
        pattern.build(inputs={"input-0": "bn-input-0"})
        self.patterns.append(pattern)

        pattern = PaddleGraph()
        pattern.add_layer(
            "paddle.nn.BatchNorm2D",
            inputs={"input": "bn-input-0"},
            outputs=[gen_name(0)])
        pattern.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(1)])
        inputs_dict = {}
        inputs_dict['x'] = gen_name(0)
        inputs_dict['y'] = gen_name(1)
        pattern.add_layer(
            "paddle.multiply", inputs=inputs_dict, outputs=[gen_name(2)])
        pattern.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(3)])
        pattern.add_layer(
            "paddle.reshape", inputs={"x": gen_name(3)}, outputs=[gen_name(3)])
        inputs_dict = {}
        inputs_dict['x'] = gen_name(2)
        inputs_dict['y'] = gen_name(3)
        pattern.add_layer(
            "paddle.add", inputs=inputs_dict, outputs=[gen_name(4)])
        pattern.build(inputs={"input-0": "bn-input-0"})
        self.patterns.append(pattern)
Exemplo n.º 3
0
    def build_pattern(self):
        """ 描述需要替换的fc图结构。
        fc层模式python实现代码示例:
           模式一:
           encoder_layer_8_attention_self_key_weight = self.encoder_layer_8_attention_self_key_weight
           x748 = paddle.transpose(x=encoder_layer_8_attention_self_key_weight, perm=[1, 0])
           x749 = paddle.matmul(x=x732, y=x748)
           encoder_layer_8_attention_self_key_bias = self.encoder_layer_8_attention_self_key_bias
           x750 = x749 + 1 * encoder_layer_8_attention_self_key_bias
           模式二:
           x13 = self.x13
           x14 = paddle.transpose(x=x13, perm=[1, 0])
           x15 = self.x15
           x16 = paddle.addmm(input=x15, x=x12, y=x14, beta=1, alpha=1)
        """
        def gen_name(id):
            return "x" + str(id)

        pattern = PaddleGraph()
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(0)])
        pattern.add_layer("paddle.transpose",
                          inputs={"x": gen_name(0)},
                          outputs=[gen_name(1)],
                          perm=[1, 0])
        pattern.add_layer("paddle.matmul",
                          inputs={
                              "x": "fc-input-0",
                              "y": gen_name(1)
                          },
                          outputs=[gen_name(2)])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(3)])
        pattern.add_layer("prim.add_",
                          inputs={
                              "x": gen_name(2),
                              "y": gen_name(3)
                          },
                          outputs=[gen_name(4)],
                          alpha=1)
        pattern.build(inputs={"input-0": "fc-input-0"})
        self.patterns.append(pattern)

        pattern = PaddleGraph()
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(0)])
        pattern.add_layer("paddle.transpose",
                          inputs={"x": gen_name(0)},
                          outputs=[gen_name(1)],
                          perm=[1, 0])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(2)])
        pattern.add_layer("paddle.addmm",
                          inputs={
                              "input": gen_name(2),
                              "x": "fc-input-0",
                              "y": gen_name(1)
                          },
                          outputs=[gen_name(4)],
                          alpha=1,
                          beta=1)
        pattern.build(inputs={"input-0": "fc-input-0"})
        self.patterns.append(pattern)
Exemplo n.º 4
0
    def build_pattern(self):
        """ 描述需要替换的fc图结构。
        fc层模式python实现代码示例:
            x133 = x128.shape
            x133 = len(x133)
            x134 = x133 == 2
            if x134 :
                classifier_6_weight = self.classifier_6_weight
                x136 = paddle.transpose(x=classifier_6_weight, perm=[1, 0])
                classifier_6_bias = self.classifier_6_bias
                x137 = paddle.addmm(input=classifier_6_bias, x=x128, y=x136, beta=1, alpha=1)
                x135 = x137
            else:
                classifier_6_weight = self.classifier_6_weight
                x138 = paddle.transpose(x=classifier_6_weight, perm=[1, 0])
                x139 = paddle.matmul(x=x128, y=x138)
                classifier_6_bias = self.classifier_6_bias
                x140 = x139 + 1 * classifier_6_bias
                x135 = x140
        """

        def gen_name(id):
            return "x" + str(id)

        self.pattern.add_layer(
            "prim.shape", inputs={'input': "fc-input-0"},
            outputs=[gen_name(2)])
        self.pattern.add_layer(
            "prim.len", inputs={'input': gen_name(2)}, outputs=[gen_name(2)])
        self.pattern.add_layer(
            "prim.eq",
            inputs={"eq0": gen_name(2)},
            outputs=[gen_name(3)],
            eq1=2)
        self.pattern.add_layer("prim.if", {'input': gen_name(3)}, [gen_name(4)])
        self.pattern.outputs.append(gen_name(4))
        if_layer1 = self.pattern.layers[list(self.pattern.layers.keys())[-1]]
        pattern_block0 = PaddleGraph(parent_layer=if_layer1)
        pattern_block0.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(5)])
        pattern_block0.add_layer(
            "paddle.transpose",
            inputs={"x": gen_name(5)},
            outputs=[gen_name(6)],
            perm=[1, 0])
        pattern_block0.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(7)])
        pattern_block0.add_layer(
            "paddle.addmm",
            inputs={"input": gen_name(7),
                    "x": "fc-input-0",
                    "y": gen_name(6)},
            outputs=[gen_name(8)],
            beta=1,
            alpha=1)
        if_layer1.inputs["input-0"] = "fc-input-0"
        self.pattern.inputs.append("fc-input-0")
        pattern_block0.add_layer(
            "prim.equal", inputs={'input': gen_name(8)}, outputs=[gen_name(4)])
        if_layer1.add_block(pattern_block0)
        pattern_block1 = PaddleGraph(parent_layer=if_layer1)
        pattern_block1.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(5)])
        pattern_block1.add_layer(
            "paddle.transpose",
            inputs={"x": gen_name(5)},
            outputs=[gen_name(6)],
            perm=[1, 0])
        pattern_block1.add_layer(
            "paddle.matmul",
            inputs={"x": "fc-input-0",
                    "y": gen_name(6)},
            outputs=[gen_name(9)])
        if_layer1.inputs["input-1"] = "fc-input-0"
        pattern_block1.add_layer(
            "self.create_parameter", inputs={}, outputs=[gen_name(12)])
        pattern_block1.add_layer(
            "prim.add_",
            inputs={"x": gen_name(9),
                    "y": gen_name(12)},
            outputs=[gen_name(13)],
            alpha=1)
        pattern_block1.add_layer(
            "prim.equal", inputs={'input': gen_name(13)},
            outputs=[gen_name(4)])
        if_layer1.add_block(pattern_block1)
        self.pattern.build(inputs={"input-0": "fc-input-0"})
Exemplo n.º 5
0
    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()
        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()
        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 build_pattern(self):
        """ 描述需要替换的双线性插值图结构。
        interpolate_bilinear层模式python实现代码示例:
            x2195 = x2181.shape
            x2195 = len(x2195)
            x2196 = x2195 - 2
            x2197 = []
            for _x2199 in range(x2196):
                x2197.append(None)
            x2200 = (x2181, x8, None, None)
            ...
            x2267 = x2266 == 3
            if x2267 :
                raise RaiseException('Exception')
                x2268 = None
            else:
                x2270 = x2181.shape
                x2270 = len(x2270)
                x2271 = x2270 == 4
                if x2271 :
                    x2274 = x2197[0]
                    x2275 = x2197[1]
                    x2233_isinstance = isinstance(x2233, paddle.fluid.Variable)
                    if x2233_isinstance :
                        x2233 = x2233.numpy().tolist()
                    x2276 = paddle.nn.functional.interpolate(x=x2181, size=x2233, scale_factor=x2274, align_corners=False, align_mode=0, mode='bilinear')
                    x2272 = x2276
                else:
                    x2277 = x2181.shape
                    x2277 = len(x2277)
                    x2278 = x2277 == 5
                    if x2278 :
                        raise RaiseException('Exception')
                    else:
                        raise RaiseException('Exception')
                    x2272 = None
                x2268 = x2272
        """
        def gen_name(id):
            return "x" + str(id)

        pattern = PaddleGraph()
        pattern.add_layer("prim.shape",
                          inputs={"input": "interpolate-input-0"},
                          outputs=[gen_name(9)])
        pattern.add_layer("prim.len",
                          inputs={"input": gen_name(9)},
                          outputs=[gen_name(9)])
        pattern.add_layer("prim.sub",
                          inputs={"x": gen_name(9)},
                          outputs=[gen_name(10)],
                          y=2)
        pattern.add_layer("prim.list", inputs={}, outputs=[gen_name(11)])
        pattern.add_layer("prim.loop",
                          inputs={"input": gen_name(10)},
                          outputs=[gen_name(12.1),
                                   gen_name(12.2)])
        loop_layer = pattern.layers[list(pattern.layers.keys())[-1]]
        pattern_block = PaddleGraph(loop_layer)
        pattern_block.add_layer("prim.append",
                                inputs={"list": gen_name(11)},
                                outputs=[],
                                element=None)
        loop_layer.inputs["input-0"] = gen_name(11)
        loop_layer.add_block(pattern_block)
        pattern.add_layer("prim.tuple",
                          inputs={
                              "input0": "interpolate-input-0",
                              "input1": "interpolate-input-4",
                          },
                          outputs=[gen_name(12)],
                          input2=None,
                          input3=None)

        pattern.add_layer("prim.eq",
                          inputs={"x": "interpolate-input-2"},
                          outputs=[gen_name(10.1)],
                          y=3)

        pattern.add_layer("prim.if",
                          inputs={"input": gen_name(10.1)},
                          outputs=[gen_name(14)])
        if_layer1 = pattern.layers[list(pattern.layers.keys())[-1]]
        pattern_block = PaddleGraph(parent_layer=if_layer1)
        pattern_block.add_layer("prim.exception",
                                inputs={},
                                outputs=[gen_name(15)],
                                input="Exception")
        pattern_block.add_layer("prim.equal",
                                inputs={},
                                outputs=[gen_name(14)],
                                input=None)
        if_layer1.add_block(pattern_block)
        pattern_block = PaddleGraph(parent_layer=if_layer1)
        pattern_block.add_layer("prim.shape",
                                inputs={"input": "interpolate-input-0"},
                                outputs=[gen_name(18)])
        pattern_block.add_layer("prim.len",
                                inputs={"input": gen_name(18)},
                                outputs=[gen_name(18)])
        pattern_block.add_layer("prim.eq",
                                inputs={"x": gen_name(18)},
                                outputs=[gen_name(19)],
                                y=4)

        pattern_block.add_layer("prim.if",
                                inputs={"input": gen_name(19)},
                                outputs=[gen_name(20)])
        if_layer2 = pattern_block.layers[list(pattern_block.layers.keys())[-1]]
        pattern_block_block = PaddleGraph(parent_layer=if_layer2)
        pattern_block_block.add_layer("prim.getitem",
                                      inputs={"list": gen_name(11)},
                                      outputs=[gen_name(21)],
                                      element=0)
        pattern_block_block.add_layer("prim.getitem",
                                      inputs={"list": gen_name(11)},
                                      outputs=[gen_name(22)],
                                      element=1)
        pattern_block_block.add_layer(
            "prim.isinstance",
            inputs={"input": "interpolate-input-3"},
            outputs=["interpolate-input-0_isinstance"],
            cls="paddle.fluid.Variable")
        pattern_block_block.add_layer(
            "prim.if", {"input": "interpolate-input-0_isinstance"},
            outputs=["interpolate-input-0_if1"])
        if_layer_isinstance = pattern_block_block.layers[list(
            pattern_block_block.layers.keys())[-1]]
        pattern_block_block_block = PaddleGraph(if_layer_isinstance)
        pattern_block_block_block.add_layer(
            "prim.var2list",
            inputs={"input": "interpolate-input-3"},
            outputs=["interpolate-input-3"])
        if_layer_isinstance.add_block(pattern_block_block_block)
        pattern_block_block_block = PaddleGraph(if_layer_isinstance)
        if_layer_isinstance.add_block(pattern_block_block_block)
        if_layer_isinstance.inputs["input-0"] = "interpolate-input-3"
        pattern_block_block.add_layer("paddle.nn.functional.interpolate",
                                      inputs={
                                          "input": "interpolate-input-0",
                                          "size": "interpolate-input-3",
                                      },
                                      outputs=[gen_name(23)])
        pattern_block_block.add_layer("prim.equal",
                                      inputs={"input": gen_name(23)},
                                      outputs=[gen_name(20)])
        if_layer2.add_block(pattern_block_block)
        pattern_block_block = PaddleGraph(if_layer2)
        pattern_block_block.add_layer("prim.shape",
                                      inputs={"input": "interpolate-input-0"},
                                      outputs=[gen_name(24)])
        pattern_block_block.add_layer("prim.len",
                                      inputs={"input": gen_name(24)},
                                      outputs=[gen_name(24)])
        pattern_block_block.add_layer("prim.eq",
                                      inputs={"x": gen_name(24)},
                                      outputs=[gen_name(25)],
                                      y=5)
        pattern_block_block.add_layer("prim.if",
                                      inputs={"input": gen_name(25)},
                                      outputs=[gen_name(26)])
        if_layer3 = pattern_block_block.layers[list(
            pattern_block_block.layers.keys())[-1]]
        pattern_block_block_block = PaddleGraph(parent_layer=if_layer3)
        pattern_block_block_block.add_layer("prim.exception",
                                            inputs={},
                                            outputs=[gen_name(27)],
                                            input="Exception")
        if_layer3.add_block(pattern_block_block_block)
        pattern_block_block_block = PaddleGraph(parent_layer=if_layer3)
        pattern_block_block_block.add_layer("prim.exception",
                                            inputs={},
                                            outputs=[gen_name(28)],
                                            input="Exception")
        if_layer3.add_block(pattern_block_block_block)
        pattern_block_block.add_layer("prim.equal",
                                      inputs={},
                                      outputs=[gen_name(20)],
                                      input=None)
        if_layer2.add_block(pattern_block_block)
        if_layer2.inputs.update({
            "input-0": "interpolate-input-0",
            "input-1": "interpolate-input-3",
            "input-2": "interpolate-input-3",
            "input-3": gen_name(11),
            "input-5": gen_name(11),
        })
        pattern_block.add_layer("prim.equal",
                                inputs={"input": gen_name(20)},
                                outputs=[gen_name(14)])
        if_layer1.add_block(pattern_block)
        if_layer1.inputs.update({
            'input-2': 'interpolate-input-0',
            'input-4': gen_name(11),
            'input-6': gen_name(11),
            'input-8': 'interpolate-input-0',
            'input-9': 'interpolate-input-3',
            'input-10': 'interpolate-input-0'
        })
        pattern.build(
            inputs={
                "input-0": "interpolate-input-0",
                "input-1": "interpolate-input-1",
                "input-2": "interpolate-input-2",
                "input-3": "interpolate-input-3",
                "input-4": "interpolate-input-4"
            })
        self.patterns.append(pattern)
    def build_pattern(self):
        """ 描述需要替换的adaptive pool2d图结构。
        adaptive pool2d层模式python实现代码示例:
            模式一:
            x68 = prim.shape(input=x60)
            x69 = len(x68)
            x70 = x69 <= 2
            if x70 :
                raise RaiseException('Exception')
            x73 = []
            x74 = x68[-2: 2147483647: 1]
            x75 = len(x74)
            x76 = [2, x75]
            x77 = min(x76)
            for _x79 in range(x77):
                x80 = [6, 6][_x79]
                x73.append(x80)
            x81 = paddle.nn.functional.adaptive_avg_pool2d(input=x60, pool_size=x73, pool_type='avg')

            模式二:
            x64 = x60.shape
            x65 = len(x64)
            x66 = x65 > 2
            if x66 :
                pass
            else:
                raise RaiseException('AssertionError: ')
            x69 = self.pool2d3(x60)
        """
        def gen_name(id):
            return "x" + str(id)

        # 模式一:
        pattern = PaddleGraph()
        pattern.add_layer("prim.shape",
                          inputs={'input': "pool-input-0"},
                          outputs=[gen_name(1)])
        pattern.add_layer("prim.len",
                          inputs={"input": gen_name(1)},
                          outputs=[gen_name(6)])
        pattern.add_layer("prim.le",
                          inputs={"x": gen_name(6)},
                          outputs=[gen_name(8)],
                          y=2)
        pattern.add_layer("prim.if", {'input': gen_name(8)}, [gen_name(9)])
        if_layer = pattern.layers[list(pattern.layers.keys())[-1]]
        pattern_block0 = PaddleGraph(parent_layer=if_layer)
        pattern_block0.add_layer("prim.exception",
                                 inputs={},
                                 outputs=[gen_name(9)],
                                 input="Exception")
        if_layer.add_block(pattern_block0)
        pattern_block1 = PaddleGraph(parent_layer=if_layer)
        if_layer.add_block(pattern_block1)
        pattern.add_layer("prim.list", inputs={}, outputs=[gen_name(10)])
        pattern.add_layer("prim.slice",
                          inputs={
                              "input": gen_name(1),
                          },
                          outputs=[gen_name(12)])
        pattern.add_layer("prim.len",
                          inputs={"input": gen_name(12)},
                          outputs=[gen_name(14)])
        pattern.add_layer("prim.list",
                          inputs={"input1": gen_name(14)},
                          outputs=[gen_name(15)])
        pattern.add_layer("prim.min",
                          inputs={"input": gen_name(15)},
                          outputs=[gen_name(16)])
        pattern.add_layer("prim.loop", {'input': gen_name(16)},
                          [gen_name(17), gen_name(18)])
        loop_layer = pattern.layers[list(pattern.layers.keys())[-1]]
        pattern_block = PaddleGraph(loop_layer)
        pattern_block.add_layer("prim.getitem",
                                inputs={"index": gen_name(18)},
                                outputs=[gen_name(19)])
        pattern_block.add_layer("prim.append",
                                inputs={
                                    "list": gen_name(10),
                                    "index": gen_name(19)
                                },
                                outputs=[gen_name(20)])
        loop_layer.inputs["input-0"] = gen_name(10)
        loop_layer.add_block(pattern_block)
        pool_attrs = {'pool_type': string("avg")}
        pattern.add_layer("paddle.nn.functional.adaptive_avg_pool2d",
                          inputs={
                              'input': "pool-input-0",
                              "pool_size": gen_name(10)
                          },
                          outputs=[gen_name(21)],
                          **pool_attrs)
        pattern.build(inputs={
            "input-0": "pool-input-0",
        })
        self.patterns.append(pattern)

        # 模式二:
        pattern = PaddleGraph()
        pattern.add_layer("prim.shape",
                          inputs={'input': "pool-input-0"},
                          outputs=[gen_name(0)])
        pattern.add_layer("prim.len",
                          inputs={"input": gen_name(0)},
                          outputs=[gen_name(1)])
        pattern.add_layer("prim.gt",
                          inputs={"x": gen_name(1)},
                          outputs=[gen_name(2)],
                          y=2)
        pattern.add_layer("prim.if", {'input': gen_name(2)}, [gen_name(3)])
        if_layer = pattern.layers[list(pattern.layers.keys())[-1]]
        pattern_block0 = PaddleGraph(parent_layer=if_layer)
        if_layer.add_block(pattern_block0)
        pattern_block1 = PaddleGraph(parent_layer=if_layer)
        pattern_block1.add_layer("prim.exception",
                                 inputs={},
                                 outputs=[gen_name(4)],
                                 input="Exception")
        if_layer.add_block(pattern_block1)
        pattern.add_layer("paddle.nn.AdaptiveAvgPool2D",
                          inputs={"input": "pool-input-0"},
                          outputs=["pool1", gen_name(5)])
        pattern.build(inputs={
            "input-0": "pool-input-0",
            "input-1": "pool-input-0",
        })
        self.patterns.append(pattern)
Exemplo n.º 8
0
    def build_pattern(self):
        """ 描述需要替换的batchnorm2d图结构。
        batchnorm2d层模式python实现代码示例:
            x2011 = x2009.shape
            x2011 = len(x2011)
            x2012 = x2011 != 4
            if x2012 :
                raise RaiseException('Exception')
            if False :
                x2026 = x2009.shape
                x2027 = x2026[0]
                x2028 = len(x2026)
                x2029 = x2028 - 2
                x2032 = x2027
                for _x2031 in range(x2029):
                    x2033 = _x2031 + 2
                    x2034 = x2026[x2033]
                    x2035 = x2032 * x2034
                    x2030 = x2035
                x2036 = x2030 == 1
                if x2036 :
                    raise RaiseException('Exception')
            x2039 = self.batchnorm50(x2009)
        """
        def gen_name(id):
            return "x" + str(id)

        self.pattern.add_layer("prim.shape",
                               inputs={'input': "bn-input-0"},
                               outputs=[gen_name(0)])
        self.pattern.add_layer("prim.len",
                               inputs={'input': gen_name(0)},
                               outputs=[gen_name(0)])
        self.pattern.add_layer("prim.ne",
                               inputs={"x": gen_name(0)},
                               outputs=[gen_name(1)],
                               y=4)
        self.pattern.add_layer("prim.if", {'input': gen_name(1)},
                               [gen_name(2)])
        if_layer1 = self.pattern.layers[list(self.pattern.layers.keys())[-1]]
        pattern_block0 = PaddleGraph(parent_layer=if_layer1)
        pattern_block0.add_layer("prim.exception",
                                 inputs={},
                                 outputs=[gen_name(3)],
                                 input="Exception")
        if_layer1.add_block(pattern_block0)
        pattern_block1 = PaddleGraph(parent_layer=if_layer1)
        if_layer1.add_block(pattern_block1)
        self.pattern.add_layer("prim.if", {}, [gen_name(4)], input=False)
        if_layer2 = self.pattern.layers[list(self.pattern.layers.keys())[-1]]
        pattern_block0 = PaddleGraph(parent_layer=if_layer2)
        pattern_block0.add_layer("prim.shape",
                                 inputs={'input': "bn-input-0"},
                                 outputs=[gen_name(5)])
        pattern_block0.add_layer("prim.getitem",
                                 inputs={"list": gen_name(5)},
                                 outputs=[gen_name(6)],
                                 index=0)
        pattern_block0.add_layer("prim.len",
                                 inputs={"input": gen_name(5)},
                                 outputs=[gen_name(7)])
        pattern_block0.add_layer("prim.sub",
                                 inputs={"x": gen_name(7)},
                                 outputs=[gen_name(8)],
                                 y=2)
        pattern_block0.add_layer("prim.equal",
                                 inputs={"input": gen_name(6)},
                                 outputs=[gen_name(9)])
        pattern_block0.add_layer("prim.loop",
                                 inputs={"input": gen_name(8)},
                                 outputs=[gen_name(8.1),
                                          gen_name(10)])
        loop_layer = pattern_block0.layers[list(
            pattern_block0.layers.keys())[-1]]
        pattern_block0_block0 = PaddleGraph(parent_layer=loop_layer)
        pattern_block0_block0.add_layer("prim.add",
                                        inputs={"x": gen_name(10)},
                                        outputs=[gen_name(11)],
                                        y=2)
        pattern_block0_block0.add_layer("prim.getitem",
                                        inputs={
                                            "list": gen_name(5),
                                            "index": gen_name(11)
                                        },
                                        outputs=[gen_name(12)])
        pattern_block0_block0.add_layer("prim.mul",
                                        inputs={
                                            "x": gen_name(9),
                                            "y": gen_name(12)
                                        },
                                        outputs=[gen_name(13)])
        pattern_block0_block0.add_layer("prim.equal",
                                        inputs={"input": gen_name(13)},
                                        outputs=[gen_name(8.1)])
        loop_layer.inputs["input-1"] = gen_name(5)
        loop_layer.inputs["input-2"] = gen_name(9)
        loop_layer.add_block(pattern_block0_block0)
        pattern_block0.add_layer("prim.eq",
                                 inputs={"x": gen_name(8.1)},
                                 outputs=[gen_name(14)],
                                 y=1)
        pattern_block0.add_layer("prim.if",
                                 inputs={"input": gen_name(14)},
                                 outputs=[gen_name(15)])
        if_layer21 = pattern_block0.layers[list(
            pattern_block0.layers.keys())[-1]]
        pattern_block0_block0 = PaddleGraph(parent_layer=if_layer21)
        pattern_block0_block0.add_layer("prim.exception",
                                        inputs={},
                                        outputs=[gen_name(15)],
                                        input="Exception")
        if_layer21.add_block(pattern_block0_block0)
        pattern_block0_block1 = PaddleGraph(parent_layer=if_layer21)
        if_layer21.add_block(pattern_block0_block1)
        if_layer2.add_block(pattern_block0)
        pattern_block1 = PaddleGraph(parent_layer=if_layer2)
        if_layer2.add_block(pattern_block1)
        if_layer2.inputs["input-0"] = "bn-input-0"
        self.pattern.add_layer("paddle.nn.BatchNorm",
                               inputs={"input": "bn-input-0"},
                               outputs=[gen_name(16),
                                        gen_name(17)],
                               is_test=True)
        self.pattern.build(inputs={"input-0": "bn-input-0"})
Exemplo n.º 9
0
 def __init__(self):
     self.pattern = PaddleGraph()
     self.patterns = list()
Exemplo n.º 10
0
    def build_pattern(self):
        """ 描述需要替换的batchnorm图结构。
        batchnorm层模式python实现代码示例:

        """
        def gen_name(id):
            return "x" + str(id)

        pattern = PaddleGraph()
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(0)])
        pattern.add_layer("paddle.full",
                          inputs={},
                          outputs=[gen_name(1)],
                          shape=[1])
        pattern.add_layer("paddle.add",
                          inputs={
                              "x": gen_name(0),
                              "y": gen_name(1)
                          },
                          outputs=[gen_name(2)])
        pattern.add_layer("paddle.rsqrt",
                          inputs={"x": gen_name(2)},
                          outputs=[gen_name(3)])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(4)])
        pattern.add_layer("paddle.multiply",
                          inputs={
                              "x": gen_name(3),
                              "y": gen_name(4)
                          },
                          outputs=[gen_name(5)])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(6)])
        pattern.add_layer("paddle.multiply",
                          inputs={
                              "x": gen_name(6),
                              "y": gen_name(5)
                          },
                          outputs=[gen_name(7)])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(8)])
        pattern.add_layer("paddle.subtract",
                          inputs={
                              "x": gen_name(8),
                              "y": gen_name(7)
                          },
                          outputs=[gen_name(9)])
        pattern.add_layer("paddle.multiply",
                          inputs={
                              "x": "bn-input-0",
                              "y": gen_name(5)
                          },
                          outputs=[gen_name(10)])
        pattern.add_layer("paddle.add",
                          inputs={
                              "x": gen_name(10),
                              "y": gen_name(9)
                          },
                          outputs=[gen_name(11)])
        pattern.build(inputs={
            "input-0": "bn-input-0",
        })
        self.patterns.append(pattern)

        pattern = PaddleGraph()
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(0)])
        pattern.add_layer("paddle.full",
                          inputs={},
                          outputs=[gen_name(1)],
                          shape=[1])
        pattern.add_layer("paddle.add",
                          inputs={
                              "x": gen_name(0),
                              "y": gen_name(1)
                          },
                          outputs=[gen_name(2)])
        pattern.add_layer("paddle.rsqrt",
                          inputs={"x": gen_name(2)},
                          outputs=[gen_name(3)])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(4)])
        pattern.add_layer("paddle.multiply",
                          inputs={
                              "x": gen_name(3),
                              "y": gen_name(4)
                          },
                          outputs=[gen_name(5)])
        pattern.add_layer("paddle.multiply",
                          inputs={
                              "x": "bn-input-0",
                              "y": gen_name(5)
                          },
                          outputs=[gen_name(10)])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(6)])
        pattern.add_layer("paddle.multiply",
                          inputs={
                              "x": gen_name(6),
                              "y": gen_name(5)
                          },
                          outputs=[gen_name(7)])
        pattern.add_layer("self.create_parameter",
                          inputs={},
                          outputs=[gen_name(8)])
        pattern.add_layer("paddle.subtract",
                          inputs={
                              "x": gen_name(8),
                              "y": gen_name(7)
                          },
                          outputs=[gen_name(9)])
        pattern.add_layer("paddle.add",
                          inputs={
                              "x": gen_name(10),
                              "y": gen_name(9)
                          },
                          outputs=[gen_name(11)])
        pattern.build(inputs={
            "input-0": "bn-input-0",
        })
        self.patterns.append(pattern)
Exemplo n.º 11
0
    def traverse(self, script_graph, parent_layer=None):
        # 用于获取graph的输入
        def _update_graph_inputs(kind, inputs, outputs):
            # extend只能放更新graph_inputs之前的情况:
            # 1. loop的输出i也是输入;i是输入的原因是:子图中为父图得到的。
            # 2. 在_check_input中需要使用to_variable。
            # extend只能放更新graph_inputs之后的情况:
            # 使用了append。
            if kind != "aten::append":
                current_node_outputs.extend(outputs)
            for name in inputs:
                if name not in current_node_outputs:
                    graph_inputs.append(name)
            if kind == "aten::append":
                current_node_outputs.extend(outputs)

        # 初始化
        graph = PaddleGraph(source_type="pytorch", parent_layer=parent_layer)
        if "TopLevelTracedModule" in str(type(self.script)):
            graph.set_script(self.script)
        current_node_outputs = []
        graph_inputs = []
        # 转换输入节点
        if isinstance(script_graph, torch._C.Graph):
            input_ct = 0
            for i, ivalue in enumerate(script_graph.inputs()):
                node = ivalue.node()
                if str(ivalue.type()) not in ["Tensor", "Dict[str, Tensor]"]:
                    graph.set_name(str(ivalue.type()).split(".")[-1])
                    continue
                inputs, outputs = self.data(graph, node, ivalue.unique(),
                                            input_ct)
                input_ct += 1
        # 转换中间节点
        for node in script_graph.nodes():
            kind = node.kind()
            func_name = kind.replace('::', '_')
            if hasattr(prim, func_name):
                func = getattr(prim, func_name)
                inputs, outputs = func(self, graph, node)
                _update_graph_inputs(kind, inputs, outputs)
            elif hasattr(aten, func_name):
                func = getattr(aten, func_name)
                inputs, outputs = func(self, graph, node)
                _update_graph_inputs(kind, inputs, outputs)

        # 转换输出节点
        if hasattr(script_graph, 'returnNode'):
            for i, ivalue in enumerate(script_graph.returnNode().inputs()):
                if parent_layer.kernel == "prim.loop" and i == 0:
                    continue
                node = ivalue.node()
                script_unique_id = ivalue.unique()
                inputs, outputs = self.equal(graph,
                                             node,
                                             uid=script_unique_id,
                                             parent_layer=parent_layer,
                                             index=i)
                _update_graph_inputs("equal", inputs, outputs)

        # 设置graph的参数和输出节点
        if isinstance(script_graph, torch._C.Graph):
            graph.set_parameters(self.paddle_params)
            if hasattr(script_graph, 'return_node'):
                inputs_name, inputs_node = self._get_inputs_name(
                    script_graph.return_node())
                graph.outputs = inputs_name
        # 更新split参数
        for layer in graph.layers.values():
            if layer.kernel == "paddle.split" and "num_or_sections" in layer.attrs \
            and not isinstance(layer.attrs["num_or_sections"], int) and len(set(layer.attrs["num_or_sections"])) == 1:
                layer.attrs["num_or_sections"] = self.split_len[
                    layer.outputs[0]]
        return graph, graph_inputs
Exemplo n.º 12
0
class ONNXOpMapper():
    def __init__(self, decoder):
        self.support_op_sets = [9, ]
        self.default_op_set = 9
        self.graph = decoder.graph
        self.paddle_graph = PaddleGraph(parent_layer=None, source_type="onnx")
        self.paddle_graph.outputs = self.graph.output_nodes
        self.opset = self.create_opset(decoder)
        if not self.op_checker():
            raise Exception("Model is not supported yet.")

        print("Total nodes: {}".format(
            sum([
                isinstance(node, ONNXGraphNode)
                for name, node in self.graph.node_map.items()
            ])))
        print("Nodes converting ...")
        for i, node_name in enumerate(self.graph.topo_sort):
            sys.stderr.write("\rConverting node {} ...     ".format(i + 1))
            node = self.graph.get_node(node_name)
            op = node.layer_type
            if hasattr(self.opset, op):
                func = getattr(self.opset, op)
                func(node)
            elif op in self.opset.directly_map_ops:
                self.opset.directly_map(node)
            elif op in self.opset.elementwise_ops:
                self.opset.elementwise_map(node)
        print("\nNodes converted.")
        self.paddle_graph.set_name(self.graph.graph_name)
        self.paddle_graph.set_parameters(self.opset.weights)
        self.paddle_graph.set_inputs_info(self.opset.inputs_info)

    def op_checker(self):
        unsupported_ops = set()
        for node_name in self.graph.topo_sort:
            node = self.graph.get_node(node_name)
            op = node.layer_type
            if not hasattr(self.opset, op) and \
                op not in self.opset.directly_map_ops and \
                op not in self.opset.elementwise_ops:
                unsupported_ops.add(op)
        if len(unsupported_ops) == 0:
            return True
        else:
            if len(unsupported_ops) > 0:
                print("\n========= {} OPs are not supported yet ===========".
                      format(len(unsupported_ops)))
            for op in unsupported_ops:
                print("========== {} ============".format(op))
            return False

    def create_opset(self, decoder):
        run_op_set = self.default_op_set
        opset = ''
        if decoder.op_set in self.support_op_sets:
            opset = 'OpSet' + str(decoder.op_set)
        elif decoder.op_set < self.default_op_set:
            opset = 'OpSet' + str(self.default_op_set)
        else:
            for op_set in self.support_op_sets:
                if decoder.op_set > op_set:
                    run_op_set = op_set
                else:
                    break
            opset = 'OpSet' + str(run_op_set)
        print(
            'Now, onnx2paddle support convert onnx model opset_verison {},'
            'opset_verison of your onnx model is {}, automatically treated as op_set: {}.'
            .format(self.support_op_sets, decoder.op_set, run_op_set))
        return eval(opset)(decoder, self.paddle_graph)