ArmNN
 21.05
OptimizationViewsTests.cpp File Reference
#include "CommonTestUtils.hpp"
#include "MockBackend.hpp"
#include <armnn/backends/OptimizationViews.hpp>
#include <armnn/utility/PolymorphicDowncast.hpp>
#include <Graph.hpp>
#include <Network.hpp>
#include <SubgraphView.hpp>
#include <SubgraphViewSelector.hpp>
#include <boost/test/unit_test.hpp>

Go to the source code of this file.

Functions

void CheckLayers (Graph &graph)
 
 BOOST_AUTO_TEST_CASE (OptimizedViewsSubgraphLayerCount)
 
 BOOST_AUTO_TEST_CASE (OptimizedViewsSubgraphLayerCountFailValidate)
 
 BOOST_AUTO_TEST_CASE (OptimizeViewsValidateDeviceMockBackend)
 

Function Documentation

◆ BOOST_AUTO_TEST_CASE() [1/3]

BOOST_AUTO_TEST_CASE ( OptimizedViewsSubgraphLayerCount  )

Definition at line 55 of file OptimizationViewsTests.cpp.

References OptimizationViews::AddFailedSubgraph(), Graph::AddLayer(), OptimizationViews::AddSubstitution(), OptimizationViews::AddUntouchedSubgraph(), OutputSlot::Connect(), CreateInputsFrom(), CreateOutputsFrom(), CreateSubgraphViewFrom(), OptimizationViews::GetGraph(), Layer::GetInputSlot(), Layer::GetOutputSlot(), Graph::SubstituteSubgraph(), and OptimizationViews::Validate().

56 {
57  OptimizationViews view;
58  // Construct a graph with 3 layers
59  Graph& baseGraph = view.GetGraph();
60 
61  Layer* const inputLayer = baseGraph.AddLayer<InputLayer>(0, "input");
62 
63  Convolution2dDescriptor convDescriptor;
64  PreCompiledDescriptor substitutionLayerDescriptor(1, 1);
65  Layer* const convLayer1 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv1");
66  Layer* const convLayer2 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv2");
67  Layer* const substitutableCompiledLayer =
68  baseGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
69 
70  Layer* const outputLayer = baseGraph.AddLayer<OutputLayer>(0, "output");
71 
72  inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0));
73  convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0));
74  convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
75 
76  // Subgraph for a failed layer
79  CreateOutputsFrom({convLayer1}),
80  {convLayer1});
81  // Subgraph for an untouched layer
82  SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph =
84  CreateOutputsFrom({convLayer2}),
85  {convLayer2});
86  // Subgraph for a substitutable layer
87  SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph =
89  CreateOutputsFrom({convLayer2}),
90  {substitutableCompiledLayer});
91  // Create a Graph containing a layer to substitute in
92  Graph substitutableGraph;
93  Layer* const substitutionpreCompiledLayer =
94  substitutableGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
95 
96  // Subgraph for a substitution layer
97  SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph =
98  CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}),
99  CreateOutputsFrom({substitutionpreCompiledLayer}),
100  {substitutionpreCompiledLayer});
101 
102  // Sub in the graph
103  baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph);
104 
105  view.AddFailedSubgraph(SubgraphView(*failedSubgraph));
106  view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph));
107 
110  CreateOutputsFrom({convLayer2}),
111  {substitutionpreCompiledLayer});
112  view.AddSubstitution({*baseSubgraph, *substitutionSubgraph});
113 
114  // Construct original subgraph to compare against
115  SubgraphViewSelector::SubgraphViewPtr originalSubgraph =
117  CreateOutputsFrom({convLayer2}),
118  {convLayer1, convLayer2, substitutionpreCompiledLayer});
119 
120  BOOST_CHECK(view.Validate(*originalSubgraph));
121 }
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
Definition: Graph.hpp:402
A Convolution2dDescriptor for the Convolution2dLayer.
int Connect(InputSlot &destination)
Definition: Layer.cpp:83
void AddSubstitution(SubstitutionPair &&substitution)
The SubgraphView class represents a subgraph of a Graph.
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
Definition: Layer.hpp:316
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: OutputLayer.hpp:13
SubgraphView::InputSlots CreateInputsFrom(const std::vector< Layer *> &layers)
void AddFailedSubgraph(SubgraphView &&subgraph)
bool Validate(const SubgraphView &originalSubgraph) const
void AddUntouchedSubgraph(SubgraphView &&subgraph)
void SubstituteSubgraph(SubgraphView &subgraph, IConnectableLayer *substituteLayer)
Substitutes the given sub-graph with either a new layer or a new sub-graph.
Definition: Graph.cpp:432
std::unique_ptr< SubgraphView > SubgraphViewPtr
SubgraphView::SubgraphViewPtr CreateSubgraphViewFrom(SubgraphView::InputSlots &&inputs, SubgraphView::OutputSlots &&outputs, SubgraphView::Layers &&layers)
SubgraphView::OutputSlots CreateOutputsFrom(const std::vector< Layer *> &layers)
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: InputLayer.hpp:13
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
Definition: Layer.hpp:318
This layer represents a convolution 2d operation.
A PreCompiledDescriptor for the PreCompiledLayer.

