From 5d7b0a314b3e354a6cbcf15f5dd78b50f1e02774 Mon Sep 17 00:00:00 2001 From: Matthew Sloyan Date: Mon, 18 Oct 2021 13:07:49 +0100 Subject: 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 Change-Id: I10cdd354ca5f1c748730f92ffdb36bf810f83c8e --- src/backends/reference/workloads/Conv3dImpl.cpp | 47 +++++++++++++++++----- .../workloads/RefConvolution3dWorkload.cpp | 33 ++++++++++----- .../workloads/RefConvolution3dWorkload.hpp | 4 +- 3 files changed, 63 insertions(+), 21 deletions(-) (limited to 'src/backends/reference/workloads') diff --git a/src/backends/reference/workloads/Conv3dImpl.cpp b/src/backends/reference/workloads/Conv3dImpl.cpp index 484d887cfc..1c06d624a8 100644 --- a/src/backends/reference/workloads/Conv3dImpl.cpp +++ b/src/backends/reference/workloads/Conv3dImpl.cpp @@ -113,11 +113,25 @@ void Convolve3d(const TensorShape& rInputShape, // Keep this implementation, as using DataLayoutIndexed::GetIndex // causes large performance regression. - inputIndex = batchIdx * inputDepth * inputHeight * inputWidth * inChannels + - (zInput-paddingFront) * inputHeight * inputWidth * inChannels + - (yInput-paddingTop) * inputWidth * inChannels + - (xInput-paddingLeft) * inChannels + - cInput; + if (dataLayoutIndexed.GetDataLayout() == DataLayout::NDHWC) + { + inputIndex = + batchIdx * inputDepth * inputHeight * inputWidth * inChannels + + (zInput-paddingFront) * inputHeight * inputWidth * inChannels + + (yInput-paddingTop) * inputWidth * inChannels + + (xInput-paddingLeft) * inChannels + + cInput; + } + else + { + // NCDHW DataLayout + inputIndex = + batchIdx * inputDepth * inputHeight * inputWidth * inChannels + + inputDepth * inputHeight * inputWidth * cInput + + (zInput-paddingFront) * inputHeight * inputWidth + + (yInput-paddingTop) * inputWidth + + xInput-paddingLeft; + } inputValue = inputVec[inputIndex]; } @@ -133,11 +147,24 @@ void Convolve3d(const TensorShape& rInputShape, sum += biasVec[cOutput]; } - unsigned int outIdx = batchIdx * outputDepth * outputHeight * outputWidth * outChannels + - zOutput * outputHeight * outputWidth * outChannels + - yOutput * outputWidth * outChannels + - xOutput * outChannels + - cOutput; + unsigned int outIdx; + if (dataLayoutIndexed.GetDataLayout() == DataLayout::NDHWC) + { + outIdx = batchIdx * outputDepth * outputHeight * outputWidth * outChannels + + zOutput * outputHeight * outputWidth * outChannels + + yOutput * outputWidth * outChannels + + xOutput * outChannels + + cOutput; + } + else + { + // NCDHW DataLayout + outIdx = batchIdx * outputDepth * outputHeight * outputWidth * outChannels + + cOutput * outputDepth * outputHeight * outputWidth + + zOutput * outputHeight * outputWidth + + yOutput * outputWidth + + xOutput; + } rOutputEncoder[outIdx]; rOutputEncoder.Set(sum); diff --git a/src/backends/reference/workloads/RefConvolution3dWorkload.cpp b/src/backends/reference/workloads/RefConvolution3dWorkload.cpp index ea425daec9..afab88f0a8 100644 --- a/src/backends/reference/workloads/RefConvolution3dWorkload.cpp +++ b/src/backends/reference/workloads/RefConvolution3dWorkload.cpp @@ -19,10 +19,10 @@ RefConvolution3dWorkload::RefConvolution3dWorkload( WorkloadInfo detailsInfo; detailsInfo.m_InputTensorInfos = info.m_InputTensorInfos; detailsInfo.m_OutputTensorInfos = info.m_OutputTensorInfos; - detailsInfo.m_WeightsTensorInfo = armnn::Optional(descriptor.m_Weight->GetTensorInfo()); + detailsInfo.m_WeightsTensorInfo = armnn::Optional(info.m_InputTensorInfos[1]); if (descriptor.m_Parameters.m_BiasEnabled) { - detailsInfo.m_BiasTensorInfo = armnn::Optional(descriptor.m_Bias->GetTensorInfo()); + detailsInfo.m_BiasTensorInfo = armnn::Optional(info.m_InputTensorInfos[2]); } // Report Profiling Details @@ -30,18 +30,25 @@ RefConvolution3dWorkload::RefConvolution3dWorkload( descriptor.m_Parameters, detailsInfo, this->GetGuid()); +} - m_Weight = std::make_unique(*( descriptor.m_Weight )); - const TensorInfo& rFilterInfo = m_Weight->GetTensorInfo(); +void RefConvolution3dWorkload::PostAllocationConfigure() +{ + PostAllocationConfigure(m_Data.m_Inputs, m_Data.m_Outputs); +} +void RefConvolution3dWorkload::PostAllocationConfigure(std::vector inputs, + std::vector outputs) +{ + IgnoreUnused(outputs); + const TensorInfo& rFilterInfo = GetTensorInfo(inputs[1]); m_FilterShape = rFilterInfo.GetShape(); - m_FilterDecoder = MakeDecoder(rFilterInfo, m_Weight.get()->Map(true)); + m_FilterDecoder = MakeDecoder(rFilterInfo); - if ( descriptor.m_Parameters.m_BiasEnabled ) + if (m_Data.m_Parameters.m_BiasEnabled) { - m_Bias = std::make_unique(*( descriptor.m_Bias )); - const TensorInfo& biasInfo = m_Bias->GetTensorInfo(); - m_BiasDecoder = MakeDecoder(biasInfo, m_Bias->Map(true)); + const TensorInfo& biasInfo = GetTensorInfo(inputs[2]); + m_BiasDecoder = MakeDecoder(biasInfo); } } @@ -52,6 +59,8 @@ void RefConvolution3dWorkload::Execute() const void RefConvolution3dWorkload::ExecuteAsync(WorkingMemDescriptor& workingMemDescriptor) { + PostAllocationConfigure(workingMemDescriptor.m_Inputs, workingMemDescriptor.m_Outputs); + Execute(workingMemDescriptor.m_Inputs, workingMemDescriptor.m_Outputs); } @@ -65,6 +74,12 @@ void RefConvolution3dWorkload::Execute(std::vector inputs, std:: const TensorShape& inputShape = GetTensorInfo(inputs[0]).GetShape(); const TensorShape& outputShape = GetTensorInfo(outputs[0]).GetShape(); + m_FilterDecoder->Reset(inputs[1]->Map()); + if (m_Data.m_Parameters.m_BiasEnabled) + { + m_BiasDecoder->Reset(inputs[2]->Map()); + } + Convolve3d(inputShape, *inputDecoder, outputShape, *outputEncoder, m_FilterShape, *m_FilterDecoder, m_Data.m_Parameters.m_BiasEnabled, m_BiasDecoder.get(), m_Data.m_Parameters.m_DataLayout, diff --git a/src/backends/reference/workloads/RefConvolution3dWorkload.hpp b/src/backends/reference/workloads/RefConvolution3dWorkload.hpp index 0373a8b900..4d97512095 100644 --- a/src/backends/reference/workloads/RefConvolution3dWorkload.hpp +++ b/src/backends/reference/workloads/RefConvolution3dWorkload.hpp @@ -19,14 +19,14 @@ public: explicit RefConvolution3dWorkload(const Convolution3dQueueDescriptor& descriptor, const WorkloadInfo& info); + void PostAllocationConfigure() override; void Execute() const override; void ExecuteAsync(WorkingMemDescriptor& workingMemDescriptor) override; private: + void PostAllocationConfigure(std::vector inputs, std::vector outputs); void Execute(std::vector inputs, std::vector outputs) const; - std::unique_ptr m_Weight; - std::unique_ptr m_Bias; std::unique_ptr> m_FilterDecoder; std::unique_ptr> m_BiasDecoder; -- cgit v1.2.1