ArmNN
 20.02
OptimizationViewsTests.cpp File Reference
#include <boost/test/unit_test.hpp>
#include <Graph.hpp>
#include <SubgraphView.hpp>
#include <SubgraphViewSelector.hpp>
#include <armnn/backends/OptimizationViews.hpp>
#include <Network.hpp>
#include "CommonTestUtils.hpp"
#include "MockBackend.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 51 of file OptimizationViewsTests.cpp.

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

52 {
53  OptimizationViews view;
54  // Construct a graph with 3 layers
55  Graph& baseGraph = view.GetGraph();
56 
57  Layer* const inputLayer = baseGraph.AddLayer<InputLayer>(0, "input");
58 
59  Convolution2dDescriptor convDescriptor;
60  PreCompiledDescriptor substitutionLayerDescriptor(1, 1);
61  Layer* const convLayer1 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv1");
62  Layer* const convLayer2 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv2");
63  Layer* const substitutableCompiledLayer =
64  baseGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
65 
66  Layer* const outputLayer = baseGraph.AddLayer<OutputLayer>(0, "output");
67 
68  inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0));
69  convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0));
70  convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
71 
72  // Subgraph for a failed layer
75  CreateOutputsFrom({convLayer1}),
76  {convLayer1});
77  // Subgraph for an untouched layer
78  SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph =
80  CreateOutputsFrom({convLayer2}),
81  {convLayer2});
82  // Subgraph for a substitutable layer
83  SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph =
85  CreateOutputsFrom({convLayer2}),
86  {substitutableCompiledLayer});
87  // Create a Graph containing a layer to substitute in
88  Graph substitutableGraph;
89  Layer* const substitutionpreCompiledLayer =
90  substitutableGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
91 
92  // Subgraph for a substitution layer
93  SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph =
94  CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}),
95  CreateOutputsFrom({substitutionpreCompiledLayer}),
96  {substitutionpreCompiledLayer});
97 
98  // Sub in the graph
99  baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph);
100 
101  view.AddFailedSubgraph(SubgraphView(*failedSubgraph));
102  view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph));
103 
106  CreateOutputsFrom({convLayer2}),
107  {substitutionpreCompiledLayer});
108  view.AddSubstitution({*baseSubgraph, *substitutionSubgraph});
109 
110  // Construct original subgraph to compare against
111  SubgraphViewSelector::SubgraphViewPtr originalSubgraph =
113  CreateOutputsFrom({convLayer2}),
114  {convLayer1, convLayer2, substitutionpreCompiledLayer});
115 
116  BOOST_CHECK(view.Validate(*originalSubgraph));
117 }
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
Definition: Graph.hpp:397
A Convolution2dDescriptor for the Convolution2dLayer.
int Connect(InputSlot &destination)
Definition: Layer.cpp:79
void AddSubstitution(SubstitutionPair &&substitution)
BOOST_CHECK(profilingService.GetCurrentState()==ProfilingState::WaitingForAck)
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:310
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:396
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:312
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 119 of file OptimizationViewsTests.cpp.

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

120 {
121  OptimizationViews view;
122  // Construct a graph with 3 layers
123  Graph& baseGraph = view.GetGraph();
124 
125  Layer* const inputLayer = baseGraph.AddLayer<InputLayer>(0, "input");
126 
127  Convolution2dDescriptor convDescriptor;
128  PreCompiledDescriptor substitutionLayerDescriptor(1, 1);
129  Layer* const convLayer1 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv1");
130  Layer* const convLayer2 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv2");
131  Layer* const substitutableCompiledLayer =
132  baseGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
133 
134  Layer* const outputLayer = baseGraph.AddLayer<OutputLayer>(0, "output");
135 
136  inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0));
137  convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0));
138  convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
139 
140  // Subgraph for an untouched layer
141  SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph =
143  CreateOutputsFrom({convLayer2}),
144  {convLayer2});
145  // Subgraph for a substitutable layer
146  SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph =
148  CreateOutputsFrom({convLayer2}),
149  {substitutableCompiledLayer});
150  // Create a Graph containing a layer to substitute in
151  Graph substitutableGraph;
152  Layer* const substitutionpreCompiledLayer =
153  substitutableGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
154 
155  // Subgraph for a substitution layer
156  SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph =
157  CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}),
158  CreateOutputsFrom({substitutionpreCompiledLayer}),
159  {substitutionpreCompiledLayer});
160 
161  // Sub in the graph
162  baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph);
163 
164  view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph));
165 
168  CreateOutputsFrom({convLayer2}),
169  {substitutionpreCompiledLayer});
170  view.AddSubstitution({*baseSubgraph, *substitutionSubgraph});
171 
172  // Construct original subgraph to compare against
173  SubgraphViewSelector::SubgraphViewPtr originalSubgraph =
175  CreateOutputsFrom({convLayer2}),
176  {convLayer1, convLayer2, substitutionpreCompiledLayer});
177 
178  // Validate should fail as convLayer1 is not counted
179  BOOST_CHECK(!view.Validate(*originalSubgraph));
180 }
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
Definition: Graph.hpp:397
A Convolution2dDescriptor for the Convolution2dLayer.
int Connect(InputSlot &destination)
Definition: Layer.cpp:79
void AddSubstitution(SubstitutionPair &&substitution)
BOOST_CHECK(profilingService.GetCurrentState()==ProfilingState::WaitingForAck)
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:310
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:396
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:312
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 182 of file OptimizationViewsTests.cpp.

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

183 {
184  // build up the structure of the network
186 
187  armnn::IConnectableLayer* input = net->AddInputLayer(0, "inLayer0");
188  armnn::IConnectableLayer* input1 = net->AddInputLayer(1, "inLayer1");
189 
190  armnn::IConnectableLayer* addition = net->AddAdditionLayer("addLayer");
191 
192  armnn::IConnectableLayer* output = net->AddOutputLayer(0, "outLayer");
193 
194  input->GetOutputSlot(0).Connect(addition->GetInputSlot(0));
195  input1->GetOutputSlot(0).Connect(addition->GetInputSlot(1));
196  addition->GetOutputSlot(0).Connect(output->GetInputSlot(0));
197 
201 
202  armnn::MockBackendInitialiser initialiser;
205 
206  std::vector<armnn::BackendId> backends = { MockBackend().GetIdStatic() };
207  armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
208  BOOST_CHECK(optNet);
209 
210  // Check the optimised graph
211  OptimizedNetwork* optNetObjPtr = boost::polymorphic_downcast<OptimizedNetwork*>(optNet.get());
212  CheckLayers(optNetObjPtr->GetGraph());
213 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:32
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:24
void CheckLayers(Graph &graph)
BOOST_CHECK(profilingService.GetCurrentState()==ProfilingState::WaitingForAck)
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:890
static const BackendId & GetIdStatic()
Definition: MockBackend.cpp:91
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:566
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:101
virtual int Connect(IInputSlot &destination)=0
armnn::Runtime::CreationOptions::ExternalProfilingOptions options
static INetworkPtr Create()
Definition: Network.cpp:49

◆ CheckLayers()

void CheckLayers ( Graph graph)

Definition at line 18 of file OptimizationViewsTests.cpp.

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

Referenced by BOOST_AUTO_TEST_CASE().

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