◆ BOOST_AUTO_TEST_CASE() [2/3]

BOOST_AUTO_TEST_CASE ( OptimizedViewsSubgraphLayerCountFailValidate  )

Definition at line 123 of file OptimizationViewsTests.cpp.

References Graph::AddLayer(), OptimizationViews::AddSubstitution(), OptimizationViews::AddUntouchedSubgraph(), OutputSlot::Connect(), CreateInputsFrom(), CreateOutputsFrom(), CreateSubgraphViewFrom(), OptimizationViews::GetGraph(), Layer::GetInputSlot(), Layer::GetOutputSlot(), Graph::SubstituteSubgraph(), and OptimizationViews::Validate().

124 {
125  OptimizationViews view;
126  // Construct a graph with 3 layers
127  Graph& baseGraph = view.GetGraph();
128 
129  Layer* const inputLayer = baseGraph.AddLayer<InputLayer>(0, "input");
130 
131  Convolution2dDescriptor convDescriptor;
132  PreCompiledDescriptor substitutionLayerDescriptor(1, 1);
133  Layer* const convLayer1 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv1");
134  Layer* const convLayer2 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv2");
135  Layer* const substitutableCompiledLayer =
136  baseGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
137 
138  Layer* const outputLayer = baseGraph.AddLayer<OutputLayer>(0, "output");
139 
140  inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0));
141  convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0));
142  convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
143 
144  // Subgraph for an untouched layer
145  SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph =
147  CreateOutputsFrom({convLayer2}),
148  {convLayer2});
149  // Subgraph for a substitutable layer
150  SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph =
152  CreateOutputsFrom({convLayer2}),
153  {substitutableCompiledLayer});
154  // Create a Graph containing a layer to substitute in
155  Graph substitutableGraph;
156  Layer* const substitutionpreCompiledLayer =
157  substitutableGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
158 
159  // Subgraph for a substitution layer
160  SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph =
161  CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}),
162  CreateOutputsFrom({substitutionpreCompiledLayer}),
163  {substitutionpreCompiledLayer});
164 
165  // Sub in the graph
166  baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph);
167 
168  view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph));
169 
172  CreateOutputsFrom({convLayer2}),
173  {substitutionpreCompiledLayer});
174  view.AddSubstitution({*baseSubgraph, *substitutionSubgraph});
175 
176  // Construct original subgraph to compare against
177  SubgraphViewSelector::SubgraphViewPtr originalSubgraph =
179  CreateOutputsFrom({convLayer2}),
180  {convLayer1, convLayer2, substitutionpreCompiledLayer});
181 
182  // Validate should fail as convLayer1 is not counted
183  BOOST_CHECK(!view.Validate(*originalSubgraph));
184 }
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
Definition: Graph.hpp:402
A Convolution2dDescriptor for the Convolution2dLayer.
int Connect(InputSlot &destination)
Definition: Layer.cpp:83
void AddSubstitution(SubstitutionPair &&substitution)
The SubgraphView class represents a subgraph of a Graph.
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
Definition: Layer.hpp:316
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: OutputLayer.hpp:13
SubgraphView::InputSlots CreateInputsFrom(const std::vector< Layer *> &layers)
bool Validate(const SubgraphView &originalSubgraph) const
void AddUntouchedSubgraph(SubgraphView &&subgraph)
void SubstituteSubgraph(SubgraphView &subgraph, IConnectableLayer *substituteLayer)
Substitutes the given sub-graph with either a new layer or a new sub-graph.
Definition: Graph.cpp:432
std::unique_ptr< SubgraphView > SubgraphViewPtr
SubgraphView::SubgraphViewPtr CreateSubgraphViewFrom(SubgraphView::InputSlots &&inputs, SubgraphView::OutputSlots &&outputs, SubgraphView::Layers &&layers)
SubgraphView::OutputSlots CreateOutputsFrom(const std::vector< Layer *> &layers)
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: InputLayer.hpp:13
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
Definition: Layer.hpp:318
This layer represents a convolution 2d operation.
A PreCompiledDescriptor for the PreCompiledLayer.

