From b37a81bfce0c7ae3092e4b3c9f69e08644b84e25 Mon Sep 17 00:00:00 2001 From: Rickard Bolin Date: Fri, 29 Sep 2023 12:48:29 +0000 Subject: MLBEDSW-8111: Update to TensorFlow 2.14 - Update to TensorFlow 2.14 and minimum required Python version to 3.9. - Update version pins on NumPy and FlatBuffers. - Add constraint to Offset attribute of StridedSlice operator Change-Id: I8c7122def963202e5f47e92b62be607935ed05cf Signed-off-by: Rickard Bolin --- .../vela/test/test_tflite_supported_operators.py | 8 ++++++++ ethosu/vela/tflite/Buffer.py | 22 +++++++++++++++++++++- ethosu/vela/tflite/Operator.py | 22 +++++++++++++++++++++- ethosu/vela/tflite/StridedSliceOptions.py | 12 +++++++++++- ethosu/vela/tflite_mapping.py | 3 ++- ethosu/vela/tflite_supported_operators.py | 8 ++++++++ 6 files changed, 71 insertions(+), 4 deletions(-) (limited to 'ethosu') diff --git a/ethosu/vela/test/test_tflite_supported_operators.py b/ethosu/vela/test/test_tflite_supported_operators.py index e5cc280b..d6b94789 100644 --- a/ethosu/vela/test/test_tflite_supported_operators.py +++ b/ethosu/vela/test/test_tflite_supported_operators.py @@ -529,6 +529,7 @@ def create_strided_slice(): op = create_strided_slice_op([1, 10, 10, 10], [1, 5, 5, 10], [127, 2, 2, 0], [0, 7, -3, 0]) op.attrs["begin_mask"] = 1 op.attrs["end_mask"] = 9 + op.attrs["offset"] = False assert support.is_operator_supported(op) return op @@ -540,6 +541,13 @@ def test_constraint_stridedslice_stride_values(): assert not support.is_operator_supported(op) +def test_constraint_stridedslice_offset_false(): + # Offset attribute must be False + op = create_strided_slice() + op.attrs["offset"] = True + assert not support.is_operator_supported(op) + + def test_constraint_inputs_int32(): # both inputs must be type int32 op = testutil.create_elemwise_op(Op.SHL, "op", [1, 8, 8, 8], [1, 8, 8, 8], [1, 8, 8, 8]) diff --git a/ethosu/vela/tflite/Buffer.py b/ethosu/vela/tflite/Buffer.py index e9d45a51..4629ded4 100644 --- a/ethosu/vela/tflite/Buffer.py +++ b/ethosu/vela/tflite/Buffer.py @@ -55,7 +55,21 @@ class Buffer(object): o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) return o == 0 -def BufferStart(builder): builder.StartObject(1) + # Buffer + def Offset(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Buffer + def Size(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + +def BufferStart(builder): builder.StartObject(3) def Start(builder): return BufferStart(builder) def BufferAddData(builder, data): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(data), 0) @@ -64,6 +78,12 @@ def AddData(builder, data): def BufferStartDataVector(builder, numElems): return builder.StartVector(1, numElems, 1) def StartDataVector(builder, numElems): return BufferStartDataVector(builder, numElems) +def BufferAddOffset(builder, offset): builder.PrependUint64Slot(1, offset, 0) +def AddOffset(builder, offset): + return BufferAddOffset(builder, offset) +def BufferAddSize(builder, size): builder.PrependUint64Slot(2, size, 0) +def AddSize(builder, size): + return BufferAddSize(builder, size) def BufferEnd(builder): return builder.EndObject() def End(builder): return BufferEnd(builder) \ No newline at end of file diff --git a/ethosu/vela/tflite/Operator.py b/ethosu/vela/tflite/Operator.py index 2af3f8ce..23d787b3 100644 --- a/ethosu/vela/tflite/Operator.py +++ b/ethosu/vela/tflite/Operator.py @@ -194,7 +194,21 @@ class Operator(object): o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) return o == 0 -def OperatorStart(builder): builder.StartObject(9) + # Operator + def LargeCustomOptionsOffset(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Operator + def LargeCustomOptionsSize(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + +def OperatorStart(builder): builder.StartObject(11) def Start(builder): return OperatorStart(builder) def OperatorAddOpcodeIndex(builder, opcodeIndex): builder.PrependUint32Slot(0, opcodeIndex, 0) @@ -239,6 +253,12 @@ def AddIntermediates(builder, intermediates): def OperatorStartIntermediatesVector(builder, numElems): return builder.StartVector(4, numElems, 4) def StartIntermediatesVector(builder, numElems): return OperatorStartIntermediatesVector(builder, numElems) +def OperatorAddLargeCustomOptionsOffset(builder, largeCustomOptionsOffset): builder.PrependUint64Slot(9, largeCustomOptionsOffset, 0) +def AddLargeCustomOptionsOffset(builder, largeCustomOptionsOffset): + return OperatorAddLargeCustomOptionsOffset(builder, largeCustomOptionsOffset) +def OperatorAddLargeCustomOptionsSize(builder, largeCustomOptionsSize): builder.PrependUint64Slot(10, largeCustomOptionsSize, 0) +def AddLargeCustomOptionsSize(builder, largeCustomOptionsSize): + return OperatorAddLargeCustomOptionsSize(builder, largeCustomOptionsSize) def OperatorEnd(builder): return builder.EndObject() def End(builder): return OperatorEnd(builder) \ No newline at end of file diff --git a/ethosu/vela/tflite/StridedSliceOptions.py b/ethosu/vela/tflite/StridedSliceOptions.py index ccc2701c..c0696e72 100644 --- a/ethosu/vela/tflite/StridedSliceOptions.py +++ b/ethosu/vela/tflite/StridedSliceOptions.py @@ -63,7 +63,14 @@ class StridedSliceOptions(object): return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) return 0 -def StridedSliceOptionsStart(builder): builder.StartObject(5) + # StridedSliceOptions + def Offset(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 StridedSliceOptionsStart(builder): builder.StartObject(6) def Start(builder): return StridedSliceOptionsStart(builder) def StridedSliceOptionsAddBeginMask(builder, beginMask): builder.PrependInt32Slot(0, beginMask, 0) @@ -81,6 +88,9 @@ def AddNewAxisMask(builder, newAxisMask): def StridedSliceOptionsAddShrinkAxisMask(builder, shrinkAxisMask): builder.PrependInt32Slot(4, shrinkAxisMask, 0) def AddShrinkAxisMask(builder, shrinkAxisMask): return StridedSliceOptionsAddShrinkAxisMask(builder, shrinkAxisMask) +def StridedSliceOptionsAddOffset(builder, offset): builder.PrependBoolSlot(5, offset, 0) +def AddOffset(builder, offset): + return StridedSliceOptionsAddOffset(builder, offset) def StridedSliceOptionsEnd(builder): return builder.EndObject() def End(builder): return StridedSliceOptionsEnd(builder) \ No newline at end of file diff --git a/ethosu/vela/tflite_mapping.py b/ethosu/vela/tflite_mapping.py index a94db703..fd94dd80 100644 --- a/ethosu/vela/tflite_mapping.py +++ b/ethosu/vela/tflite_mapping.py @@ -736,7 +736,8 @@ builtin_operator_map = { BuiltinOperator.STRIDED_SLICE: ( Op.StridedSlice, OptionsSerializer( - "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask") + "StridedSliceOptions", + ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask", "offset"), ), TFLITE_IFM_INDICES, ), diff --git a/ethosu/vela/tflite_supported_operators.py b/ethosu/vela/tflite_supported_operators.py index 3dbde847..41862b6e 100644 --- a/ethosu/vela/tflite_supported_operators.py +++ b/ethosu/vela/tflite_supported_operators.py @@ -306,6 +306,7 @@ class TFLiteSupportedOperators: self.specific_constraints[Op.StridedSlice].append( TFLiteSupportedOperators.constraint_stridedslice_stride_values ) + self.specific_constraints[Op.StridedSlice].append(TFLiteSupportedOperators.constraint_stridedslice_offset_false) # Pad specific checks: self.specific_constraints[Op.Pad].append(TFLiteSupportedOperators.constraint_pad_shape) @@ -805,6 +806,13 @@ class TFLiteSupportedOperators: valid = all(stride == 1 for stride in strides.values) return valid, f"Op has strides values {strides.values}" + @staticmethod + def constraint_stridedslice_offset_false(op): + "Offset attribute must be False" + offset = op.attrs.get("offset", False) + valid = offset is False + return valid, f"Op has offset={offset}" + @staticmethod def constraint_inputs_int32(op): "Both Input data types must be int32" -- cgit v1.2.1