From 8daf6b78675cf07dd6b39f7a191954076f5e5f3d Mon Sep 17 00:00:00 2001 From: Jacob Bohlin Date: Tue, 15 Sep 2020 16:28:35 +0200 Subject: MLBEDSW-2734: TensorFlow 2.3 compatibility Compiled the new TensorFlow 2.3 schema and added the new Operator BatchMatMul to tflite_mapping.py. Signed-off-by: Jacob Bohlin Change-Id: Ie62517bd56a6497820e4f1ef20326a4fd2ca89b0 --- PYPI.md | 3 +- README.md | 3 +- ethosu/vela/data_type.py | 1 + ethosu/vela/tflite/ActivationFunctionType.py | 1 + ethosu/vela/tflite/AddOptions.py | 10 +++- ethosu/vela/tflite/BatchMatMulOptions.py | 38 ++++++++++++++ .../tflite/BidirectionalSequenceLSTMOptions.py | 10 +++- .../vela/tflite/BidirectionalSequenceRNNOptions.py | 10 +++- ethosu/vela/tflite/BuiltinOperator.py | 2 + ethosu/vela/tflite/BuiltinOptions.py | 2 + ethosu/vela/tflite/CombinerType.py | 1 + ethosu/vela/tflite/CustomOptionsFormat.py | 1 + ethosu/vela/tflite/DimensionType.py | 1 + ethosu/vela/tflite/FullyConnectedOptions.py | 10 +++- .../tflite/FullyConnectedOptionsWeightsFormat.py | 1 + ethosu/vela/tflite/LSHProjectionType.py | 1 + ethosu/vela/tflite/LSTMKernelType.py | 1 + ethosu/vela/tflite/LSTMOptions.py | 10 +++- ethosu/vela/tflite/MirrorPadMode.py | 1 + ethosu/vela/tflite/Padding.py | 1 + ethosu/vela/tflite/QuantizationDetails.py | 1 + ethosu/vela/tflite/RNNOptions.py | 10 +++- ethosu/vela/tflite/ResizeNearestNeighborOptions.py | 10 +++- ethosu/vela/tflite/SVDFOptions.py | 10 +++- ethosu/vela/tflite/SequenceRNNOptions.py | 10 +++- ethosu/vela/tflite/SparseIndexVector.py | 1 + ethosu/vela/tflite/SubOptions.py | 10 +++- ethosu/vela/tflite/TensorType.py | 3 ++ .../tflite/UnidirectionalSequenceLSTMOptions.py | 10 +++- ethosu/vela/tflite_mapping.py | 58 +++++++++++++++------- 30 files changed, 198 insertions(+), 33 deletions(-) create mode 100644 ethosu/vela/tflite/BatchMatMulOptions.py diff --git a/PYPI.md b/PYPI.md index 2024ecf8..82fa5224 100644 --- a/PYPI.md +++ b/PYPI.md @@ -25,8 +25,7 @@ compiled model. ## TensorFlow Support -Vela supports TensorFlow 2.1.0 (for experimental Int16 support please use the -latest nightly build of TensorFlow). +Vela supports TensorFlow 2.3.0 ## Environment diff --git a/README.md b/README.md index 56e3d443..54e3cbfa 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,7 @@ compiled model. ## TensorFlow Support -Vela supports TensorFlow 2.1.0 (for experimental Int16 support please use the -latest nightly build of TensorFlow). +Vela supports TensorFlow 2.3.0 ## Environment diff --git a/ethosu/vela/data_type.py b/ethosu/vela/data_type.py index 4d05fef5..a4b7b537 100644 --- a/ethosu/vela/data_type.py +++ b/ethosu/vela/data_type.py @@ -115,3 +115,4 @@ DataType.bool = DataType(BaseType.Bool, 8) DataType.resource = DataType(BaseType.Resource, 8) DataType.variant = DataType(BaseType.Variant, 8) DataType.complex64 = DataType(BaseType.Complex, 64) +DataType.complex128 = DataType(BaseType.Complex, 128) diff --git a/ethosu/vela/tflite/ActivationFunctionType.py b/ethosu/vela/tflite/ActivationFunctionType.py index 6d8ec952..dc177dee 100644 --- a/ethosu/vela/tflite/ActivationFunctionType.py +++ b/ethosu/vela/tflite/ActivationFunctionType.py @@ -9,3 +9,4 @@ class ActivationFunctionType(object): RELU6 = 3 TANH = 4 SIGN_BIT = 5 + diff --git a/ethosu/vela/tflite/AddOptions.py b/ethosu/vela/tflite/AddOptions.py index d6cbfcf5..154e6d18 100644 --- a/ethosu/vela/tflite/AddOptions.py +++ b/ethosu/vela/tflite/AddOptions.py @@ -25,6 +25,14 @@ class AddOptions(object): return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) return 0 -def AddOptionsStart(builder): builder.StartObject(1) + # AddOptions + def PotScaleInt16(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return True + +def AddOptionsStart(builder): builder.StartObject(2) def AddOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) +def AddOptionsAddPotScaleInt16(builder, potScaleInt16): builder.PrependBoolSlot(1, potScaleInt16, 1) def AddOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/BatchMatMulOptions.py b/ethosu/vela/tflite/BatchMatMulOptions.py new file mode 100644 index 00000000..5be66835 --- /dev/null +++ b/ethosu/vela/tflite/BatchMatMulOptions.py @@ -0,0 +1,38 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: tflite + +import flatbuffers + +class BatchMatMulOptions(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsBatchMatMulOptions(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = BatchMatMulOptions() + x.Init(buf, n + offset) + return x + + # BatchMatMulOptions + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # BatchMatMulOptions + def AdjX(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # BatchMatMulOptions + def AdjY(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def BatchMatMulOptionsStart(builder): builder.StartObject(2) +def BatchMatMulOptionsAddAdjX(builder, adjX): builder.PrependBoolSlot(0, adjX, 0) +def BatchMatMulOptionsAddAdjY(builder, adjY): builder.PrependBoolSlot(1, adjY, 0) +def BatchMatMulOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/BidirectionalSequenceLSTMOptions.py b/ethosu/vela/tflite/BidirectionalSequenceLSTMOptions.py index 8d8b7bea..0a0a83b7 100644 --- a/ethosu/vela/tflite/BidirectionalSequenceLSTMOptions.py +++ b/ethosu/vela/tflite/BidirectionalSequenceLSTMOptions.py @@ -53,10 +53,18 @@ class BidirectionalSequenceLSTMOptions(object): return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) return True -def BidirectionalSequenceLSTMOptionsStart(builder): builder.StartObject(5) + # BidirectionalSequenceLSTMOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def BidirectionalSequenceLSTMOptionsStart(builder): builder.StartObject(6) def BidirectionalSequenceLSTMOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) def BidirectionalSequenceLSTMOptionsAddCellClip(builder, cellClip): builder.PrependFloat32Slot(1, cellClip, 0.0) def BidirectionalSequenceLSTMOptionsAddProjClip(builder, projClip): builder.PrependFloat32Slot(2, projClip, 0.0) def BidirectionalSequenceLSTMOptionsAddMergeOutputs(builder, mergeOutputs): builder.PrependBoolSlot(3, mergeOutputs, 0) def BidirectionalSequenceLSTMOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(4, timeMajor, 1) +def BidirectionalSequenceLSTMOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(5, asymmetricQuantizeInputs, 0) def BidirectionalSequenceLSTMOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/BidirectionalSequenceRNNOptions.py b/ethosu/vela/tflite/BidirectionalSequenceRNNOptions.py index 673af6b9..e1f66ce2 100644 --- a/ethosu/vela/tflite/BidirectionalSequenceRNNOptions.py +++ b/ethosu/vela/tflite/BidirectionalSequenceRNNOptions.py @@ -39,8 +39,16 @@ class BidirectionalSequenceRNNOptions(object): return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) return False -def BidirectionalSequenceRNNOptionsStart(builder): builder.StartObject(3) + # BidirectionalSequenceRNNOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def BidirectionalSequenceRNNOptionsStart(builder): builder.StartObject(4) def BidirectionalSequenceRNNOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(0, timeMajor, 0) def BidirectionalSequenceRNNOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(1, fusedActivationFunction, 0) def BidirectionalSequenceRNNOptionsAddMergeOutputs(builder, mergeOutputs): builder.PrependBoolSlot(2, mergeOutputs, 0) +def BidirectionalSequenceRNNOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(3, asymmetricQuantizeInputs, 0) def BidirectionalSequenceRNNOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/BuiltinOperator.py b/ethosu/vela/tflite/BuiltinOperator.py index 27136538..fb23155c 100644 --- a/ethosu/vela/tflite/BuiltinOperator.py +++ b/ethosu/vela/tflite/BuiltinOperator.py @@ -129,3 +129,5 @@ class BuiltinOperator(object): SELECT_V2 = 123 DENSIFY = 124 SEGMENT_SUM = 125 + BATCH_MATMUL = 126 + diff --git a/ethosu/vela/tflite/BuiltinOptions.py b/ethosu/vela/tflite/BuiltinOptions.py index babbcb15..6f0aab0a 100644 --- a/ethosu/vela/tflite/BuiltinOptions.py +++ b/ethosu/vela/tflite/BuiltinOptions.py @@ -104,3 +104,5 @@ class BuiltinOptions(object): SelectV2Options = 98 DensifyOptions = 99 SegmentSumOptions = 100 + BatchMatMulOptions = 101 + diff --git a/ethosu/vela/tflite/CombinerType.py b/ethosu/vela/tflite/CombinerType.py index 1e3a61f3..17d91510 100644 --- a/ethosu/vela/tflite/CombinerType.py +++ b/ethosu/vela/tflite/CombinerType.py @@ -6,3 +6,4 @@ class CombinerType(object): SUM = 0 MEAN = 1 SQRTN = 2 + diff --git a/ethosu/vela/tflite/CustomOptionsFormat.py b/ethosu/vela/tflite/CustomOptionsFormat.py index c2fc07c2..bef384cf 100644 --- a/ethosu/vela/tflite/CustomOptionsFormat.py +++ b/ethosu/vela/tflite/CustomOptionsFormat.py @@ -4,3 +4,4 @@ class CustomOptionsFormat(object): FLEXBUFFERS = 0 + diff --git a/ethosu/vela/tflite/DimensionType.py b/ethosu/vela/tflite/DimensionType.py index 310d8eed..a27d016f 100644 --- a/ethosu/vela/tflite/DimensionType.py +++ b/ethosu/vela/tflite/DimensionType.py @@ -5,3 +5,4 @@ class DimensionType(object): DENSE = 0 SPARSE_CSR = 1 + diff --git a/ethosu/vela/tflite/FullyConnectedOptions.py b/ethosu/vela/tflite/FullyConnectedOptions.py index a6b4e40f..5475e3d9 100644 --- a/ethosu/vela/tflite/FullyConnectedOptions.py +++ b/ethosu/vela/tflite/FullyConnectedOptions.py @@ -39,8 +39,16 @@ class FullyConnectedOptions(object): return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) return False -def FullyConnectedOptionsStart(builder): builder.StartObject(3) + # FullyConnectedOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def FullyConnectedOptionsStart(builder): builder.StartObject(4) def FullyConnectedOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) def FullyConnectedOptionsAddWeightsFormat(builder, weightsFormat): builder.PrependInt8Slot(1, weightsFormat, 0) def FullyConnectedOptionsAddKeepNumDims(builder, keepNumDims): builder.PrependBoolSlot(2, keepNumDims, 0) +def FullyConnectedOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(3, asymmetricQuantizeInputs, 0) def FullyConnectedOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/FullyConnectedOptionsWeightsFormat.py b/ethosu/vela/tflite/FullyConnectedOptionsWeightsFormat.py index d9a53887..6d81eca1 100644 --- a/ethosu/vela/tflite/FullyConnectedOptionsWeightsFormat.py +++ b/ethosu/vela/tflite/FullyConnectedOptionsWeightsFormat.py @@ -5,3 +5,4 @@ class FullyConnectedOptionsWeightsFormat(object): DEFAULT = 0 SHUFFLED4x16INT8 = 1 + diff --git a/ethosu/vela/tflite/LSHProjectionType.py b/ethosu/vela/tflite/LSHProjectionType.py index a7d6a313..d6a136e8 100644 --- a/ethosu/vela/tflite/LSHProjectionType.py +++ b/ethosu/vela/tflite/LSHProjectionType.py @@ -6,3 +6,4 @@ class LSHProjectionType(object): UNKNOWN = 0 SPARSE = 1 DENSE = 2 + diff --git a/ethosu/vela/tflite/LSTMKernelType.py b/ethosu/vela/tflite/LSTMKernelType.py index fd657998..1ca4df0a 100644 --- a/ethosu/vela/tflite/LSTMKernelType.py +++ b/ethosu/vela/tflite/LSTMKernelType.py @@ -5,3 +5,4 @@ class LSTMKernelType(object): FULL = 0 BASIC = 1 + diff --git a/ethosu/vela/tflite/LSTMOptions.py b/ethosu/vela/tflite/LSTMOptions.py index 93a83093..2f519bc2 100644 --- a/ethosu/vela/tflite/LSTMOptions.py +++ b/ethosu/vela/tflite/LSTMOptions.py @@ -46,9 +46,17 @@ class LSTMOptions(object): return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) return 0 -def LSTMOptionsStart(builder): builder.StartObject(4) + # LSTMOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def LSTMOptionsStart(builder): builder.StartObject(5) def LSTMOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) def LSTMOptionsAddCellClip(builder, cellClip): builder.PrependFloat32Slot(1, cellClip, 0.0) def LSTMOptionsAddProjClip(builder, projClip): builder.PrependFloat32Slot(2, projClip, 0.0) def LSTMOptionsAddKernelType(builder, kernelType): builder.PrependInt8Slot(3, kernelType, 0) +def LSTMOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(4, asymmetricQuantizeInputs, 0) def LSTMOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/MirrorPadMode.py b/ethosu/vela/tflite/MirrorPadMode.py index 8fb6396f..ce7579d2 100644 --- a/ethosu/vela/tflite/MirrorPadMode.py +++ b/ethosu/vela/tflite/MirrorPadMode.py @@ -5,3 +5,4 @@ class MirrorPadMode(object): REFLECT = 0 SYMMETRIC = 1 + diff --git a/ethosu/vela/tflite/Padding.py b/ethosu/vela/tflite/Padding.py index 168bf74c..6027f4b5 100644 --- a/ethosu/vela/tflite/Padding.py +++ b/ethosu/vela/tflite/Padding.py @@ -5,3 +5,4 @@ class Padding(object): SAME = 0 VALID = 1 + diff --git a/ethosu/vela/tflite/QuantizationDetails.py b/ethosu/vela/tflite/QuantizationDetails.py index 8d53af96..7159efbd 100644 --- a/ethosu/vela/tflite/QuantizationDetails.py +++ b/ethosu/vela/tflite/QuantizationDetails.py @@ -5,3 +5,4 @@ class QuantizationDetails(object): NONE = 0 CustomQuantization = 1 + diff --git a/ethosu/vela/tflite/RNNOptions.py b/ethosu/vela/tflite/RNNOptions.py index 3cfdb6af..397d716f 100644 --- a/ethosu/vela/tflite/RNNOptions.py +++ b/ethosu/vela/tflite/RNNOptions.py @@ -25,6 +25,14 @@ class RNNOptions(object): return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) return 0 -def RNNOptionsStart(builder): builder.StartObject(1) + # RNNOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def RNNOptionsStart(builder): builder.StartObject(2) def RNNOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) +def RNNOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(1, asymmetricQuantizeInputs, 0) def RNNOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/ResizeNearestNeighborOptions.py b/ethosu/vela/tflite/ResizeNearestNeighborOptions.py index 4b166e95..e2642cef 100644 --- a/ethosu/vela/tflite/ResizeNearestNeighborOptions.py +++ b/ethosu/vela/tflite/ResizeNearestNeighborOptions.py @@ -25,6 +25,14 @@ class ResizeNearestNeighborOptions(object): return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) return False -def ResizeNearestNeighborOptionsStart(builder): builder.StartObject(1) + # ResizeNearestNeighborOptions + def HalfPixelCenters(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def ResizeNearestNeighborOptionsStart(builder): builder.StartObject(2) def ResizeNearestNeighborOptionsAddAlignCorners(builder, alignCorners): builder.PrependBoolSlot(0, alignCorners, 0) +def ResizeNearestNeighborOptionsAddHalfPixelCenters(builder, halfPixelCenters): builder.PrependBoolSlot(1, halfPixelCenters, 0) def ResizeNearestNeighborOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/SVDFOptions.py b/ethosu/vela/tflite/SVDFOptions.py index 6f391db1..e4b34611 100644 --- a/ethosu/vela/tflite/SVDFOptions.py +++ b/ethosu/vela/tflite/SVDFOptions.py @@ -32,7 +32,15 @@ class SVDFOptions(object): return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) return 0 -def SVDFOptionsStart(builder): builder.StartObject(2) + # SVDFOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def SVDFOptionsStart(builder): builder.StartObject(3) def SVDFOptionsAddRank(builder, rank): builder.PrependInt32Slot(0, rank, 0) def SVDFOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(1, fusedActivationFunction, 0) +def SVDFOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(2, asymmetricQuantizeInputs, 0) def SVDFOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/SequenceRNNOptions.py b/ethosu/vela/tflite/SequenceRNNOptions.py index 74a4954a..16eaf090 100644 --- a/ethosu/vela/tflite/SequenceRNNOptions.py +++ b/ethosu/vela/tflite/SequenceRNNOptions.py @@ -32,7 +32,15 @@ class SequenceRNNOptions(object): return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) return 0 -def SequenceRNNOptionsStart(builder): builder.StartObject(2) + # SequenceRNNOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def SequenceRNNOptionsStart(builder): builder.StartObject(3) def SequenceRNNOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(0, timeMajor, 0) def SequenceRNNOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(1, fusedActivationFunction, 0) +def SequenceRNNOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(2, asymmetricQuantizeInputs, 0) def SequenceRNNOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/SparseIndexVector.py b/ethosu/vela/tflite/SparseIndexVector.py index e2c9db78..fd35a03b 100644 --- a/ethosu/vela/tflite/SparseIndexVector.py +++ b/ethosu/vela/tflite/SparseIndexVector.py @@ -7,3 +7,4 @@ class SparseIndexVector(object): Int32Vector = 1 Uint16Vector = 2 Uint8Vector = 3 + diff --git a/ethosu/vela/tflite/SubOptions.py b/ethosu/vela/tflite/SubOptions.py index eccd7aba..c3ed40e1 100644 --- a/ethosu/vela/tflite/SubOptions.py +++ b/ethosu/vela/tflite/SubOptions.py @@ -25,6 +25,14 @@ class SubOptions(object): return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) return 0 -def SubOptionsStart(builder): builder.StartObject(1) + # SubOptions + def PotScaleInt16(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return True + +def SubOptionsStart(builder): builder.StartObject(2) def SubOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) +def SubOptionsAddPotScaleInt16(builder, potScaleInt16): builder.PrependBoolSlot(1, potScaleInt16, 1) def SubOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite/TensorType.py b/ethosu/vela/tflite/TensorType.py index 53c011bc..e0108818 100644 --- a/ethosu/vela/tflite/TensorType.py +++ b/ethosu/vela/tflite/TensorType.py @@ -13,3 +13,6 @@ class TensorType(object): INT16 = 7 COMPLEX64 = 8 INT8 = 9 + FLOAT64 = 10 + COMPLEX128 = 11 + diff --git a/ethosu/vela/tflite/UnidirectionalSequenceLSTMOptions.py b/ethosu/vela/tflite/UnidirectionalSequenceLSTMOptions.py index 1b0c112c..b734f3ff 100644 --- a/ethosu/vela/tflite/UnidirectionalSequenceLSTMOptions.py +++ b/ethosu/vela/tflite/UnidirectionalSequenceLSTMOptions.py @@ -46,9 +46,17 @@ class UnidirectionalSequenceLSTMOptions(object): return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) return False -def UnidirectionalSequenceLSTMOptionsStart(builder): builder.StartObject(4) + # UnidirectionalSequenceLSTMOptions + def AsymmetricQuantizeInputs(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def UnidirectionalSequenceLSTMOptionsStart(builder): builder.StartObject(5) def UnidirectionalSequenceLSTMOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) def UnidirectionalSequenceLSTMOptionsAddCellClip(builder, cellClip): builder.PrependFloat32Slot(1, cellClip, 0.0) def UnidirectionalSequenceLSTMOptionsAddProjClip(builder, projClip): builder.PrependFloat32Slot(2, projClip, 0.0) def UnidirectionalSequenceLSTMOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(3, timeMajor, 0) +def UnidirectionalSequenceLSTMOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(4, asymmetricQuantizeInputs, 0) def UnidirectionalSequenceLSTMOptionsEnd(builder): return builder.EndObject() diff --git a/ethosu/vela/tflite_mapping.py b/ethosu/vela/tflite_mapping.py index adf3462b..c25f4156 100644 --- a/ethosu/vela/tflite_mapping.py +++ b/ethosu/vela/tflite_mapping.py @@ -27,6 +27,7 @@ from .tflite import AddNOptions from .tflite import AddOptions from .tflite import ArgMaxOptions from .tflite import ArgMinOptions +from .tflite import BatchMatMulOptions from .tflite import BatchToSpaceNDOptions from .tflite import BidirectionalSequenceLSTMOptions from .tflite import BidirectionalSequenceRNNOptions @@ -141,9 +142,11 @@ datatype_map = { TensorType.INT64: DataType.int64, TensorType.FLOAT16: DataType.float16, TensorType.FLOAT32: DataType.float32, + TensorType.FLOAT64: DataType.float64, TensorType.STRING: DataType.string, TensorType.BOOL: DataType.bool, TensorType.COMPLEX64: DataType.complex64, + TensorType.COMPLEX128: DataType.complex128, } datatype_inv_map = inverse_map(datatype_map) @@ -162,8 +165,10 @@ datatype_map_numpy = { TensorType.INT64: np.int64, TensorType.FLOAT16: np.float16, TensorType.FLOAT32: np.float32, + TensorType.FLOAT64: np.float64, TensorType.BOOL: np.bool, TensorType.COMPLEX64: np.complex64, + TensorType.COMPLEX128: np.complex128, } @@ -268,6 +273,7 @@ builtin_options_map = { BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions, BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options, BuiltinOptions.WhileOptions: WhileOptions.WhileOptions, + BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions, } builtin_options_inv_map = inverse_map(builtin_options_map) @@ -445,21 +451,27 @@ conv2d_opts = OptionsSerializer( "Conv2DOptions", (padding, "stride_w", "stride_h", fused_act, "dilation_w_factor", "dilation_h_factor",) ) -lstm_opts = OptionsSerializer("LSTMOptions", (fused_act, "cell_clip", "proj_clip", "kernel_type")) +lstm_opts = OptionsSerializer( + "LSTMOptions", (fused_act, "cell_clip", "proj_clip", "kernel_type", "asymmetric_quantize_inputs") +) unidir_seq_lstm_opts = OptionsSerializer( - "UnidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "time_major") + "UnidirectionalSequenceLSTMOptions", + (fused_act, "cell_clip", "proj_clip", "time_major", "asymmetric_quantize_inputs",), ) bidir_seq_lstm_opts = OptionsSerializer( - "BidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "merge_outputs", "time_major") + "BidirectionalSequenceLSTMOptions", + (fused_act, "cell_clip", "proj_clip", "merge_outputs", "time_major", "asymmetric_quantize_inputs"), ) -rnn_opts = OptionsSerializer("RNNOptions", (fused_act,)) +rnn_opts = OptionsSerializer("RNNOptions", (fused_act, "asymmetric_quantize_inputs")) -seq_rnn_opts = OptionsSerializer("SequenceRNNOptions", ("time_major", fused_act,)) +seq_rnn_opts = OptionsSerializer("SequenceRNNOptions", ("time_major", fused_act, "asymmetric_quantize_inputs",)) -bidir_seq_rnn_opts = OptionsSerializer("BidirectionalSequenceRNNOptions", ("time_major", fused_act, "merge_outputs",)) +bidir_seq_rnn_opts = OptionsSerializer( + "BidirectionalSequenceRNNOptions", ("time_major", fused_act, "merge_outputs", "asymmetric_quantize_inputs") +) reducer_opts = OptionsSerializer("ReducerOptions", ("keep_dims",)) @@ -469,7 +481,7 @@ is_int_vec = True custom_prefix = "Custom_" builtin_operator_map = { - BuiltinOperator.ADD: ("AddAct", OptionsSerializer("AddOptions", (fused_act,))), + BuiltinOperator.ADD: ("AddAct", OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16"))), BuiltinOperator.AVERAGE_POOL_2D: ("AvgPoolAct", pool2d_opts), BuiltinOperator.CONCATENATION: ("ConcatTFLite", OptionsSerializer("ConcatenationOptions", ("axis", fused_act))), BuiltinOperator.CONV_2D: ("Conv2DBiasAct", conv2d_opts), @@ -480,10 +492,10 @@ builtin_operator_map = { BuiltinOperator.FLOOR: ("Floor", None), BuiltinOperator.FULLY_CONNECTED: ( "FullyConnectedAct", - OptionsSerializer("FullyConnectedOptions", (fused_act, "weights_format")), + OptionsSerializer("FullyConnectedOptions", (fused_act, "weights_format", "asymmetric_quantize_inputs")), ), BuiltinOperator.HASHTABLE_LOOKUP: ("HashtableLookup", None), - BuiltinOperator.L2_NORMALIZATION : ("L2NormAct", OptionsSerializer("L2NormOptions", (fused_act,))), + BuiltinOperator.L2_NORMALIZATION: ("L2NormAct", OptionsSerializer("L2NormOptions", (fused_act,))), BuiltinOperator.L2_POOL_2D: ("L2Pool2D", pool2d_opts), BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: ( "LRN", @@ -505,25 +517,34 @@ builtin_operator_map = { BuiltinOperator.RNN: ("RnnAct", rnn_opts), BuiltinOperator.SOFTMAX: ("Softmax", OptionsSerializer("SoftmaxOptions", ("beta",))), BuiltinOperator.SPACE_TO_DEPTH: ("SpaceToDepth", OptionsSerializer("SpaceToDepthOptions", ("block_size",))), - BuiltinOperator.SVDF: ("SvdfAct", OptionsSerializer("SVDFOptions", ("rank", fused_act))), + BuiltinOperator.SVDF: ( + "SvdfAct", + OptionsSerializer("SVDFOptions", ("rank", fused_act, "asymmetric_quantize_inputs")), + ), BuiltinOperator.TANH: ("Tanh", None), BuiltinOperator.CONCAT_EMBEDDINGS: ( "ConcatEmbeddings", OptionsSerializer( "ConcatEmbeddingsOptions", - ("num_channels", "num_columns_per_channel", "num_columns_per_channel_as_numpy", - "num_columns_per_channel_as_length", "embedding_dim_per_channel", "embedding_dim_per_channel_as_numpy", - "embedding_dim_per_channel_as_length",) + ( + "num_channels", + "num_columns_per_channel", + "num_columns_per_channel_as_numpy", + "num_columns_per_channel_as_length", + "embedding_dim_per_channel", + "embedding_dim_per_channel_as_numpy", + "embedding_dim_per_channel_as_length", + ), ), ), BuiltinOperator.SKIP_GRAM: ( "SkipGram", - OptionsSerializer("SkipGramOptions", ("ngram_size", "max_skip_size", "include_all_ngrams")) + OptionsSerializer("SkipGramOptions", ("ngram_size", "max_skip_size", "include_all_ngrams")), ), BuiltinOperator.CALL: ("Call", OptionsSerializer("CallOptions", ("subgraph",))), BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: ( "EmbeddingLookupSparse", - OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)) + OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)), ), BuiltinOperator.PAD: ("Pad", OptionsSerializer("PadOptions")), BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: ("UnidirectionalSequenceRnnAct", seq_rnn_opts), @@ -532,7 +553,7 @@ builtin_operator_map = { BuiltinOperator.SPACE_TO_BATCH_ND: ("SpaceToBatchND", OptionsSerializer("SpaceToBatchNDOptions")), BuiltinOperator.TRANSPOSE: ("Transpose", OptionsSerializer("TransposeOptions")), BuiltinOperator.MEAN: ("Mean", None), - BuiltinOperator.SUB: ("SubAct", OptionsSerializer("SubOptions", (fused_act,))), + BuiltinOperator.SUB: ("SubAct", OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16",))), BuiltinOperator.DIV: ("DivAct", OptionsSerializer("DivOptions", (fused_act,))), BuiltinOperator.SQUEEZE: ("Squeeze", OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),))), BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: ("UnidirectionalSequenceLstmAct", unidir_seq_lstm_opts), @@ -547,7 +568,7 @@ builtin_operator_map = { BuiltinOperator.TOPK_V2: ("TopKV2", OptionsSerializer("TopKV2Options")), BuiltinOperator.SPLIT: ("Split", OptionsSerializer("SplitOptions", ("num_splits",))), BuiltinOperator.LOG_SOFTMAX: ("LogSoftmax", OptionsSerializer("LogSoftmaxOptions")), - BuiltinOperator.DELEGATE : ("Delegate", None), + BuiltinOperator.DELEGATE: ("Delegate", None), BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: ("BidirectionalSequenceLstmAct", bidir_seq_lstm_opts), BuiltinOperator.CAST: ( "Cast", @@ -622,7 +643,7 @@ builtin_operator_map = { BuiltinOperator.RANGE: ("Range", OptionsSerializer("RangeOptions")), BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: ( "ResizeNearestNeighbor", - OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners",)), + OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")), ), BuiltinOperator.LEAKY_RELU: ("LeakyRelu", OptionsSerializer("LeakyReluOptions", ("alpha",))), BuiltinOperator.SQUARED_DIFFERENCE: ("SquaredDifference", OptionsSerializer("SquaredDifferenceOptions")), @@ -658,6 +679,7 @@ builtin_operator_map = { BuiltinOperator.SELECT_V2: ("SelectV2", OptionsSerializer("SelectV2Options")), BuiltinOperator.DENSIFY: ("Densify", OptionsSerializer("DensifyOptions")), BuiltinOperator.SEGMENT_SUM: ("SegmentSum", OptionsSerializer("SegmentSumOptions")), + BuiltinOperator.BATCH_MATMUL: ("BatchMatMul", OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y"))), BuiltinOperator.CUSTOM: (custom_prefix, CustomOptionsSerializer()), } -- cgit v1.2.1