From 4422ceca976a88aac49b21808a43e465bc87a35e Mon Sep 17 00:00:00 2001 From: Finn Williams Date: Mon, 22 Mar 2021 17:51:06 +0000 Subject: Fix graph copy memory spike * Change layer storage of ConstTensors to std::shared_ptr * Change clone to share ConstTensor rather than copy * Remove uses of non-const GetTensor() call * Reduce scope of non-optimized network in ExeNet, so memory can be released after use Signed-off-by: Finn Williams Change-Id: Ibb2c7309d12411d21405bd6024c76bcdf5404545 --- .../reference/workloads/RefLstmWorkload.cpp | 42 +++++++++--------- .../reference/workloads/RefQLstmWorkload.cpp | 50 ++++++++++++---------- 2 files changed, 48 insertions(+), 44 deletions(-) (limited to 'src/backends') diff --git a/src/backends/reference/workloads/RefLstmWorkload.cpp b/src/backends/reference/workloads/RefLstmWorkload.cpp index 70b3443d88..7c37301d1d 100644 --- a/src/backends/reference/workloads/RefLstmWorkload.cpp +++ b/src/backends/reference/workloads/RefLstmWorkload.cpp @@ -110,27 +110,27 @@ void RefLstmWorkload::Execute() const std::unique_ptr> inputToInputWeightsTensor; std::unique_ptr> inputToForgetWeightsTensor = MakeDecoder( - m_InputToForgetWeightsTensor->GetTensorInfo(), m_InputToForgetWeightsTensor->GetTensor()); + m_InputToForgetWeightsTensor->GetTensorInfo(), m_InputToForgetWeightsTensor->GetConstTensor()); std::unique_ptr> inputToCellWeightsTensor = MakeDecoder( - m_InputToCellWeightsTensor->GetTensorInfo(), m_InputToCellWeightsTensor->GetTensor()); + m_InputToCellWeightsTensor->GetTensorInfo(), m_InputToCellWeightsTensor->GetConstTensor()); std::unique_ptr> inputToOutputWeightsTensor = MakeDecoder( - m_InputToOutputWeightsTensor->GetTensorInfo(), m_InputToOutputWeightsTensor->GetTensor()); + m_InputToOutputWeightsTensor->GetTensorInfo(), m_InputToOutputWeightsTensor->GetConstTensor()); std::unique_ptr> recurrentToInputWeightsTensor; std::unique_ptr> recurrentToForgetWeightsTensor = MakeDecoder( - m_RecurrentToForgetWeightsTensor->GetTensorInfo(), m_RecurrentToForgetWeightsTensor->GetTensor()); + m_RecurrentToForgetWeightsTensor->GetTensorInfo(), m_RecurrentToForgetWeightsTensor->GetConstTensor()); std::unique_ptr> recurrentToCellWeightsTensor = MakeDecoder( - m_RecurrentToCellWeightsTensor->GetTensorInfo(), m_RecurrentToCellWeightsTensor->GetTensor()); + m_RecurrentToCellWeightsTensor->GetTensorInfo(), m_RecurrentToCellWeightsTensor->GetConstTensor()); std::unique_ptr> recurrentToOutputWeightsTensor = MakeDecoder( - m_RecurrentToOutputWeightsTensor->GetTensorInfo(), m_RecurrentToOutputWeightsTensor->GetTensor()); + m_RecurrentToOutputWeightsTensor->GetTensorInfo(), m_RecurrentToOutputWeightsTensor->GetConstTensor()); std::unique_ptr> inputGateBiasTensor; std::unique_ptr> forgetGateBiasTensor = MakeDecoder( - m_ForgetGateBiasTensor->GetTensorInfo(), m_ForgetGateBiasTensor->GetTensor()); + m_ForgetGateBiasTensor->GetTensorInfo(), m_ForgetGateBiasTensor->GetConstTensor()); std::unique_ptr> cellBiasTensor = MakeDecoder( - m_CellBiasTensor->GetTensorInfo(), m_CellBiasTensor->GetTensor()); + m_CellBiasTensor->GetTensorInfo(), m_CellBiasTensor->GetConstTensor()); std::unique_ptr> outputGateBiasTensor = MakeDecoder( - m_OutputGateBiasTensor->GetTensorInfo(), m_OutputGateBiasTensor->GetTensor()); + m_OutputGateBiasTensor->GetTensorInfo(), m_OutputGateBiasTensor->GetConstTensor()); std::unique_ptr> cellToInputWeightsTensor; std::unique_ptr> cellToForgetWeightsTensor; @@ -149,48 +149,48 @@ void RefLstmWorkload::Execute() const if (!useCifg) { inputLayerNormWeights = MakeDecoder( - m_InputLayerNormWeights->GetTensorInfo(), m_InputLayerNormWeights->GetTensor()); + m_InputLayerNormWeights->GetTensorInfo(), m_InputLayerNormWeights->GetConstTensor()); } forgetLayerNormWeights = MakeDecoder( - m_ForgetLayerNormWeights->GetTensorInfo(), m_ForgetLayerNormWeights->GetTensor()); + m_ForgetLayerNormWeights->GetTensorInfo(), m_ForgetLayerNormWeights->GetConstTensor()); cellLayerNormWeights = MakeDecoder( - m_CellLayerNormWeights->GetTensorInfo(), m_CellLayerNormWeights->GetTensor()); + m_CellLayerNormWeights->GetTensorInfo(), m_CellLayerNormWeights->GetConstTensor()); outputLayerNormWeights = MakeDecoder( - m_OutputLayerNormWeights->GetTensorInfo(), m_OutputLayerNormWeights->GetTensor()); + m_OutputLayerNormWeights->GetTensorInfo(), m_OutputLayerNormWeights->GetConstTensor()); } if (!useCifg) { inputToInputWeightsTensor = MakeDecoder( - m_InputToInputWeightsTensor->GetTensorInfo(), m_InputToInputWeightsTensor->GetTensor()); + m_InputToInputWeightsTensor->GetTensorInfo(), m_InputToInputWeightsTensor->GetConstTensor()); inputGateBiasTensor = MakeDecoder( - m_InputGateBiasTensor->GetTensorInfo(), m_InputGateBiasTensor->GetTensor()); + m_InputGateBiasTensor->GetTensorInfo(), m_InputGateBiasTensor->GetConstTensor()); recurrentToInputWeightsTensor = MakeDecoder( - m_RecurrentToInputWeightsTensor->GetTensorInfo(), m_RecurrentToInputWeightsTensor->GetTensor()); + m_RecurrentToInputWeightsTensor->GetTensorInfo(), m_RecurrentToInputWeightsTensor->GetConstTensor()); } if (usePeephole) { cellToForgetWeightsTensor = MakeDecoder( - m_CellToForgetWeightsTensor->GetTensorInfo(), m_CellToForgetWeightsTensor->GetTensor()); + m_CellToForgetWeightsTensor->GetTensorInfo(), m_CellToForgetWeightsTensor->GetConstTensor()); cellToOutputWeightsTensor = MakeDecoder( - m_CellToOutputWeightsTensor->GetTensorInfo(), m_CellToOutputWeightsTensor->GetTensor()); + m_CellToOutputWeightsTensor->GetTensorInfo(), m_CellToOutputWeightsTensor->GetConstTensor()); } if (!useCifg && usePeephole) { cellToInputWeightsTensor = MakeDecoder( - m_CellToInputWeightsTensor->GetTensorInfo(), m_CellToInputWeightsTensor->GetTensor()); + m_CellToInputWeightsTensor->GetTensorInfo(), m_CellToInputWeightsTensor->GetConstTensor()); } if (m_Data.m_Parameters.m_ProjectionEnabled) { projectionWeightsTensor = MakeDecoder( - m_ProjectionWeightsTensor->GetTensorInfo(), m_ProjectionWeightsTensor->GetTensor()); + m_ProjectionWeightsTensor->GetTensorInfo(), m_ProjectionWeightsTensor->GetConstTensor()); if (m_ProjectionBiasTensor) { projectionBiasTensor = MakeDecoder( - m_ProjectionBiasTensor->GetTensorInfo(), m_ProjectionBiasTensor->GetTensor()); + m_ProjectionBiasTensor->GetTensorInfo(), m_ProjectionBiasTensor->GetConstTensor()); } } diff --git a/src/backends/reference/workloads/RefQLstmWorkload.cpp b/src/backends/reference/workloads/RefQLstmWorkload.cpp index e11ea55add..bcd6a627de 100644 --- a/src/backends/reference/workloads/RefQLstmWorkload.cpp +++ b/src/backends/reference/workloads/RefQLstmWorkload.cpp @@ -101,18 +101,20 @@ void RefQLstmWorkload::Execute() const // Weights decoders std::unique_ptr> inputToForgetWeightsDecoder = MakeDecoder( - m_InputToForgetWeightsTensor->GetTensorInfo(), m_InputToForgetWeightsTensor->GetTensor()); + m_InputToForgetWeightsTensor->GetTensorInfo(), m_InputToForgetWeightsTensor->GetConstTensor()); std::unique_ptr> inputToCellWeightsDecoder = MakeDecoder( - m_InputToCellWeightsTensor->GetTensorInfo(), m_InputToCellWeightsTensor->GetTensor()); + m_InputToCellWeightsTensor->GetTensorInfo(), m_InputToCellWeightsTensor->GetConstTensor()); std::unique_ptr> inputToOutputWeightsDecoder = MakeDecoder( - m_InputToOutputWeightsTensor->GetTensorInfo(), m_InputToOutputWeightsTensor->GetTensor()); + m_InputToOutputWeightsTensor->GetTensorInfo(), m_InputToOutputWeightsTensor->GetConstTensor()); std::unique_ptr> recurrentToForgetWeightsDecoder = MakeDecoder( - m_RecurrentToForgetWeightsTensor->GetTensorInfo(), m_RecurrentToForgetWeightsTensor->GetTensor()); + m_RecurrentToForgetWeightsTensor->GetTensorInfo(), + m_RecurrentToForgetWeightsTensor->GetConstTensor()); std::unique_ptr> recurrentToCellWeightsDecoder = MakeDecoder( - m_RecurrentToCellWeightsTensor->GetTensorInfo(), m_RecurrentToCellWeightsTensor->GetTensor()); + m_RecurrentToCellWeightsTensor->GetTensorInfo(), m_RecurrentToCellWeightsTensor->GetConstTensor()); std::unique_ptr> recurrentToOutputWeightsDecoder = MakeDecoder( - m_RecurrentToOutputWeightsTensor->GetTensorInfo(), m_RecurrentToOutputWeightsTensor->GetTensor()); + m_RecurrentToOutputWeightsTensor->GetTensorInfo(), + m_RecurrentToOutputWeightsTensor->GetConstTensor()); // Optional CIFG params std::unique_ptr> inputToInputWeightsDecoder; @@ -198,9 +200,9 @@ void RefQLstmWorkload::Execute() const if (!cifgEnabled) { inputToInputWeightsDecoder = MakeDecoder( - m_InputToInputWeightsTensor->GetTensorInfo(), m_InputToInputWeightsTensor->GetTensor()); - recurrentToInputWeightsDecoder = MakeDecoder( - m_RecurrentToInputWeightsTensor->GetTensorInfo(), m_RecurrentToInputWeightsTensor->GetTensor()); + m_InputToInputWeightsTensor->GetTensorInfo(), m_InputToInputWeightsTensor->GetConstTensor()); + recurrentToInputWeightsDecoder = MakeDecoder(m_RecurrentToInputWeightsTensor->GetTensorInfo(), + m_RecurrentToInputWeightsTensor->GetConstTensor()); } if (peepholeEnabled) @@ -208,22 +210,22 @@ void RefQLstmWorkload::Execute() const if (!cifgEnabled) { cellToInputWeightsDecoder = MakeDecoder( - m_CellToInputWeightsTensor->GetTensorInfo(), m_CellToInputWeightsTensor->GetTensor()); + m_CellToInputWeightsTensor->GetTensorInfo(), m_CellToInputWeightsTensor->GetConstTensor()); } cellToForgetWeightsDecoder = MakeDecoder( - m_CellToForgetWeightsTensor->GetTensorInfo(), m_CellToForgetWeightsTensor->GetTensor()); + m_CellToForgetWeightsTensor->GetTensorInfo(), m_CellToForgetWeightsTensor->GetConstTensor()); cellToOutputWeightsDecoder = MakeDecoder( - m_CellToOutputWeightsTensor->GetTensorInfo(), m_CellToOutputWeightsTensor->GetTensor()); + m_CellToOutputWeightsTensor->GetTensorInfo(), m_CellToOutputWeightsTensor->GetConstTensor()); } if (projectionEnabled) { projectionWeightsDecoder = MakeDecoder( - m_ProjectionWeightsTensor->GetTensorInfo(), m_ProjectionWeightsTensor->GetTensor()); + m_ProjectionWeightsTensor->GetTensorInfo(), m_ProjectionWeightsTensor->GetConstTensor()); if (m_ProjectionBiasTensor) { projectionBiasDecoder = MakeDecoder( - m_ProjectionBiasTensor->GetTensorInfo(), m_ProjectionBiasTensor->GetTensor()); + m_ProjectionBiasTensor->GetTensorInfo(), m_ProjectionBiasTensor->GetConstTensor()); } } @@ -231,38 +233,40 @@ void RefQLstmWorkload::Execute() const { if (!cifgEnabled) { - inputLayerNormWeightsDecoder = MakeDecoder( - m_InputLayerNormWeightsTensor->GetTensorInfo(), m_InputLayerNormWeightsTensor->GetTensor()); + inputLayerNormWeightsDecoder = MakeDecoder(m_InputLayerNormWeightsTensor->GetTensorInfo(), + m_InputLayerNormWeightsTensor->GetConstTensor()); // Bias only used if layer norm enabled armnn::TensorInfo inputGateBiasTensorInfo({outputSize}, armnn::DataType::Signed32, m_InputLayerNormWeightsTensor->GetTensorInfo().GetQuantizationScale() / 1024, 0); inputGateBiasDecoder = MakeDecoder( - inputGateBiasTensorInfo, m_InputGateBiasTensor->GetTensor()); + inputGateBiasTensorInfo, m_InputGateBiasTensor->GetConstTensor()); } forgetLayerNormWeightsDecoder = MakeDecoder( - m_ForgetLayerNormWeightsTensor->GetTensorInfo(), m_ForgetLayerNormWeightsTensor->GetTensor()); + m_ForgetLayerNormWeightsTensor->GetTensorInfo(), + m_ForgetLayerNormWeightsTensor->GetConstTensor()); cellLayerNormWeightsDecoder = MakeDecoder( - m_CellLayerNormWeightsTensor->GetTensorInfo(), m_CellLayerNormWeightsTensor->GetTensor()); + m_CellLayerNormWeightsTensor->GetTensorInfo(), m_CellLayerNormWeightsTensor->GetConstTensor()); outputLayerNormWeightsDecoder = MakeDecoder( - m_OutputLayerNormWeightsTensor->GetTensorInfo(), m_OutputLayerNormWeightsTensor->GetTensor()); + m_OutputLayerNormWeightsTensor->GetTensorInfo(), + m_OutputLayerNormWeightsTensor->GetConstTensor()); // Bias only used if layer norm enabled armnn::TensorInfo forgetGateBiasTensorInfo({outputSize}, armnn::DataType::Signed32, m_ForgetLayerNormWeightsTensor->GetTensorInfo().GetQuantizationScale() / 1024, 0); forgetGateBiasDecoder = MakeDecoder( - forgetGateBiasTensorInfo, m_ForgetGateBiasTensor->GetTensor()); + forgetGateBiasTensorInfo, m_ForgetGateBiasTensor->GetConstTensor()); armnn::TensorInfo cellGateBiasTensorInfo({outputSize}, armnn::DataType::Signed32, m_CellLayerNormWeightsTensor->GetTensorInfo().GetQuantizationScale() / 1024, 0); cellGateBiasDecoder = MakeDecoder( - cellGateBiasTensorInfo, m_CellBiasTensor->GetTensor()); + cellGateBiasTensorInfo, m_CellBiasTensor->GetConstTensor()); armnn::TensorInfo outputGateBiasTensorInfo({outputSize}, armnn::DataType::Signed32, m_OutputLayerNormWeightsTensor->GetTensorInfo().GetQuantizationScale() / 1024, 0); outputGateBiasDecoder = MakeDecoder( - outputGateBiasTensorInfo, m_OutputGateBiasTensor->GetTensor()); + outputGateBiasTensorInfo, m_OutputGateBiasTensor->GetConstTensor()); } // Initialize internal state tensors with zeroes. -- cgit v1.2.1