aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadik Armagan <sadik.armagan@arm.com>2022-01-14 12:56:35 +0000
committerTeresaARM <teresa.charlinreyes@arm.com>2022-01-18 15:15:58 +0000
commit529195f3ae752192d5f205345235bf537f472cbc (patch)
tree2ee9dba45e0c181138725607133c6f4bf1a6828a
parent611c7fb97412230d5cefee047081455fb60db06c (diff)
downloadarmnn-529195f3ae752192d5f205345235bf537f472cbc.tar.gz
MLCE-736 'Adding support for TfLite Models'
* Added constant input supports for Pack/Stack, Concatenation operators * Added Int32 support to Pack/Stack operator on CpuRef * Removed unsupported operator from TfLite Delegate Signed-off-by: Sadik Armagan <sadik.armagan@arm.com> Change-Id: I64203e174300d23eedeb22bddefe07e931c4eff3
-rw-r--r--delegate/src/Control.hpp38
-rw-r--r--delegate/src/Pack.hpp10
-rw-r--r--delegate/src/armnn_delegate.cpp6
-rw-r--r--src/backends/backendsCommon/test/layerTests/StackTestImpl.cpp8
-rw-r--r--src/backends/backendsCommon/test/layerTests/StackTestImpl.hpp5
-rw-r--r--src/backends/reference/RefLayerSupport.cpp5
-rw-r--r--src/backends/reference/test/RefLayerTests.cpp1
7 files changed, 39 insertions, 34 deletions
diff --git a/delegate/src/Control.hpp b/delegate/src/Control.hpp
index a9645149b4..f20b9f0cc3 100644
--- a/delegate/src/Control.hpp
+++ b/delegate/src/Control.hpp
@@ -72,20 +72,8 @@ TfLiteStatus VisitConcatenationOperator(DelegateData& delegateData,
for (unsigned int i = 0; i < numInputs; ++i)
{
const TfLiteTensor& tfLiteInputTensor = tfLiteTensors[tfLiteNode->inputs->data[i]];
- if(!IsValid(&tfLiteInputTensor))
+ if (!IsValid(tfLiteContext, tfLiteInputTensor, tfLiteConcatOperatorCode, nodeIndex))
{
- TF_LITE_MAYBE_KERNEL_LOG(
- tfLiteContext,
- "TfLiteArmnnDelegate: Invalid input tensor in operator #%d node #%d: ",
- tfLiteConcatOperatorCode, nodeIndex);
- return kTfLiteError;
- }
- if (IsDynamicTensor(tfLiteInputTensor))
- {
- TF_LITE_MAYBE_KERNEL_LOG(
- tfLiteContext,
- "TfLiteArmnnDelegate: Dynamic input tensors are not supported in operator #%d node #%d: ",
- tfLiteConcatOperatorCode, nodeIndex);
return kTfLiteError;
}
@@ -101,20 +89,8 @@ TfLiteStatus VisitConcatenationOperator(DelegateData& delegateData,
[](armnn::TensorInfo& t)->const armnn::TensorInfo*{ return &t; });
const TfLiteTensor& tfLiteOutputTensor = tfLiteTensors[tfLiteNode->outputs->data[0]];
- if(!IsValid(&tfLiteOutputTensor))
+ if (!IsValid(tfLiteContext, tfLiteOutputTensor, tfLiteConcatOperatorCode, nodeIndex))
{
- TF_LITE_MAYBE_KERNEL_LOG(
- tfLiteContext,
- "TfLiteArmnnDelegate: Invalid output tensor in operator #%d node #%d: ",
- tfLiteConcatOperatorCode, nodeIndex);
- return kTfLiteError;
- }
- if (IsDynamicTensor(tfLiteOutputTensor))
- {
- TF_LITE_MAYBE_KERNEL_LOG(
- tfLiteContext,
- "TfLiteArmnnDelegate: Dynamic output tensors are not supported in operator #%d node #%d: ",
- tfLiteConcatOperatorCode, nodeIndex);
return kTfLiteError;
}
@@ -165,6 +141,16 @@ TfLiteStatus VisitConcatenationOperator(DelegateData& delegateData,
armnn::IConnectableLayer* concatenationLayer = delegateData.m_Network->AddConcatLayer(concatDescriptor);
ARMNN_ASSERT(concatenationLayer != nullptr);
+ // Connect the Constant Inputs
+ auto inputsTensorsProcess = ProcessInputs(concatenationLayer,
+ delegateData,
+ tfLiteContext,
+ tfLiteNode);
+ if (inputsTensorsProcess == kTfLiteError)
+ {
+ return inputsTensorsProcess;
+ }
+
armnn::IOutputSlot& outputSlot = concatenationLayer->GetOutputSlot(0);
outputSlot.SetTensorInfo(outputTensorInfo);
Connect(concatenationLayer, tfLiteNode, delegateData);
diff --git a/delegate/src/Pack.hpp b/delegate/src/Pack.hpp
index 59851cd637..5e93ba3f2a 100644
--- a/delegate/src/Pack.hpp
+++ b/delegate/src/Pack.hpp
@@ -99,6 +99,16 @@ TfLiteStatus VisitPackOperator(DelegateData& delegateData,
armnn::IConnectableLayer* layer = delegateData.m_Network->AddStackLayer(desc);
ARMNN_ASSERT(layer != nullptr);
+ // Connect the Constant Inputs
+ auto inputsTensorsProcess = ProcessInputs(layer,
+ delegateData,
+ tfLiteContext,
+ tfLiteNode);
+ if (inputsTensorsProcess == kTfLiteError)
+ {
+ return inputsTensorsProcess;
+ }
+
armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0);
outputSlot.SetTensorInfo(outputTensorInfo);
diff --git a/delegate/src/armnn_delegate.cpp b/delegate/src/armnn_delegate.cpp
index b18d234d69..ed19b72787 100644
--- a/delegate/src/armnn_delegate.cpp
+++ b/delegate/src/armnn_delegate.cpp
@@ -623,12 +623,6 @@ TfLiteStatus ArmnnSubgraph::VisitNode(DelegateData& delegateData,
tfLiteNode,
nodeIndex,
kTfLiteBuiltinGather);
- case kTfLiteBuiltinGatherNd:
- return VisitGatherOperator(delegateData,
- tfLiteContext,
- tfLiteNode,
- nodeIndex,
- kTfLiteBuiltinGatherNd);
case kTfLiteBuiltinGreater:
return VisitComparisonOperator(delegateData,
tfLiteContext,
diff --git a/src/backends/backendsCommon/test/layerTests/StackTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/StackTestImpl.cpp
index 252adb93ac..6911c868ad 100644
--- a/src/backends/backendsCommon/test/layerTests/StackTestImpl.cpp
+++ b/src/backends/backendsCommon/test/layerTests/StackTestImpl.cpp
@@ -633,4 +633,12 @@ LayerTestResult<armnn::Half, 4> StackFloat16Test(
inputData,
outputExpectedData
);
+}
+
+LayerTestResult<int32_t, 4> StackInt32Test(
+ armnn::IWorkloadFactory& workloadFactory,
+ const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+ const armnn::ITensorHandleFactory& tensorHandleFactory)
+{
+ return StackAxis0TestImpl<armnn::DataType::Signed32>(workloadFactory, memoryManager, tensorHandleFactory);
} \ No newline at end of file
diff --git a/src/backends/backendsCommon/test/layerTests/StackTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/StackTestImpl.hpp
index 96728cf975..9fae546495 100644
--- a/src/backends/backendsCommon/test/layerTests/StackTestImpl.hpp
+++ b/src/backends/backendsCommon/test/layerTests/StackTestImpl.hpp
@@ -46,3 +46,8 @@ LayerTestResult<armnn::Half, 4> StackFloat16Test(
armnn::IWorkloadFactory& workloadFactory,
const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
const armnn::ITensorHandleFactory& tensorHandleFactory);
+
+LayerTestResult<int32_t, 4> StackInt32Test(
+ armnn::IWorkloadFactory& workloadFactory,
+ const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+ const armnn::ITensorHandleFactory& tensorHandleFactory);
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp
index 0ac2ddc2a9..4d4f014671 100644
--- a/src/backends/reference/RefLayerSupport.cpp
+++ b/src/backends/reference/RefLayerSupport.cpp
@@ -2087,14 +2087,15 @@ bool RefLayerSupport::IsStackSupported(const std::vector<const TensorInfo*>& inp
IgnoreUnused(descriptor);
bool supported = true;
- std::array<DataType,6> supportedTypes =
+ std::array<DataType,7> supportedTypes =
{
DataType::BFloat16,
DataType::Float32,
DataType::Float16,
DataType::QAsymmS8,
DataType::QAsymmU8,
- DataType::QSymmS16
+ DataType::QSymmS16,
+ DataType::Signed32
};
supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported,
diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp
index 7755f4f231..69694e0275 100644
--- a/src/backends/reference/test/RefLayerTests.cpp
+++ b/src/backends/reference/test/RefLayerTests.cpp
@@ -2458,6 +2458,7 @@ ARMNN_AUTO_TEST_CASE_WITH_THF(StackOutput4DAxis3, StackOutput4DAxis3Float32Tes
ARMNN_AUTO_TEST_CASE_WITH_THF(StackOutput3DInputs3, StackOutput3DInputs3Float32Test)
ARMNN_AUTO_TEST_CASE_WITH_THF(StackOutput5D, StackOutput5DFloat32Test)
ARMNN_AUTO_TEST_CASE_WITH_THF(StackFloat16, StackFloat16Test)
+ARMNN_AUTO_TEST_CASE_WITH_THF(StackInt32, StackInt32Test)
// Neg
ARMNN_AUTO_TEST_CASE_WITH_THF(Neg2d, Neg2dTest<DataType::Float32>)