diff options
author | Matthew Sloyan <matthew.sloyan@arm.com> | 2021-10-18 13:07:49 +0100 |
---|---|---|
committer | Matthew Sloyan <matthew.sloyan@arm.com> | 2021-10-20 16:03:04 +0100 |
commit | 5d7b0a314b3e354a6cbcf15f5dd78b50f1e02774 (patch) | |
tree | 3d844c4575193ffddfe3a17c51cb808c9f16ddb0 /src/armnnSerializer | |
parent | 73010788725f8f07efb6df20711ece712ee213ea (diff) | |
download | armnn-5d7b0a314b3e354a6cbcf15f5dd78b50f1e02774.tar.gz |
Add ConstTensorsAsInput support for Conv3d
* Constant weights and biases are now stored as Constant layers.
* Updated Serializer, Deserializer and unit tests to reflect this.
* Updated TfLiteParser.
* Updated Ref backend to handle constant weights and
bias as inputs rather than reading from member variables.
* Added Conv3d EndToEnd test.
* Added NCDHW DataLayout and unit tests.
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: I10cdd354ca5f1c748730f92ffdb36bf810f83c8e
Diffstat (limited to 'src/armnnSerializer')
-rw-r--r-- | src/armnnSerializer/ArmnnSchema.fbs | 5 | ||||
-rw-r--r-- | src/armnnSerializer/ArmnnSchema_generated.h | 39 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.cpp | 22 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.hpp | 1 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerUtils.cpp | 2 | ||||
-rw-r--r-- | src/armnnSerializer/test/SerializerTestUtils.hpp | 1 | ||||
-rw-r--r-- | src/armnnSerializer/test/SerializerTests.cpp | 17 |
7 files changed, 28 insertions, 59 deletions
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs index 77982888c8..c577a11a52 100644 --- a/src/armnnSerializer/ArmnnSchema.fbs +++ b/src/armnnSerializer/ArmnnSchema.fbs @@ -46,7 +46,8 @@ enum DataType : byte { enum DataLayout : byte { NHWC = 0, NCHW = 1, - NDHWC = 2 + NDHWC = 2, + NCDHW = 3 } enum ReduceOperation: byte { @@ -287,8 +288,6 @@ table Convolution2dDescriptor { table Convolution3dLayer { base:LayerBase; descriptor:Convolution3dDescriptor; - weights:ConstTensor; - biases:ConstTensor; } table Convolution3dDescriptor { diff --git a/src/armnnSerializer/ArmnnSchema_generated.h b/src/armnnSerializer/ArmnnSchema_generated.h index 8234aa9c47..712ad28574 100644 --- a/src/armnnSerializer/ArmnnSchema_generated.h +++ b/src/armnnSerializer/ArmnnSchema_generated.h @@ -540,31 +540,34 @@ enum DataLayout { DataLayout_NHWC = 0, DataLayout_NCHW = 1, DataLayout_NDHWC = 2, + DataLayout_NCDHW = 3, DataLayout_MIN = DataLayout_NHWC, - DataLayout_MAX = DataLayout_NDHWC + DataLayout_MAX = DataLayout_NCDHW }; -inline const DataLayout (&EnumValuesDataLayout())[3] { +inline const DataLayout (&EnumValuesDataLayout())[4] { static const DataLayout values[] = { DataLayout_NHWC, DataLayout_NCHW, - DataLayout_NDHWC + DataLayout_NDHWC, + DataLayout_NCDHW }; return values; } inline const char * const *EnumNamesDataLayout() { - static const char * const names[4] = { + static const char * const names[5] = { "NHWC", "NCHW", "NDHWC", + "NCDHW", nullptr }; return names; } inline const char *EnumNameDataLayout(DataLayout e) { - if (flatbuffers::IsOutRange(e, DataLayout_NHWC, DataLayout_NDHWC)) return ""; + if (flatbuffers::IsOutRange(e, DataLayout_NHWC, DataLayout_NCDHW)) return ""; const size_t index = static_cast<size_t>(e); return EnumNamesDataLayout()[index]; } @@ -3250,9 +3253,7 @@ struct Convolution3dLayer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef Convolution3dLayerBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_BASE = 4, - VT_DESCRIPTOR = 6, - VT_WEIGHTS = 8, - VT_BIASES = 10 + VT_DESCRIPTOR = 6 }; const armnnSerializer::LayerBase *base() const { return GetPointer<const armnnSerializer::LayerBase *>(VT_BASE); @@ -3260,22 +3261,12 @@ struct Convolution3dLayer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const armnnSerializer::Convolution3dDescriptor *descriptor() const { return GetPointer<const armnnSerializer::Convolution3dDescriptor *>(VT_DESCRIPTOR); } - const armnnSerializer::ConstTensor *weights() const { - return GetPointer<const armnnSerializer::ConstTensor *>(VT_WEIGHTS); - } - const armnnSerializer::ConstTensor *biases() const { - return GetPointer<const armnnSerializer::ConstTensor *>(VT_BIASES); - } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_BASE) && verifier.VerifyTable(base()) && VerifyOffset(verifier, VT_DESCRIPTOR) && verifier.VerifyTable(descriptor()) && - VerifyOffset(verifier, VT_WEIGHTS) && - verifier.VerifyTable(weights()) && - VerifyOffset(verifier, VT_BIASES) && - verifier.VerifyTable(biases()) && verifier.EndTable(); } }; @@ -3290,12 +3281,6 @@ struct Convolution3dLayerBuilder { void add_descriptor(flatbuffers::Offset<armnnSerializer::Convolution3dDescriptor> descriptor) { fbb_.AddOffset(Convolution3dLayer::VT_DESCRIPTOR, descriptor); } - void add_weights(flatbuffers::Offset<armnnSerializer::ConstTensor> weights) { - fbb_.AddOffset(Convolution3dLayer::VT_WEIGHTS, weights); - } - void add_biases(flatbuffers::Offset<armnnSerializer::ConstTensor> biases) { - fbb_.AddOffset(Convolution3dLayer::VT_BIASES, biases); - } explicit Convolution3dLayerBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -3311,12 +3296,8 @@ struct Convolution3dLayerBuilder { inline flatbuffers::Offset<Convolution3dLayer> CreateConvolution3dLayer( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset<armnnSerializer::LayerBase> base = 0, - flatbuffers::Offset<armnnSerializer::Convolution3dDescriptor> descriptor = 0, - flatbuffers::Offset<armnnSerializer::ConstTensor> weights = 0, - flatbuffers::Offset<armnnSerializer::ConstTensor> biases = 0) { + flatbuffers::Offset<armnnSerializer::Convolution3dDescriptor> descriptor = 0) { Convolution3dLayerBuilder builder_(_fbb); - builder_.add_biases(biases); - builder_.add_weights(weights); builder_.add_descriptor(descriptor); builder_.add_base(base); return builder_.Finish(); diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp index 7e1b74e10d..84a9d53b69 100644 --- a/src/armnnSerializer/Serializer.cpp +++ b/src/armnnSerializer/Serializer.cpp @@ -388,18 +388,15 @@ void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLa CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer); } -// Build FlatBuffer for Convolution2dLayer +// Build FlatBuffer for Convolution3dLayer void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer, const armnn::Convolution3dDescriptor& descriptor, - const std::vector<armnn::ConstTensor>& constants, const char* name) { IgnoreUnused(name); - const armnn::ConstTensor weights = constants[0]; - // Create FlatBuffer BaseLayer - auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d); + auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d); auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder, descriptor.m_PadLeft, @@ -416,21 +413,11 @@ void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLa descriptor.m_DilationZ, descriptor.m_BiasEnabled, GetFlatBufferDataLayout(descriptor.m_DataLayout)); - auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights); - flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo; - - if (constants.size() > 1) - { - const armnn::ConstTensor biases = constants[1]; - flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases); - } - // Create the FlatBuffer Convolution2dLayer + // Create the FlatBuffer Convolution3dLayer auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder, flatBufferBaseLayer, - flatBufferDescriptor, - flatBufferWeightsConstTensorInfo, - flatBufferBiasesConstTensorInfo); + flatBufferDescriptor); // Add the AnyLayer to the FlatBufferLayers CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer); @@ -2038,7 +2025,6 @@ void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer, static_cast<const armnn::Convolution3dDescriptor&>(descriptor); SerializeConvolution3dLayer(layer, layerDescriptor, - constants, name); break; } diff --git a/src/armnnSerializer/Serializer.hpp b/src/armnnSerializer/Serializer.hpp index 2f827ac059..1c0a9a619f 100644 --- a/src/armnnSerializer/Serializer.hpp +++ b/src/armnnSerializer/Serializer.hpp @@ -150,7 +150,6 @@ private: void SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer, const armnn::Convolution3dDescriptor& descriptor, - const std::vector<armnn::ConstTensor>& constants, const char* name = nullptr); void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer, diff --git a/src/armnnSerializer/SerializerUtils.cpp b/src/armnnSerializer/SerializerUtils.cpp index fca6db8449..5ad27715c4 100644 --- a/src/armnnSerializer/SerializerUtils.cpp +++ b/src/armnnSerializer/SerializerUtils.cpp @@ -99,6 +99,8 @@ armnnSerializer::DataLayout GetFlatBufferDataLayout(armnn::DataLayout dataLayout return armnnSerializer::DataLayout::DataLayout_NHWC; case armnn::DataLayout::NDHWC: return armnnSerializer::DataLayout::DataLayout_NDHWC; + case armnn::DataLayout::NCDHW: + return armnnSerializer::DataLayout::DataLayout_NCDHW; case armnn::DataLayout::NCHW: default: return armnnSerializer::DataLayout::DataLayout_NCHW; diff --git a/src/armnnSerializer/test/SerializerTestUtils.hpp b/src/armnnSerializer/test/SerializerTestUtils.hpp index c6f148b1a1..ce4d2cc330 100644 --- a/src/armnnSerializer/test/SerializerTestUtils.hpp +++ b/src/armnnSerializer/test/SerializerTestUtils.hpp @@ -69,6 +69,7 @@ public: { case armnn::LayerType::Input: break; case armnn::LayerType::Output: break; + case armnn::LayerType::Constant: break; default: { VerifyNameAndConnections(layer, name); diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp index f2c9852607..2bffe0b9fd 100644 --- a/src/armnnSerializer/test/SerializerTests.cpp +++ b/src/armnnSerializer/test/SerializerTests.cpp @@ -472,25 +472,26 @@ TEST_CASE("SerializeConvolution3d") armnn::INetworkPtr network = armnn::INetwork::Create(); armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0); - armnn::IConnectableLayer* const convLayer = - network->AddConvolution3dLayer(descriptor, - weights, - armnn::Optional<armnn::ConstTensor>(biases), - layerName.c_str()); + armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights"); + armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases"); + armnn::IConnectableLayer* const convLayer = network->AddConvolution3dLayer(descriptor, layerName.c_str()); armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0); inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0)); + weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1)); + biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2)); convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo); + weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo); + biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo); convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo); armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network)); CHECK(deserializedNetwork); - const std::vector<armnn::ConstTensor>& constants {weights, biases}; - LayerVerifierBaseWithDescriptorAndConstants<armnn::Convolution3dDescriptor> verifier( - layerName, {inputInfo}, {outputInfo}, descriptor, constants); + LayerVerifierBaseWithDescriptor<armnn::Convolution3dDescriptor> verifier( + layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor); deserializedNetwork->ExecuteStrategy(verifier); } |