Skip to content

Commit

Permalink
Add Float Conv2D, LayerNorm, Div, Softmax, Reshape, Relu on Generic P…
Browse files Browse the repository at this point in the history
…latform

Refactored:
- BasicIntergerDivBinding -> BasicDivBindings
- IntergerDivLayer -> DivLayer
- iSoftmaxLayer -> SoftmaxLayer
- iLayernormLayer -> LayernormLayer
- xxx binding -> bindings
- BasicIntegerDivBinding -> BasicDivBindings
- IntegerDivChecker -> DivChecker
- ilayernormchecker -> layernormchecker
- isoftmaxchecker -> softmaxchecker
(Note: nlevel, sign not used for float)

Added:
- 6 float templates
- relumapper, relulayer, relubinding, reluchecker
- softmaxparser
- layernormparser
- divparser
- reluparser

Deleted:
- floataddchecker
  • Loading branch information
runwangdl committed Jan 23, 2025
1 parent 180635b commit d6fdb16
Show file tree
Hide file tree
Showing 27 changed files with 724 additions and 114 deletions.
8 changes: 6 additions & 2 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,12 @@ jobs:
testRequantizedDWConv
test2DRequantizedConv
iSoftmax
FloatAdder
testFloatAdder
testFloatGEMM
testFloat2DConvolution
testFloatLayerNorm
testFloatDiv
testFloatRelu
generic-models:
uses: ./.github/workflows/TestRunnerGeneric.yml
Expand Down Expand Up @@ -199,7 +203,7 @@ jobs:
Hardswish
RQHardswish
testBacktracking
FloatAdder
testFloatAdder
testFloatGEMM
num-cores: 8

