From 6fba29488f6053cb28be4d7e7a99cf5ecd41c08f Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Tue, 18 Apr 2023 12:48:46 +0100 Subject: IVGCVSW-7454 Fix CpuAcc FC dynamic weights * Pass to ACL the flag for constant weights and bias in FC, conv and DWconv workloads Signed-off-by: Teresa Charlin Change-Id: Iae2810c8d1a402d4afc1e757846665315a80d3ea --- .../neon/workloads/NeonConvolution2dWorkload.cpp | 6 ++- .../workloads/NeonDepthwiseConvolutionWorkload.cpp | 6 ++- .../neon/workloads/NeonFullyConnectedWorkload.cpp | 52 ++++++++++++++++------ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp b/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp index 879bb747a1..3f69718e8f 100644 --- a/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp +++ b/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2017,2022 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2022-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -91,10 +91,14 @@ NeonConvolution2dWorkload::NeonConvolution2dWorkload( m_KernelTensor = std::make_unique(); BuildArmComputeTensor(*m_KernelTensor, info.m_InputTensorInfos[1], m_Data.m_Parameters.m_DataLayout); + m_KernelTensor->info()->set_are_values_constant(info.m_InputTensorInfos[1].IsConstant()); if (m_Data.m_Parameters.m_BiasEnabled) { m_BiasTensor = std::make_unique(); BuildArmComputeTensor(*m_BiasTensor, info.m_InputTensorInfos[2], m_Data.m_Parameters.m_DataLayout); + m_BiasTensor->info()->set_are_values_constant(info.m_InputTensorInfos[2].IsConstant()); + // We do not support dynamic bias + ARMNN_ASSERT(info.m_InputTensorInfos[2].IsConstant() == true); } arm_compute::PadStrideInfo padStrideInfo = BuildArmComputePadStrideInfo(m_Data.m_Parameters); diff --git a/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp b/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp index 00d9d3340e..518faab6c6 100644 --- a/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp +++ b/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2017,2022 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2022-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -95,9 +95,13 @@ NeonDepthwiseConvolutionWorkload::NeonDepthwiseConvolutionWorkload( arm_compute::ITensor& output = PolymorphicDowncast(m_Data.m_Outputs[0])->GetTensor(); arm_compute::ITensor& weights = PolymorphicDowncast(m_Data.m_Inputs[1])->GetTensor(); arm_compute::ITensor* biasesPtr = nullptr; + weights.info()->set_are_values_constant(info.m_InputTensorInfos[1].IsConstant()); if (m_Data.m_Parameters.m_BiasEnabled) { biasesPtr = &PolymorphicDowncast(m_Data.m_Inputs[2])->GetTensor(); + biasesPtr->info()->set_are_values_constant(info.m_InputTensorInfos[2].IsConstant()); + // We do not support dynamic bias + ARMNN_ASSERT(info.m_InputTensorInfos[2].IsConstant() == true); } arm_compute::ITensorInfo* weightsInfo = weights.info(); diff --git a/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp b/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp index 7bb23f870b..ee3de807e6 100644 --- a/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp +++ b/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2017,2022 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2022-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -63,15 +63,20 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue ACLMemManagerOnDemand& memoryManager) : NeonBaseWorkload(descriptor, info) { - m_Data.ValidateInputsOutputs("NeonFullyConnectedWorkload", 1, 1); + m_Data.ValidateInputsOutputs("NeonFullyConnectedWorkload", descriptor.m_Parameters.GetNumInputs(), 1); arm_compute::ITensor& input = PolymorphicDowncast(m_Data.m_Inputs[0])->GetTensor(); - arm_compute::ITensor& output = PolymorphicDowncast(m_Data.m_Outputs[0])->GetTensor(); - - // Copy the weights' tensor into arm_compute tensor. - m_WeightsTensor = std::make_unique(); + arm_compute::ITensor& weights = PolymorphicDowncast(m_Data.m_Inputs[1])->GetTensor(); m_WeightsTensorInfo = info.m_InputTensorInfos[1]; - BuildArmComputeTensor(*m_WeightsTensor, m_WeightsTensorInfo); + weights.info()->set_are_values_constant(m_WeightsTensorInfo.IsConstant()); + arm_compute::ITensor& output = PolymorphicDowncast(m_Data.m_Outputs[0])->GetTensor(); + if (m_WeightsTensorInfo.IsConstant()) + { + // Copy the weights' tensor into arm_compute tensor. + m_WeightsTensor = std::make_unique(); + BuildArmComputeTensor(*m_WeightsTensor, m_WeightsTensorInfo); + m_WeightsTensor->info()->set_are_values_constant(m_WeightsTensorInfo.IsConstant()); + } if (m_Data.m_Parameters.m_BiasEnabled) { @@ -79,6 +84,10 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue m_BiasesTensor = std::make_unique(); m_BiasesTensorInfo = info.m_InputTensorInfos[2]; BuildArmComputeTensor(*m_BiasesTensor, m_BiasesTensorInfo); + m_BiasesTensor->info()->set_are_values_constant(m_BiasesTensorInfo.IsConstant()); + + // We do not support dynamic bias + ARMNN_ASSERT(m_BiasesTensorInfo.IsConstant() == true); } const arm_compute::ActivationLayerInfo activationInfo = ConvertAdditionalInfoToAclActivationLayerInfo(descriptor); @@ -86,7 +95,14 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue ConvertFullyConnectedDescriptorToAclFullyConnectedLayerInfo(descriptor.m_Parameters, activationInfo); auto layer = std::make_unique(memoryManager); - layer->configure(&input, m_WeightsTensor.get(), m_BiasesTensor.get(), &output, fc_info); + if (m_WeightsTensorInfo.IsConstant()) + { + layer->configure(&input, m_WeightsTensor.get(), m_BiasesTensor.get(), &output, fc_info); + } + else + { + layer->configure(&input, &weights, m_BiasesTensor.get(), &output, fc_info); + } m_FullyConnectedLayer.reset(layer.release()); // Add details for profiling output @@ -105,8 +121,6 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue descriptor.m_Parameters, detailsInfo, this->GetGuid()); - - // Force Compute Library to perform the necessary copying and reshaping. } void NeonFullyConnectedWorkload::Execute() const @@ -115,15 +129,25 @@ void NeonFullyConnectedWorkload::Execute() const // The constant tensors may not be fully in place until the workload is Executed if (!prepared) { - InitializeArmComputeTensorData(*m_WeightsTensor, m_WeightsTensorInfo, m_Data.m_Inputs[1]); + if (m_WeightsTensorInfo.IsConstant()) + { + InitializeArmComputeTensorData(*m_WeightsTensor, m_WeightsTensorInfo, m_Data.m_Inputs[1]); + m_WeightsTensor->info()->set_are_values_constant(m_WeightsTensorInfo.IsConstant()); + } if (m_Data.m_Parameters.m_BiasEnabled) { InitializeArmComputeTensorData(*m_BiasesTensor, m_BiasesTensorInfo, m_Data.m_Inputs[2]); + m_BiasesTensor->info()->set_are_values_constant(m_BiasesTensorInfo.IsConstant()); + } + if (m_WeightsTensorInfo.IsConstant()) + { + FreeTensorIfUnused(m_WeightsTensor); + } + if (m_BiasesTensorInfo.IsConstant()) + { + FreeTensorIfUnused(m_BiasesTensor); } - m_FullyConnectedLayer->prepare(); - FreeTensorIfUnused(m_WeightsTensor); - FreeTensorIfUnused(m_BiasesTensor); prepared = true; } m_FullyConnectedLayer->run(); -- cgit v1.2.1