◆ BOOST_AUTO_TEST_CASE() [3/3]

BOOST_AUTO_TEST_CASE ( OptimizeViewsValidateDeviceMockBackend  )

Definition at line 186 of file OptimizationViewsTests.cpp.

References BOOST_AUTO_TEST_SUITE_END(), CheckLayers(), IOutputSlot::Connect(), IRuntime::Create(), INetwork::Create(), armnn::Float32, armnn::GetGraphForTesting(), MockBackend::GetIdStatic(), IConnectableLayer::GetInputSlot(), IConnectableLayer::GetOutputSlot(), armnn::Optimize(), and IOutputSlot::SetTensorInfo().

187 {
188  // build up the structure of the network
190 
191  armnn::IConnectableLayer* input = net->AddInputLayer(0, "inLayer0");
192  armnn::IConnectableLayer* input1 = net->AddInputLayer(1, "inLayer1");
193 
194  armnn::IConnectableLayer* addition = net->AddAdditionLayer("addLayer");
195 
196  armnn::IConnectableLayer* output = net->AddOutputLayer(0, "outLayer");
197 
198  input->GetOutputSlot(0).Connect(addition->GetInputSlot(0));
199  input1->GetOutputSlot(0).Connect(addition->GetInputSlot(1));
200  addition->GetOutputSlot(0).Connect(output->GetInputSlot(0));
201 
205 
206  armnn::MockBackendInitialiser initialiser;
209 
210  std::vector<armnn::BackendId> backends = { MockBackend().GetIdStatic() };
211  armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
212  BOOST_CHECK(optNet);
213 
214  // Check the optimised graph
215  armnn::Graph& graph = GetGraphForTesting(optNet.get());
216  CheckLayers(graph);
217 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:37
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:62
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:28
void CheckLayers(Graph &graph)
virtual void SetTensorInfo(const TensorInfo &tensorInfo)=0
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
Definition: Network.cpp:1568
static const BackendId & GetIdStatic()
Definition: MockBackend.cpp:88
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:174
Graph & GetGraphForTesting(IOptimizedNetwork *optNet)
Definition: TestUtils.cpp:25
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:173
virtual int Connect(IInputSlot &destination)=0
static INetworkPtr Create(NetworkOptions networkOptions={})
Definition: Network.cpp:529

◆ CheckLayers()

void CheckLayers ( Graph graph)

Definition at line 22 of file OptimizationViewsTests.cpp.

References BOOST_AUTO_TEST_SUITE(), armnn::Input, armnn::Output, and armnn::PreCompiled.

Referenced by BOOST_AUTO_TEST_CASE(), and IDeserializer::GetNetworkOutputBindingInfo().

23 {
24  unsigned int m_inputLayerCount = 0, m_outputLayerCount = 0, m_addLayerCount = 0;
25  for(auto layer : graph)
26  {
27  switch(layer->GetType())
28  {
29  case LayerType::Input:
30  ++m_inputLayerCount;
31  BOOST_TEST((layer->GetName() == std::string("inLayer0") ||
32  layer->GetName() == std::string("inLayer1")));
33  break;
34  // The Addition layer should become a PreCompiled Layer after Optimisation
35  case LayerType::PreCompiled:
36  ++m_addLayerCount;
37  BOOST_TEST(layer->GetName() == "pre-compiled");
38  break;
39  case LayerType::Output:
40  ++m_outputLayerCount;
41  BOOST_TEST(layer->GetName() == "outLayer");
42  break;
43  default:
44  //Fail for anything else
45  BOOST_TEST(false);
46  }
47  }
48  BOOST_TEST(m_inputLayerCount == 2);
49  BOOST_TEST(m_outputLayerCount == 1);
50  BOOST_TEST(m_addLayerCount == 1);
51 }