Expand Down
26 changes: 13 additions & 13 deletions Deeploy/Targets/CortexM/Platform.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@
CMSISDWConv1DParser, CMSISDWConv2DParser, CMSISGEMMParser, CMSISLinearAttentionParser, CMSISMaxPool2DParser
from Deeploy.Targets.CortexM.TopologyOptimizationPasses.Passes import ConvRequantMergePass, GEMMRequantMergePass, \
LinearAttentionAlignmentPass, MatMulRequantMergePass, MHSAAlignmentPass
from Deeploy.Targets.Generic.Bindings import BasicAddBindings, BasicDebugPrintBindings, BasicGatherBindings, \
BasicGELUBinding, BasicIntegerDivBinding, BasicLayerNormBinding, BasicMatMulBinding, BasicMulBindings, \
from Deeploy.Targets.Generic.Bindings import BasicAddBindings, BasicDebugPrintBindings, BasicDivBindings, \
BasicGatherBindings, BasicGELUBinding, BasicLayerNormBindings, BasicMatMulBinding, BasicMulBindings, \
BasicPad1DBindings, BasicPad2DBindings, BasicReduceMeanBindings, BasicReduceSumBindings, BasicReshapeBindings, \
BasicRQIntegerDivBinding, BasicRQSBindings, BasicRQSGELUBinding, BasicSliceBindings, BasicSoftmaxBinding, \
BasicRQIntegerDivBinding, BasicRQSBindings, BasicRQSGELUBinding, BasicSliceBindings, BasicSoftmaxBindings, \
BasicTransposeBindings, DummyBinding
from Deeploy.Targets.Generic.Layers import AddLayer, CLCALayer, DebugPrintLayer, GatherLayer, IntegerDivLayer, \
LinearAttentionLayer, MatMulLayer, MaxPoolLayer, MulLayer, PadLayer, ReduceMeanLayer, ReduceSumLayer, \
RequantShiftLayer, ReshapeLayer, RQIntegerDivLayer, RQSiGELULayer, SliceLayer, TransposeLayer, iGELULayer, \
iLayerNormLayer, iSoftmaxLayer
from Deeploy.Targets.Generic.Layers import AddLayer, CLCALayer, DebugPrintLayer, DivLayer, GatherLayer, \
LayerNormLayer, LinearAttentionLayer, MatMulLayer, MaxPoolLayer, MulLayer, PadLayer, ReduceMeanLayer, \
ReduceSumLayer, RequantShiftLayer, ReshapeLayer, RQIntegerDivLayer, RQSiGELULayer, SliceLayer, SoftmaxLayer, \
TransposeLayer, iGELULayer
from Deeploy.Targets.Generic.Parsers import AddParser, DebugParser, DummyParser, FlattenParser, GatherParser, \
IntegerDivParser, MatMulParser, MulParser, Pad1DParser, Pad2DParser, ReduceMeanParser, ReduceSumParser, \
RequantShiftParser, ReshapeParser, RQIntegerDivParser, RQSiGELUParser, SliceParser, TransposeParser, \
Expand All @@ -63,8 +63,8 @@
GatherMapper = NodeMapper(GatherParser(), BasicGatherBindings)
GELU_int8_Mapper = NodeMapper(iGELUParser(), [BasicGELUBinding])
GEMMMapper = NodeMapper(CMSISGEMMParser(), CMSISGEMMBindings)
iLayerNorm_int8_Mapper = NodeMapper(iLayerNormParser(), [BasicLayerNormBinding])
IntegerDivMapper = NodeMapper(IntegerDivParser(), [BasicIntegerDivBinding])
iLayerNorm_int8_Mapper = NodeMapper(iLayerNormParser(), BasicLayerNormBindings)
IntegerDivMapper = NodeMapper(IntegerDivParser(), BasicDivBindings)
LinearAttention_int16_Mapper = NodeMapper(CMSISLinearAttentionParser(), [CMSISLinearAttentionBinding])
MatMulMapper = NodeMapper(MatMulParser(), [BasicMatMulBinding])
MaxPool2DMapper = NodeMapper(CMSISMaxPool2DParser(), [CMSISMaxPool2DBinding])
Expand All @@ -77,7 +77,7 @@
ReshapeMapper = NodeMapper(ReshapeParser(), BasicReshapeBindings)
RQGELU_int8_Mapper = NodeMapper(RQSiGELUParser(), [BasicRQSGELUBinding])
RQIntegerDivMapper = NodeMapper(RQIntegerDivParser(), [BasicRQIntegerDivBinding])
Softmax_int8_Mapper = NodeMapper(iSoftmaxParser(), [BasicSoftmaxBinding])
Softmax_int8_Mapper = NodeMapper(iSoftmaxParser(), BasicSoftmaxBindings)
TransposeMapper = NodeMapper(TransposeParser(), BasicTransposeBindings)
UnsqueezeMapper = NodeMapper(UnsqueezeParser(), BasicReshapeBindings)

