diff --git a/hpvm/projects/onnx/frontend/config.py b/hpvm/projects/onnx/frontend/config.py new file mode 100644 index 0000000000000000000000000000000000000000..b86adfa1ce7e7f5cbf6bebb62efdd3826d05fcf7 --- /dev/null +++ b/hpvm/projects/onnx/frontend/config.py @@ -0,0 +1,3 @@ +onnx_file_dir = "../models/keras/alexnet.onnx" +src_emit_dir = "./test_src" +opset_version_default = 11 \ No newline at end of file diff --git a/hpvm/projects/onnx/frontend/graph_builder.py b/hpvm/projects/onnx/frontend/graph_builder.py index 0659fe3fcd5fbae5a3cee124235916fa9692ca0e..063c8d83e3c3b87f42fc7874a5afb2d4532b1133 100644 --- a/hpvm/projects/onnx/frontend/graph_builder.py +++ b/hpvm/projects/onnx/frontend/graph_builder.py @@ -2,20 +2,7 @@ import sys from onnx import numpy_helper from tensor import InputTensor, WeightTensor from graph_ir import * - -support_onnx_ops = {#"DepthwiseConv" : [2], - "Conv" : [2], # only 2d supported here - "MatMul" : None, - "MaxPool": [2], # only 2d supported here - "BatchNormalization" : None, - "Flatten" : None, - "Add" : None, - "Relu" : None, - "Softmax" : None, - "Identity": None, - "Pad": None, - "AveragePool": None, - "Tanh": None} +from utils import support_onnx_ops class GraphBuilder(object): def __init__(self, model, shape, dtype, weight_dir): @@ -151,14 +138,11 @@ class GraphBuilder(object): # Dump weights for tensor in self.tensors.values(): if isinstance(tensor, WeightTensor): - print("Dump weight: {0}".format(weight_tensor.name)) - #tensor.dump_weight(self.weight_dir + "/" + tensor.get_mapped_name() + "_path.bin") + print("Dump weight: {0}".format(tensor.name)) + tensor.dump_weight(self.weight_dir + "/" + tensor.get_mapped_name() + "_path.bin") return DFG(self.graph, self.tensors) class DFG(object): - - root_set = False - def __init__(self, graph, tensors): self.graph = graph self.tensors = tensors diff --git a/hpvm/projects/onnx/frontend/graph_codegen.py b/hpvm/projects/onnx/frontend/graph_codegen.py index f985ae810f9efa4744fa68760a4f0b490c7f55f0..b32132959ce956673e2161c676005fa7fc1ae2b9 100644 --- a/hpvm/projects/onnx/frontend/graph_codegen.py +++ b/hpvm/projects/onnx/frontend/graph_codegen.py @@ -2,18 +2,15 @@ import sys import numpy as np import os -from graph_builder import * -#from graph_ir import * -from tensor import * - -skip_layer = ["Identity", "Flatten", "Pad"] +from tensor import WeightTensor +from utils import skip_layer class GraphCodeGen(object): - def __init__(self, DFG, weights_dir, test_data=None, test_labels=None): + def __init__(self, dfg, weights_dir, test_data=None, test_labels=None): self.program_str = "" - self.graph = DFG.graph - self.tensors = DFG.tensors - self.nodes = DFG.nodes + self.graph = dfg.graph + self.tensors = dfg.tensors + self.nodes = dfg.nodes self.var_cnt = 0 self.weights_dir = weights_dir self.test_data = test_data diff --git a/hpvm/projects/onnx/frontend/graph_ir.py b/hpvm/projects/onnx/frontend/graph_ir.py index 64796514bc644da0ecb708aa70256bd67e2dceba..745e5d0429fc7d8c6c11c8efb426160f5a6ccabd 100644 --- a/hpvm/projects/onnx/frontend/graph_ir.py +++ b/hpvm/projects/onnx/frontend/graph_ir.py @@ -42,8 +42,6 @@ class LogicalOpNode(DFGNode): class AddNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -56,8 +54,6 @@ class AddNode(DFGNode): class MatMulNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -71,8 +67,6 @@ class MatMulNode(DFGNode): class SoftMaxNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -84,8 +78,6 @@ class SoftMaxNode(DFGNode): class Conv2DNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -122,8 +114,6 @@ class Conv2DNode(DFGNode): class MaxPool2DNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -152,8 +142,6 @@ class MaxPool2DNode(DFGNode): class AveragePool2DNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -182,8 +170,6 @@ class AveragePool2DNode(DFGNode): class ReluNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -194,8 +180,6 @@ class ReluNode(DFGNode): return self.inst_str class TanhNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -207,8 +191,6 @@ class TanhNode(DFGNode): class BatchNormalizationNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) def codegen(self, tensors): cur_node = self.onnx_node @@ -230,25 +212,19 @@ class BatchNormalizationNode(DFGNode): class PadNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) + pass class IdentityNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) + pass class FlattenNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) + pass class ZeroPadding2DNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) + pass class DepthwiseConv2DNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) + pass class DenseNode(DFGNode): - def __init__(self, layer): - DFGNode.__init__(self, layer) + pass diff --git a/hpvm/projects/onnx/frontend/main.py b/hpvm/projects/onnx/frontend/main.py index b9fefdecd7b04bbc94bf1d898e3d05a8c0bc04f8..16bf8868b09a6a5316480a1d3e5f49fd63898a76 100644 --- a/hpvm/projects/onnx/frontend/main.py +++ b/hpvm/projects/onnx/frontend/main.py @@ -3,24 +3,15 @@ import sys import numpy as np import onnx import glob -#from onnxruntime.backend.backend import OnnxRuntimeBackend as backend - -onnx_file_dir = "../models/keras/alexnet.onnx" -src_emit_dir = "./test_src" -opset_version_default = 10 def check_version(model, new_version): try: - opset = model.opset_import[0].version if model.opset_import else 1 + opset = model.opset_import[0].version + 1 if model.opset_import else 1 except AttributeError: opset = 1 # default opset version set to 1 if not specified print("opset version: ", opset) if opset != new_version: #print('The model before conversion:\n{}'.format(model)) - - # A full list of supported adapters can be found here: - # https://github.com/onnx/onnx/blob/master/onnx/version_converter.py#L21 - # Apply the version conversion on the original model from onnx import version_converter try: converted_model = version_converter.convert_version(model, new_version) @@ -33,19 +24,21 @@ def check_version(model, new_version): return model def compile(model): + from config import opset_version_default, src_emit_dir weights_dir = src_emit_dir model = check_version(model, opset_version_default) from graph_builder import GraphBuilder from graph_codegen import GraphCodeGen from hpvm_codegen import HpvmCodeGen graphBuilder = GraphBuilder(model, None, "float32", weights_dir) - #graphCodeGen = GraphCodeGen(gBuilder.build_graph(), weights_dir) - #graphCodeGen.compile() - hpvmCodeGen = HpvmCodeGen(graphBuilder.build_graph(), weights_dir) - hpvmCodeGen.compile() + graphCodeGen = GraphCodeGen(graphBuilder.build_graph(), weights_dir) + graphCodeGen.compile() + #hpvmCodeGen = HpvmCodeGen(graphBuilder.build_graph(), weights_dir) + #hpvmCodeGen.compile() def main(): # TODO: Put it in args + from config import onnx_file_dir model = onnx.load(onnx_file_dir) compile(model) diff --git a/hpvm/projects/onnx/frontend/utils.py b/hpvm/projects/onnx/frontend/utils.py index c05abe77a1bbcc63a1444a173be830a69964ba71..ef8aab545c62dc935e32eba3faac33074c636307 100644 --- a/hpvm/projects/onnx/frontend/utils.py +++ b/hpvm/projects/onnx/frontend/utils.py @@ -2,6 +2,21 @@ import numpy as np import struct import random +support_onnx_ops = {#"DepthwiseConv" : [2], + "Conv" : [2], # only 2d supported here + "MatMul" : None, + "MaxPool": [2], # only 2d supported here + "BatchNormalization" : None, + "Flatten" : None, + "Add" : None, + "Relu" : None, + "Softmax" : None, + "Identity": None, + "Pad": None, + "AveragePool": None, + "Tanh": None} + +skip_layer = ["Identity", "Flatten", "Pad"] def dumpLabels(file_name, Y_test):