From 81beae3a870004795275e9266bc43d845b9f78db Mon Sep 17 00:00:00 2001 From: Matthew Sloyan Date: Tue, 13 Jul 2021 19:46:11 +0100 Subject: IVGCVSW-6119 ConstTensorsAsInput: FullyConnected * Constant weights and biases are now stored as Constant layers. * Updated Serializer, Deserializer and unit tests to reflect this. * Updated TfLiteDelegate, TfLiteParser and OnnxParser. * Updated Schema with IsConstant and ConstantTensorsAsInputs. * Updated Ref backend to handle constant weights and bias as inputs rather than reading from member variables. * Added dynamic or constant input EndToEnd tests. !android-nn-driver:5959 Signed-off-by: Matthew Sloyan Change-Id: Ibf3cf437df1100e4b322b0d303c575c6339f9696 --- src/armnnSerializer/ArmnnSchema_generated.h | 34 ++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'src/armnnSerializer/ArmnnSchema_generated.h') diff --git a/src/armnnSerializer/ArmnnSchema_generated.h b/src/armnnSerializer/ArmnnSchema_generated.h index 27550f0682..ca2bf0c003 100644 --- a/src/armnnSerializer/ArmnnSchema_generated.h +++ b/src/armnnSerializer/ArmnnSchema_generated.h @@ -1685,7 +1685,8 @@ struct TensorInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_QUANTIZATIONSCALES = 12, VT_QUANTIZATIONDIM = 14, VT_DIMENSIONALITY = 16, - VT_DIMENSIONSPECIFICITY = 18 + VT_DIMENSIONSPECIFICITY = 18, + VT_ISCONSTANT = 20 }; const flatbuffers::Vector *dimensions() const { return GetPointer *>(VT_DIMENSIONS); @@ -1711,6 +1712,9 @@ struct TensorInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const flatbuffers::Vector *dimensionSpecificity() const { return GetPointer *>(VT_DIMENSIONSPECIFICITY); } + bool isConstant() const { + return GetField(VT_ISCONSTANT, 0) != 0; + } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_DIMENSIONS) && @@ -1724,6 +1728,7 @@ struct TensorInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VerifyField(verifier, VT_DIMENSIONALITY) && VerifyOffset(verifier, VT_DIMENSIONSPECIFICITY) && verifier.VerifyVector(dimensionSpecificity()) && + VerifyField(verifier, VT_ISCONSTANT) && verifier.EndTable(); } }; @@ -1756,6 +1761,9 @@ struct TensorInfoBuilder { void add_dimensionSpecificity(flatbuffers::Offset> dimensionSpecificity) { fbb_.AddOffset(TensorInfo::VT_DIMENSIONSPECIFICITY, dimensionSpecificity); } + void add_isConstant(bool isConstant) { + fbb_.AddElement(TensorInfo::VT_ISCONSTANT, static_cast(isConstant), 0); + } explicit TensorInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -1777,7 +1785,8 @@ inline flatbuffers::Offset CreateTensorInfo( flatbuffers::Offset> quantizationScales = 0, uint32_t quantizationDim = 0, uint32_t dimensionality = 1, - flatbuffers::Offset> dimensionSpecificity = 0) { + flatbuffers::Offset> dimensionSpecificity = 0, + bool isConstant = false) { TensorInfoBuilder builder_(_fbb); builder_.add_dimensionSpecificity(dimensionSpecificity); builder_.add_dimensionality(dimensionality); @@ -1786,6 +1795,7 @@ inline flatbuffers::Offset CreateTensorInfo( builder_.add_quantizationOffset(quantizationOffset); builder_.add_quantizationScale(quantizationScale); builder_.add_dimensions(dimensions); + builder_.add_isConstant(isConstant); builder_.add_dataType(dataType); return builder_.Finish(); } @@ -1799,7 +1809,8 @@ inline flatbuffers::Offset CreateTensorInfoDirect( const std::vector *quantizationScales = nullptr, uint32_t quantizationDim = 0, uint32_t dimensionality = 1, - const std::vector *dimensionSpecificity = nullptr) { + const std::vector *dimensionSpecificity = nullptr, + bool isConstant = false) { auto dimensions__ = dimensions ? _fbb.CreateVector(*dimensions) : 0; auto quantizationScales__ = quantizationScales ? _fbb.CreateVector(*quantizationScales) : 0; auto dimensionSpecificity__ = dimensionSpecificity ? _fbb.CreateVector(*dimensionSpecificity) : 0; @@ -1812,7 +1823,8 @@ inline flatbuffers::Offset CreateTensorInfoDirect( quantizationScales__, quantizationDim, dimensionality, - dimensionSpecificity__); + dimensionSpecificity__, + isConstant); } struct ByteData FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { @@ -10124,7 +10136,8 @@ struct FeatureCompatibilityVersions FLATBUFFERS_FINAL_CLASS : private flatbuffer typedef FeatureCompatibilityVersionsBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_BINDINGIDSSCHEME = 4, - VT_WEIGHTSLAYOUTSCHEME = 6 + VT_WEIGHTSLAYOUTSCHEME = 6, + VT_CONSTANTTENSORSASINPUTS = 8 }; uint32_t bindingIdsScheme() const { return GetField(VT_BINDINGIDSSCHEME, 0); @@ -10132,10 +10145,14 @@ struct FeatureCompatibilityVersions FLATBUFFERS_FINAL_CLASS : private flatbuffer uint32_t weightsLayoutScheme() const { return GetField(VT_WEIGHTSLAYOUTSCHEME, 0); } + uint32_t constantTensorsAsInputs() const { + return GetField(VT_CONSTANTTENSORSASINPUTS, 0); + } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_BINDINGIDSSCHEME) && VerifyField(verifier, VT_WEIGHTSLAYOUTSCHEME) && + VerifyField(verifier, VT_CONSTANTTENSORSASINPUTS) && verifier.EndTable(); } }; @@ -10150,6 +10167,9 @@ struct FeatureCompatibilityVersionsBuilder { void add_weightsLayoutScheme(uint32_t weightsLayoutScheme) { fbb_.AddElement(FeatureCompatibilityVersions::VT_WEIGHTSLAYOUTSCHEME, weightsLayoutScheme, 0); } + void add_constantTensorsAsInputs(uint32_t constantTensorsAsInputs) { + fbb_.AddElement(FeatureCompatibilityVersions::VT_CONSTANTTENSORSASINPUTS, constantTensorsAsInputs, 0); + } explicit FeatureCompatibilityVersionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -10165,8 +10185,10 @@ struct FeatureCompatibilityVersionsBuilder { inline flatbuffers::Offset CreateFeatureCompatibilityVersions( flatbuffers::FlatBufferBuilder &_fbb, uint32_t bindingIdsScheme = 0, - uint32_t weightsLayoutScheme = 0) { + uint32_t weightsLayoutScheme = 0, + uint32_t constantTensorsAsInputs = 0) { FeatureCompatibilityVersionsBuilder builder_(_fbb); + builder_.add_constantTensorsAsInputs(constantTensorsAsInputs); builder_.add_weightsLayoutScheme(weightsLayoutScheme); builder_.add_bindingIdsScheme(bindingIdsScheme); return builder_.Finish(); -- cgit v1.2.1