Expand All @@ -94,10 +94,10 @@
'Flatten': ReshapeLayer([FlattenMapper]),
'Gather': GatherLayer([GatherMapper]),
'iGELU': iGELULayer([GELU_int8_Mapper]),
'iLayerNorm': iLayerNormLayer([iLayerNorm_int8_Mapper]),
'IntegerDiv': IntegerDivLayer([IntegerDivMapper]),
'iLayerNorm': LayerNormLayer([iLayerNorm_int8_Mapper]),
'IntegerDiv': DivLayer([IntegerDivMapper]),
'IntegerMean': ReduceMeanLayer([ReduceMeanMapper]),
'iSoftmax': iSoftmaxLayer([Softmax_int8_Mapper]),
'iSoftmax': SoftmaxLayer([Softmax_int8_Mapper]),
'LinearAttention': LinearAttentionLayer([LinearAttention_int16_Mapper]),
'MatMul': MatMulLayer([MatMulMapper]),
'MaxPool': MaxPoolLayer([MaxPool2DMapper]),
Expand Down
80 changes: 58 additions & 22 deletions Deeploy/Targets/Generic/Bindings.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,21 @@
from Deeploy.AbstractDataTypes import PointerClass
from Deeploy.CommonExtensions.CodeTransformationPasses.MemoryAllocation import ArgumentStructGeneration, \
MemoryManagementGeneration, MemoryPassthroughGeneration
from Deeploy.CommonExtensions.DataTypes import FloatDataTypes, IntegerDataTypes, SignedIntegerDataTypes, float32_t, \
int8_t, int32_t, uint8_t
from Deeploy.CommonExtensions.DataTypes import IntegerDataTypes, SignedIntegerDataTypes, float32_t, int8_t, int32_t, \
uint8_t
from Deeploy.DeeployTypes import CodeTransformation, NodeBinding
from Deeploy.FutureExtension.CodeTransformationPasses.FutureCodeTransformation import FutureGeneration
from Deeploy.Targets.Generic.Templates import AddTemplate, ConcatTemplate, ConvTemplate, DebugPrintTemplate, \
DummyTemplate, DWConvTemplate, FloatAddTemplate, FloatGemmTemplate, GatherTemplate, GemmTemplate, \
IntegerDivTemplate, ITAMaxTemplate, ITAPartialMaxTemplate, MatMulTemplate, MaxPoolTemplate, MulTemplate, \
PadTemplate, ReduceMeanTemplate, ReduceSumTemplate, RequantShiftTemplate, ReshapeTemplate, RQIntegerDivTemplate, \
DummyTemplate, DWConvTemplate, FloatAddTemplate, FloatConvTemplate, FloatDivTemplate, FloatGemmTemplate, \
FloatLayernormTemplate, FloatReluTemplate, FloatSoftmaxTemplate, GatherTemplate, GemmTemplate, IntegerDivTemplate, \
ITAMaxTemplate, ITAPartialMaxTemplate, MatMulTemplate, MaxPoolTemplate, MulTemplate, PadTemplate, \
ReduceMeanTemplate, ReduceSumTemplate, RequantShiftTemplate, ReshapeTemplate, RQIntegerDivTemplate, \
RQSiGELUTemplate, SliceTemplate, TransposeTemplate, iGELUTemplate, iLayernormTemplate, iRMSNormTemplate, \
iSoftmaxTemplate
from Deeploy.Targets.Generic.TypeCheckers import AddChecker, ConcatChecker, ConvChecker, DebugPrintChecker, \
DummyChecker, FloatAddChecker, GatherChecker, GELUChecker, GEMMChecker, IntegerDivChecker, MatMulChecker, \
MaxPoolChecker, MulChecker, PadChecker, ReduceMeanChecker, ReduceSumChecker, RequantShiftChecker, ReshapeChecker, \
RQIntegerDivChecker, SliceChecker, SoftmaxChecker, TransposeChecker, iLayerNormChecker
DivChecker, DummyChecker, GatherChecker, GELUChecker, GEMMChecker, LayerNormChecker, MatMulChecker, \
MaxPoolChecker, MulChecker, PadChecker, ReduceMeanChecker, ReduceSumChecker, ReluChecker, RequantShiftChecker, \
ReshapeChecker, RQIntegerDivChecker, SliceChecker, SoftmaxChecker, TransposeChecker

BasicTransformer = CodeTransformation([ArgumentStructGeneration(), MemoryManagementGeneration(), FutureGeneration()])

Expand All @@ -68,8 +69,8 @@
for type1 in IntegerDataTypes
for type2 in IntegerDataTypes
] + [
NodeBinding(FloatAddChecker([PointerClass(type), PointerClass(type)], [PointerClass(type)]),
FloatAddTemplate.referenceTemplate, BasicTransformer) for type in FloatDataTypes
NodeBinding(AddChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]),
FloatAddTemplate.referenceTemplate, BasicTransformer)
]

