ArmNN
 20.05
RefOptimizedNetworkTests.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include <Graph.hpp>
7 #include <Network.hpp>
8 
10 
11 #include <boost/test/unit_test.hpp>
12 #include <test/GraphUtils.hpp>
13 
14 BOOST_AUTO_TEST_SUITE(RefOptimizedNetwork)
15 
16 BOOST_AUTO_TEST_CASE(OptimizeValidateCpuRefWorkloads)
17 {
18  const armnn::TensorInfo desc({3, 5}, armnn::DataType::Float32);
19 
20  armnn::Network net;
21 
24 
25  // in
26  // |
27  // nm
28  // / |
29  // ac |
30  // \ |
31  // ml
32  // |
33  // sm
34  // |
35  // ot
36  armnn::IConnectableLayer* layer = net.AddInputLayer(0, "in");
37  layer->GetOutputSlot(0).SetTensorInfo(desc);
38 
39  armnn::IConnectableLayer* const normLayer = net.AddNormalizationLayer(nmDesc, "nm");
40 
41  layer->GetOutputSlot(0).Connect(normLayer->GetInputSlot(0));
42  normLayer->GetOutputSlot(0).SetTensorInfo(desc);
43 
44  layer = net.AddActivationLayer(acDesc, "ac");
45 
46  normLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
47  layer->GetOutputSlot(0).SetTensorInfo(desc);
48 
49  armnn::IConnectableLayer* prevLayer = layer;
50  layer = net.AddMultiplicationLayer("ml");
51 
52  prevLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
53  normLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(1));
54  layer->GetOutputSlot(0).SetTensorInfo(desc);
55 
56  prevLayer = layer;
57  armnn::SoftmaxDescriptor softmaxDescriptor;
58  layer = net.AddSoftmaxLayer(softmaxDescriptor, "sm");
59 
60  prevLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
61  layer->GetOutputSlot(0).SetTensorInfo(desc);
62 
63  prevLayer = layer;
64  layer = net.AddOutputLayer(0, "ot");
65 
66  prevLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
67 
70 
71  std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
72  armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(net, backends, runtime->GetDeviceSpec());
73  static_cast<armnn::OptimizedNetwork*>(optNet.get())->GetGraph().AllocateDynamicBuffers();
74  BOOST_CHECK(optNet);
75 
76  // Validates workloads.
78  for (auto&& layer : static_cast<armnn::OptimizedNetwork*>(optNet.get())->GetGraph())
79  {
80  BOOST_CHECK_NO_THROW(layer->CreateWorkload(fact));
81  }
82 }
83 
84 BOOST_AUTO_TEST_CASE(OptimizeValidateWorkloadsCpuRefPermuteLayer)
85 {
86  // Create runtime in which test will run
89 
90  std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
91 
92  // build up the structure of the network
94 
95  armnn::IConnectableLayer* input = net->AddInputLayer(0);
96 
97  armnn::PermuteDescriptor descriptor({0, 2, 3, 1});
98  armnn::IConnectableLayer* permute = net->AddPermuteLayer(descriptor);
99 
100  armnn::IConnectableLayer* output = net->AddOutputLayer(0);
101 
102  input->GetOutputSlot(0).Connect(permute->GetInputSlot(0));
103  permute->GetOutputSlot(0).Connect(output->GetInputSlot(0));
104 
106  permute->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 4, 1, 4 }, armnn::DataType::Float32));
107 
108  // optimize the network
109  armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
110 
111  for (auto&& layer : static_cast<armnn::OptimizedNetwork*>(optNet.get())->GetGraph())
112  {
113  BOOST_CHECK(layer->GetBackendId() == armnn::Compute::CpuRef);
114  }
115 }
116 
117 BOOST_AUTO_TEST_CASE(OptimizeValidateWorkloadsCpuRefMeanLayer)
118 {
119  // Create runtime in which test will run
122 
123  std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
124 
125  // build up the structure of the network
127 
128  armnn::IConnectableLayer* input = net->AddInputLayer(0);
129 
130  armnn::MeanDescriptor descriptor({ 0, 1 }, false);
131  armnn::IConnectableLayer* meanLayer = net->AddMeanLayer(descriptor);
132 
133  armnn::IConnectableLayer* output = net->AddOutputLayer(0);
134 
135  input->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
136  meanLayer->GetOutputSlot(0).Connect(output->GetInputSlot(0));
137 
139  meanLayer->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 2 }, armnn::DataType::Float32));
140 
141  // optimize the network
142  armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
143 
144  for (auto&& layer : static_cast<armnn::OptimizedNetwork*>(optNet.get())->GetGraph())
145  {
146  BOOST_CHECK(layer->GetBackendId() == armnn::Compute::CpuRef);
147  }
148 }
149 
150 BOOST_AUTO_TEST_CASE(DebugTestOnCpuRef)
151 {
152  armnn::Network net;
153 
154  armnn::ActivationDescriptor activation1Descriptor;
155  activation1Descriptor.m_Function = armnn::ActivationFunction::BoundedReLu;
156  activation1Descriptor.m_A = 1.f;
157  activation1Descriptor.m_B = -1.f;
158 
159  // Defines layers.
160  auto input = net.AddInputLayer(0, "InputLayer");
161  auto activation = net.AddActivationLayer(activation1Descriptor, "ActivationLayer");
162  auto output = net.AddOutputLayer(0, "OutputLayer");
163 
164  // Connects layers.
165  input->GetOutputSlot(0).Connect(activation->GetInputSlot(0));
166  activation->GetOutputSlot(0).Connect(output->GetInputSlot(0));
167 
168  armnn::TensorShape shape({4});
170  input->GetOutputSlot(0).SetTensorInfo(info);
171  activation->GetOutputSlot(0).SetTensorInfo(info);
172 
175 
176  std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
177 
178  armnn::OptimizerOptions optimizerOptions;
179  optimizerOptions.m_Debug = true;
180 
181  armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(net, backends, runtime->GetDeviceSpec(),
182  optimizerOptions);
183 
184  const armnn::Graph& graph = static_cast<armnn::OptimizedNetwork*>(optimizedNet.get())->GetGraph();
185  // Tests that all layers are present in the graph.
186  BOOST_TEST(graph.GetNumLayers() == 5);
187 
188  // Tests that the vertices exist and have correct names.
189  BOOST_TEST(GraphHasNamedLayer(graph, "InputLayer"));
190  BOOST_TEST(GraphHasNamedLayer(graph, "DebugLayerAfterInputLayer"));
191  BOOST_TEST(GraphHasNamedLayer(graph, "ActivationLayer"));
192  BOOST_TEST(GraphHasNamedLayer(graph, "DebugLayerAfterActivationLayer"));
193  BOOST_TEST(GraphHasNamedLayer(graph, "OutputLayer"));
194 }
195 
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:31
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
IConnectableLayer * AddOutputLayer(LayerBindingId id, const char *name=nullptr) override
Adds an output layer to the network.
Definition: Network.cpp:1435
CPU Execution: Reference C++ kernels.
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:25
bool GraphHasNamedLayer(const armnn::Graph &graph, const std::string &name)
Definition: GraphUtils.cpp:10
IConnectableLayer * AddInputLayer(LayerBindingId id, const char *name=nullptr) override
Adds an input layer to the network.
Definition: Network.cpp:1166
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:1003
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:573
IConnectableLayer * AddActivationLayer(const ActivationDescriptor &activationDescriptor, const char *name=nullptr) override
Adds an activation layer to the network.
Definition: Network.cpp:1368
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:20
min(a, max(b, input)) ReLu1 & ReLu6.
BOOST_AUTO_TEST_CASE(OptimizeValidateCpuRefWorkloads)
Private implementation of INetwork.
Definition: Network.hpp:28
float m_A
Alpha upper bound value used by the activation functions. (BoundedReLu, Linear, TanH, Elu).
Definition: Descriptors.hpp:45
BOOST_AUTO_TEST_SUITE_END()
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
A MeanDescriptor for the MeanLayer.
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
A NormalizationDescriptor for the NormalizationLayer.
float m_B
Beta lower bound value used by the activation functions. (BoundedReLu, Linear, TanH).
Definition: Descriptors.hpp:47
A SoftmaxDescriptor for the SoftmaxLayer.
static INetworkPtr Create()
Definition: Network.cpp:50
ActivationFunction m_Function
The activation function to use (Sigmoid, TanH, Linear, ReLu, BoundedReLu, SoftReLu, LeakyReLu, Abs, Sqrt, Square, Elu).
Definition: Descriptors.hpp:43
A PermuteDescriptor for the PermuteLayer.