From b4dd5cc86d4eb841de670f0f102ede599e0d9c40 Mon Sep 17 00:00:00 2001 From: Keith Davis Date: Thu, 7 Apr 2022 11:32:00 +0100 Subject: IVGCVSW-6124 ConstTensorsAsInput: Conv2d - FrontEnd * Update Front-end and Tools. * Updated Serializer, Deserializer and unit tests to reflect this. * Updated TfLiteDelegate, TfLiteParser and OnnxParser. * Updated Ref. * Fixed resulting Neon / CL tests * Unified optimizers for conv2d ops * Optimizer Fix - Fp32ToBf16 * Partial implementation for ACL backends to fix VTS failures !android-nn-driver:7477 Signed-off-by: Keith Davis Change-Id: I5fb18877f7ee32643e15a9818945356274bb401b --- src/armnn/test/SubgraphViewTests.cpp | 72 +++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 17 deletions(-) (limited to 'src/armnn/test/SubgraphViewTests.cpp') diff --git a/src/armnn/test/SubgraphViewTests.cpp b/src/armnn/test/SubgraphViewTests.cpp index 048c4f51fd..d7465c8361 100644 --- a/src/armnn/test/SubgraphViewTests.cpp +++ b/src/armnn/test/SubgraphViewTests.cpp @@ -42,28 +42,44 @@ bool AreAnySubgraphLayersPresentInGraph(const SubgraphView::IConnectableLayers & // // this helper only works if all layers where the inputs connect to are not selected // -SubgraphView::InputSlots CreateInputsFrom(const std::vector& layers) +SubgraphView::InputSlots CreateInputsFrom(const std::vector& layers, + std::vector ignoreSlots = {}) { SubgraphView::InputSlots result; for (auto&& layer : layers) { for (auto&& it = layer->BeginInputSlots(); it != layer->EndInputSlots(); ++it) { - result.push_back(&(*it)); + if (std::find(ignoreSlots.begin(), ignoreSlots.end(), it->GetSlotIndex()) != ignoreSlots.end()) + { + continue; + } + else + { + result.push_back(&(*it)); + } } } return result; } /// Duplication for IConnectableLayer -SubgraphView::IInputSlots CreateIInputsFrom(const std::vector& layers) +SubgraphView::IInputSlots CreateIInputsFrom(const std::vector& layers, + std::vector ignoreSlots = {}) { SubgraphView::IInputSlots result; - for (auto&& layer : layers) + for (auto&& layer: layers) { - for (unsigned int i = 0 ; i < layer->GetNumInputSlots(); ++i) + for (unsigned int i = 0; i < layer->GetNumInputSlots(); ++i) { - result.push_back(&(layer->GetInputSlot(i))); + if (std::find(ignoreSlots.begin(), ignoreSlots.end(), i) != ignoreSlots.end()) + { + continue; + } + else + { + result.push_back(&(layer->GetInputSlot(i))); + } } } return result; @@ -241,7 +257,7 @@ TEST_CASE("SubgraphViewSlots") // Construct sub-graph SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom({}, - CreateIInputsFrom({convLayer1}), + CreateIInputsFrom({convLayer1}, {1, 2}), CreateIOutputsFrom({convLayer2})); // Test that both old and new are initialized @@ -327,17 +343,20 @@ TEST_CASE("SingleInputSingleOutput") Convolution2dDescriptor convDescriptor; Layer* const convLayer1 = graph.AddLayer(convDescriptor, "conv1"); Layer* const convLayer2 = graph.AddLayer(convDescriptor, "conv2"); - + Layer* const weightsLayer1 = graph.AddLayer("weights1"); + Layer* const weightsLayer2 = graph.AddLayer("weights2"); Layer* const outputLayer = graph.AddLayer(0, "output"); inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0)); + weightsLayer1->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(1)); convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0)); + weightsLayer2->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(1)); convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // Construct sub-graph SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom({}, - CreateIInputsFrom({convLayer1}), + CreateIInputsFrom({convLayer1}, {1}), CreateIOutputsFrom({convLayer2})); // Save sub-graph connections for comparison after substitution @@ -377,7 +396,7 @@ TEST_CASE("SingleInputSingleOutputAddPrecompiledLayerSubstituteSubgraph1") convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // Construct sub-graph - SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}, {1}), CreateOutputsFrom({convLayer2}), {}); @@ -421,7 +440,7 @@ TEST_CASE("SingleInputSingleOutputAddPrecompiledLayerSubstituteSubgraph2") convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // Construct sub-graph - SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}, {1}), CreateOutputsFrom({convLayer2}), {}); @@ -467,7 +486,7 @@ TEST_CASE("SingleInputSingleOutputSubstituteGraph") // Construct sub-graph SubgraphViewSelector::SubgraphViewPtr subgraph = - CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}, {1}), CreateOutputsFrom({convLayer2}), {}); @@ -519,7 +538,7 @@ TEST_CASE("MultiInputSingleOutput") concatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // Construct sub-graph - auto subgraph = CreateSubgraphViewFrom(CreateInputsFrom({convLayer1, convLayer2}), + auto subgraph = CreateSubgraphViewFrom(CreateInputsFrom({convLayer1, convLayer2}, {1}), CreateOutputsFrom({concatLayer}), {}); @@ -621,7 +640,7 @@ TEST_CASE("MultiInputMultiOutput") // Construct sub-graph SubgraphViewSelector::SubgraphViewPtr subgraph = - CreateSubgraphViewFrom(CreateInputsFrom({convLayer1, convLayer2}), + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1, convLayer2}, {1}), CreateOutputsFrom({convLayer1, convLayer2}), {}); @@ -942,7 +961,8 @@ TEST_CASE("MultipleSimpleSubgraphs") // This test case represents the scenario when we have two distinct subgraphs // in a simple linear network. The selected nodes are the M* and the // non-selected ones are the X* - // + // W2 ->-> + // | // X1 -> M1 -> M2 -> X2 -> M3 -> X3 // // The expected results is two subgraphs, one with {M1, M2} and another one @@ -952,12 +972,17 @@ TEST_CASE("MultipleSimpleSubgraphs") // the graph is constructed in reverse order auto x3 = graph.AddLayer(0, "output"); + auto m3 = graph.InsertNewLayer(x3->GetInputSlot(0), ActivationDescriptor{}, "m3"); + auto x2 = graph.InsertNewLayer(m3->GetInputSlot(0), - Convolution2dDescriptor{}, - "x2"); + Convolution2dDescriptor{}, + "x2"); + + auto w2 = graph.InsertNewLayer(x2->GetInputSlot(1), "w2"); + auto m2 = graph.InsertNewLayer(x2->GetInputSlot(0), ActivationDescriptor{}, "m2"); @@ -966,6 +991,7 @@ TEST_CASE("MultipleSimpleSubgraphs") "m1"); graph.InsertNewLayer(m1->GetInputSlot(0), 0, "x1"); + IgnoreUnused(w2); // All selected 'M*' layers will be of Activation type SubgraphViewSelector::Subgraphs subgraphs = SubgraphViewSelector::SelectSubgraphs( @@ -1636,10 +1662,17 @@ TEST_CASE("SingleSubgraph") Layer* const convLayer2 = graph.AddLayer(convDescriptor, "conv2"); convLayer2->SetBackendId(Compute::GpuAcc); + Layer* const weights1 = graph.AddLayer("weights1"); + weights1->SetBackendId(Compute::GpuAcc); + Layer* const weights2 = graph.AddLayer("weights2"); + weights2->SetBackendId(Compute::GpuAcc); + Layer* const outputLayer = graph.AddLayer(0, "output"); inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0)); + weights1->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(1)); convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0)); + weights2->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(1)); convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // GpuAcc sub graph selector @@ -1702,6 +1735,9 @@ TEST_CASE("MultipleSubgraphs") Layer* const convLayer1 = graph.AddLayer(convDescriptor, "conv1"); Layer* const convLayer2 = graph.AddLayer(convDescriptor, "conv2"); + Layer* const weights1 = graph.AddLayer("weights1"); + Layer* const weights2 = graph.AddLayer("weights2"); + OriginsDescriptor concatDescriptor(2); Layer* const pConcatLayer = graph.AddLayer(concatDescriptor, "concat"); pConcatLayer->SetBackendId(Compute::CpuAcc); @@ -1711,7 +1747,9 @@ TEST_CASE("MultipleSubgraphs") inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0)); splitterLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0)); splitterLayer->GetOutputSlot(1).Connect(convLayer2->GetInputSlot(0)); + weights1->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(1)); convLayer1->GetOutputSlot(0).Connect(pConcatLayer->GetInputSlot(0)); + weights2->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(1)); convLayer2->GetOutputSlot(0).Connect(pConcatLayer->GetInputSlot(1)); pConcatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); -- cgit v1.2.1