BasicConv1DBinding = NodeBinding(ConvChecker([PointerClass(int8_t), PointerClass(int8_t)], [PointerClass(int32_t)]),
Expand All @@ -78,8 +79,15 @@
BasicDWConv1DBinding = NodeBinding(ConvChecker([PointerClass(int8_t), PointerClass(int8_t)], [PointerClass(int32_t)]),
DWConvTemplate.reference1DTemplate, BasicTransformer)

BasicConv2DBinding = NodeBinding(ConvChecker([PointerClass(int8_t), PointerClass(int8_t)], [PointerClass(int32_t)]),
ConvTemplate.reference2DTemplate, BasicTransformer)
BasicConv2DBindings = [
NodeBinding(ConvChecker([PointerClass(int8_t), PointerClass(int8_t)], [PointerClass(int32_t)]),
ConvTemplate.reference2DTemplate, BasicTransformer)
] + [
NodeBinding(
ConvChecker([PointerClass(float32_t), PointerClass(float32_t),
PointerClass(float32_t)], [PointerClass(float32_t)]), FloatConvTemplate.reference2DTemplate,
BasicTransformer)
]

BasicDWConv2DBinding = NodeBinding(ConvChecker([PointerClass(int8_t), PointerClass(int8_t)], [PointerClass(int32_t)]),
DWConvTemplate.reference2DTemplate, BasicTransformer)
Expand Down Expand Up @@ -108,20 +116,32 @@
BasicTransformer)
]

BasicIntegerDivBinding = NodeBinding(
IntegerDivChecker([PointerClass(int32_t), PointerClass(int32_t)], [PointerClass(int32_t)]),
IntegerDivTemplate.referenceTemplate, BasicTransformer)
BasicDivBindings = [
NodeBinding(DivChecker([PointerClass(int32_t), PointerClass(int32_t)], [PointerClass(int32_t)]),
IntegerDivTemplate.referenceTemplate, BasicTransformer)
] + [
NodeBinding(DivChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]),
FloatDivTemplate.referenceTemplate, BasicTransformer)
]

BasicITASoftmaxBinding = NodeBinding(SoftmaxChecker([PointerClass(int8_t)], [PointerClass(int8_t)]),
ITAMaxTemplate.referenceTemplate, BasicTransformer)

BasicITAPartialSoftmaxBinding = NodeBinding(SoftmaxChecker([PointerClass(int8_t)], [PointerClass(int8_t)]),
ITAPartialMaxTemplate.referenceTemplate, BasicTransformer)

BasicLayerNormBinding = NodeBinding(
iLayerNormChecker([PointerClass(int8_t), PointerClass(int32_t),
PointerClass(int32_t)], [PointerClass(int8_t)]), iLayernormTemplate.referenceTemplate,
BasicTransformer)
BasicLayerNormBindings = [
NodeBinding(
LayerNormChecker([PointerClass(int8_t), PointerClass(int32_t),
PointerClass(int32_t)], [PointerClass(int8_t)]), iLayernormTemplate.referenceTemplate,
BasicTransformer)
] + [
NodeBinding(
LayerNormChecker(
[PointerClass(float32_t), PointerClass(float32_t),
PointerClass(float32_t)], [PointerClass(float32_t)]), FloatLayernormTemplate.referenceTemplate,
BasicTransformer)
]

BasicMatMulBinding = NodeBinding(MatMulChecker([PointerClass(int8_t), PointerClass(int8_t)], [PointerClass(int32_t)]),
MatMulTemplate.referenceTemplate, BasicTransformer)
Expand All @@ -142,6 +162,11 @@
BasicPad2DBindings = [
NodeBinding(PadChecker([PointerClass(type)], [PointerClass(type)]), PadTemplate.reference2DTemplate,
BasicTransformer) for type in SignedIntegerDataTypes
] + [
NodeBinding(
PadChecker([PointerClass(float32_t), PointerClass(float32_t),
PointerClass(float32_t)], [PointerClass(float32_t)]), PadTemplate.reference2DTemplate,
BasicTransformer)
]

BasicReduceMeanBindings = [
Expand All @@ -154,9 +179,15 @@
BasicTransformer) for type in SignedIntegerDataTypes
]

BasicReluBinding = NodeBinding(ReluChecker([PointerClass(float32_t)], [PointerClass(float32_t)]),
FloatReluTemplate.referenceTemplate, BasicTransformer)

BasicReshapeBindings = [
NodeBinding(ReshapeChecker([PointerClass(type), PointerClass(int32_t)], [PointerClass(type)]),
ReshapeTemplate.referenceTemplate, ReshapeSkipTransformer) for type in IntegerDataTypes
] + [
NodeBinding(ReshapeChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]),
ReshapeTemplate.referenceTemplate, ReshapeSkipTransformer)
]

BasicRQSBindings = [
Expand All @@ -181,16 +212,21 @@
PointerClass(int32_t)
], [PointerClass(int8_t)]), RQIntegerDivTemplate.referenceTemplate, BasicTransformer)

BasicSoftmaxBinding = NodeBinding(SoftmaxChecker([PointerClass(int8_t)], [PointerClass(int8_t)]),
iSoftmaxTemplate.referenceTemplate, BasicTransformer)
BasicSoftmaxBindings = [
NodeBinding(SoftmaxChecker([PointerClass(int8_t)], [PointerClass(int8_t)]), iSoftmaxTemplate.referenceTemplate,
BasicTransformer)
] + [
NodeBinding(SoftmaxChecker([PointerClass(float32_t)], [PointerClass(float32_t)]),
FloatSoftmaxTemplate.referenceTemplate, BasicTransformer)
]

BasicTransposeBindings = [
NodeBinding(TransposeChecker([PointerClass(type)], [PointerClass(type)]), TransposeTemplate.referenceTemplate,
BasicTransformer) for type in IntegerDataTypes
]

BasiciRMSNormBinding = NodeBinding(
iLayerNormChecker([PointerClass(int8_t), PointerClass(int32_t)], [PointerClass(int8_t)]),
LayerNormChecker([PointerClass(int8_t), PointerClass(int32_t)], [PointerClass(int8_t)]),
iRMSNormTemplate.referenceTemplate, BasicTransformer)

DummyBinding = NodeBinding(DummyChecker([PointerClass(int8_t)], [PointerClass(int8_t)]),
Expand Down
14 changes: 10 additions & 4 deletions Deeploy/Targets/Generic/Layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ def __init__(self, maps: List[NodeMapper]):
super().__init__(maps)


class iSoftmaxLayer(ONNXLayer):
class SoftmaxLayer(ONNXLayer):

def __init__(self, maps: List[NodeMapper]):
super().__init__(maps)
Expand Down Expand Up @@ -193,13 +193,13 @@ def computeOps(self):
return matmul + rqs


class IntegerDivLayer(ONNXLayer):
class DivLayer(ONNXLayer):

def __init__(self, maps: List[NodeMapper]):
super().__init__(maps)


class RQIntegerDivLayer(IntegerDivLayer):
class RQIntegerDivLayer(DivLayer):

def __init__(self, maps: List[NodeMapper]):
super().__init__(maps)
Expand Down Expand Up @@ -365,7 +365,13 @@ def computeShapes(self, inputShapes: Shape, outputShapes: Shape, operatorReprese
return (inputShapes, outputShapes)


class iLayerNormLayer(ONNXLayer):
class ReluLayer(ONNXLayer):

def __init__(self, maps: List[NodeMapper]):
super().__init__(maps)


class LayerNormLayer(ONNXLayer):

def __init__(self, maps: List[NodeMapper]):
super().__init__(maps)
Expand Down
75 changes: 71 additions & 4 deletions Deeploy/Targets/Generic/Parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -550,9 +550,6 @@ def parseNode(self, node: gs.Node) -> bool:

ret = all([len(node.inputs) == 1, len(node.outputs) == 1])

if ret:
self.operatorRepresentation['n_levels'] = int(node.attrs['n_levels'].values)

return ret

def parseNodeCtxt(self,
Expand Down Expand Up @@ -591,6 +588,7 @@ def parseNode(self, node: gs.Node) -> bool:
self.operatorRepresentation['coeffB'] = int(node.attrs['coeffB'].values)
self.operatorRepresentation['coeffC'] = int(node.attrs['coeffC'].values)
self.operatorRepresentation['log2'] = int(node.attrs['log2'].values)
self.operatorRepresentation['n_levels'] = int(node.attrs['n_levels'].values)

return wellFormed

Expand All @@ -610,9 +608,10 @@ def __init__(self):
super().__init__()

def parseNode(self, node: gs.Node) -> bool:

wellFormed = super().parseNode(node)

ret = all(['n_levels' in node.attrs])
ret = all(['n_levels' in node.attrs, len(node.inputs) == 1, len(node.outputs) == 1])

if ret and wellFormed:
self.operatorRepresentation['n_levels'] = int(node.attrs['n_levels'].values)
Expand Down Expand Up @@ -923,6 +922,32 @@ def parseNodeCtxt(self,
return ctxt, True


class ReluParser(NodeParser):

def __init__(self):
super().__init__()

def parseNode(self, node: gs.Node) -> (bool):

ret = all([len(node.inputs) == 1, len(node.outputs) == 1])

return ret

def parseNodeCtxt(self,
ctxt: NetworkContext,
node: gs.Node,
channels_first: bool = True) -> Tuple[NetworkContext, bool]:

data_in = ctxt.lookup(node.inputs[0].name)
data_out = ctxt.lookup(node.outputs[0].name)
self.operatorRepresentation['data_in'] = data_in.name
self.operatorRepresentation['data_out'] = data_out.name
self.operatorRepresentation['size'] = np.prod(data_in.shape)
self.operatorRepresentation['lastDimLength'] = data_in.shape[-1]

return ctxt, True


class ReshapeParser(NodeParser):

def __init__(self):
Expand Down Expand Up @@ -1494,6 +1519,18 @@ def parseNodeCtxt(self,
return ctxt, True


class LayerNormParser(iLayerNormParser):

def parseNode(self, node: gs.Node) -> (bool):

ret = all(['epsilon' in node.attrs, len(node.inputs) == 3, len(node.outputs) == 1])

if ret:
self.operatorRepresentation['epsilon'] = node.attrs['epsilon']

return ret


class MatMulParser(NodeParser):

def __init__(self, noBiasHoisting = True):
Expand Down Expand Up @@ -1798,6 +1835,36 @@ def parseNodeCtxt(self,
return ctxt, True


class DivParser(NodeParser):

def __init__(self):
super().__init__()

def parseNode(self, node: gs.Node) -> bool:

ret = all([len(node.inputs) == 2, len(node.outputs) == 1])

return ret

def parseNodeCtxt(self,
ctxt: NetworkContext,
node: gs.Node,
channels_first: bool = True) -> Tuple[NetworkContext, bool]:

inputs = ["input1", "input2"]
outputs = ["output"]
for idx, inputNode in enumerate(node.inputs):
if idx < len(inputs):
self.operatorRepresentation[inputs[idx]] = ctxt.lookup(inputNode.name).name
for idx, outputNode in enumerate(node.outputs):
self.operatorRepresentation[outputs[idx]] = ctxt.lookup(outputNode.name).name

self.operatorRepresentation['size'] = np.prod(ctxt.lookup(self.operatorRepresentation['input1']).shape)
self.operatorRepresentation['lastDimLength'] = ctxt.lookup(self.operatorRepresentation['input1']).shape[-1]

return ctxt, True


class RQIntegerDivParser(IntegerDivParser, RQSParserInterface):

def __init__(self):
Expand Down
Loading

0 comments on commit d6fdb16

Please sign in to comment.