blob: 5da681306c009f6bad655c997631839714f4cb6c [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
7#include <armnn/DescriptorsFwd.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +01008#include <armnn/LstmParams.hpp>
James Conroyee18dc82019-07-17 11:27:46 +01009#include <armnn/QuantizedLstmParams.hpp>
telsoa014fcda012018-03-09 14:13:49 +000010#include <armnn/TensorFwd.hpp>
11#include <armnn/Types.hpp>
12
13#include <armnn/INetwork.hpp>
14
15#include <string>
16#include <vector>
Derek Lamberti84da38b2019-06-13 11:40:08 +010017#include <map>
telsoa014fcda012018-03-09 14:13:49 +000018#include <memory>
19
20#include "Layer.hpp"
21
22namespace armnn
23{
24class Graph;
25
telsoa01c577f2c2018-08-31 09:22:23 +010026/// Private implementation of INetwork.
telsoa014fcda012018-03-09 14:13:49 +000027class Network final : public INetwork
28{
29public:
30 Network();
31 ~Network();
32
33 const Graph& GetGraph() const { return *m_Graph; }
34
35 Status PrintGraph() override;
36
Jan Eilers99d9d4a2019-11-06 10:02:16 +000037 profiling::ProfilingGuid GetGuid() const final { return m_Guid; };
38
telsoa014fcda012018-03-09 14:13:49 +000039 IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name=nullptr) override;
40
Nikhil Rajee391d52019-09-05 17:50:44 +010041 IConnectableLayer* AddArgMinMaxLayer(const ArgMinMaxDescriptor& desc,
42 const char* name = nullptr) override;
43
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000044 IConnectableLayer* AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor,
45 const char* name = nullptr) override;
46
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010047 IConnectableLayer* AddComparisonLayer(const ComparisonDescriptor& comparisonDescriptor,
48 const char* name = nullptr) override;
49
Jim Flynne242f2d2019-05-22 14:24:13 +010050 IConnectableLayer* AddConcatLayer(const ConcatDescriptor& concatDescriptor,
Jim Flynn906f9462019-05-10 13:55:21 +010051 const char* name = nullptr) override;
52
telsoa014fcda012018-03-09 14:13:49 +000053 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +000054 const ConstTensor& weights,
55 const Optional<ConstTensor>& biases,
56 const char* name = nullptr) override;
57
Matteo Martincighfc598e12019-05-14 10:36:13 +010058 ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000059 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
60 const ConstTensor& weights,
61 const char* name = nullptr) override;
62
Matteo Martincighfc598e12019-05-14 10:36:13 +010063 ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000064 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
65 const ConstTensor& weights,
66 const ConstTensor& biases,
67 const char* name = nullptr) override;
68
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +010069 IConnectableLayer* AddDepthToSpaceLayer(const DepthToSpaceDescriptor& depthToSpaceDescriptor,
70 const char* name = nullptr) override;
71
Aron Virginas-Tarad402702019-02-22 17:03:44 +000072 IConnectableLayer* AddDepthwiseConvolution2dLayer(
73 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
74 const ConstTensor& weights,
75 const Optional<ConstTensor>& biases,
76 const char* name = nullptr) override;
77
Matteo Martincighfc598e12019-05-14 10:36:13 +010078 ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000079 IConnectableLayer* AddDepthwiseConvolution2dLayer(
80 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
telsoa014fcda012018-03-09 14:13:49 +000081 const ConstTensor& weights,
82 const char* name = nullptr) override;
83
Matteo Martincighfc598e12019-05-14 10:36:13 +010084 ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +000085 IConnectableLayer* AddDepthwiseConvolution2dLayer(
86 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
telsoa014fcda012018-03-09 14:13:49 +000087 const ConstTensor& weights,
88 const ConstTensor& biases,
89 const char* name = nullptr) override;
90
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +000091 IConnectableLayer* AddDequantizeLayer(const char* name = nullptr) override;
92
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +000093 IConnectableLayer* AddDetectionPostProcessLayer(
94 const DetectionPostProcessDescriptor& descriptor,
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +000095 const ConstTensor& anchors,
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +000096 const char* name = nullptr) override;
97
josh minor4a3c6102020-01-06 16:40:46 -060098 IConnectableLayer* AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor& elementwiseUnaryDescriptor,
99 const char* name = nullptr) override;
100
telsoa014fcda012018-03-09 14:13:49 +0000101 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000102 const ConstTensor& weights,
103 const Optional<ConstTensor>& biases,
104 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000105
Matteo Martincighfc598e12019-05-14 10:36:13 +0100106 ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
telsoa014fcda012018-03-09 14:13:49 +0000107 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000108 const ConstTensor& weights,
109 const char* name = nullptr) override;
110
Matteo Martincighfc598e12019-05-14 10:36:13 +0100111 ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000112 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
113 const ConstTensor& weights,
114 const ConstTensor& biases,
115 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000116
narpra01b89b05f2019-01-16 09:53:09 +0000117 IConnectableLayer* AddGatherLayer(const char* name = nullptr) override;
118
telsoa014fcda012018-03-09 14:13:49 +0000119 IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor,
120 const char* name = nullptr) override;
121
122 IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor,
123 const char* name = nullptr) override;
124
125 IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor,
126 const char* name = nullptr) override;
127
128 IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor,
129 const char* name = nullptr) override;
130
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100131 IConnectableLayer* AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name = nullptr) override;
132
telsoa014fcda012018-03-09 14:13:49 +0000133 IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor,
134 const char* name = nullptr) override;
135
136 IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor,
137 const char* name = nullptr) override;
138
Jim Flynn906f9462019-05-10 13:55:21 +0100139 ARMNN_DEPRECATED_MSG("Use AddConcatLayer instead")
Jim Flynne242f2d2019-05-22 14:24:13 +0100140 IConnectableLayer* AddMergerLayer(const MergerDescriptor& mergerDescriptor,
Jim Flynn906f9462019-05-10 13:55:21 +0100141 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000142
josh minor4a3c6102020-01-06 16:40:46 -0600143 ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
Kevin May868eb142019-09-04 17:29:31 +0100144 IConnectableLayer* AddAbsLayer(const char* name = nullptr) override;
145
telsoa014fcda012018-03-09 14:13:49 +0000146 IConnectableLayer* AddAdditionLayer(const char* name = nullptr) override;
147
148 IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr) override;
149
150 IConnectableLayer* AddBatchNormalizationLayer(const BatchNormalizationDescriptor& desc,
151 const ConstTensor& mean,
152 const ConstTensor& variance,
153 const ConstTensor& beta,
154 const ConstTensor& gamma,
155 const char* name = nullptr) override;
156
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100157 ARMNN_DEPRECATED_MSG("Use AddResizeLayer instead")
telsoa014fcda012018-03-09 14:13:49 +0000158 IConnectableLayer* AddResizeBilinearLayer(const ResizeBilinearDescriptor& resizeDesc,
159 const char* name = nullptr) override;
160
Teresa Charlina9075df2019-06-27 15:41:57 +0100161 IConnectableLayer* AddResizeLayer(const ResizeDescriptor& resizeDescriptor,
162 const char* name = nullptr) override;
163
Kevin Mayce5045a2019-10-02 14:07:47 +0100164 IConnectableLayer* AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor& desc,
165 const char* name = nullptr) override;
166
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100167 IConnectableLayer* AddL2NormalizationLayer(const L2NormalizationDescriptor& desc,
168 const char* name = nullptr) override;
telsoa014fcda012018-03-09 14:13:49 +0000169
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100170 IConnectableLayer* AddLogSoftmaxLayer(const LogSoftmaxDescriptor& logSoftmaxDescriptor,
171 const char* name = nullptr) override;
172
telsoa014fcda012018-03-09 14:13:49 +0000173 IConnectableLayer* AddConstantLayer(const ConstTensor& input, const char* name = nullptr) override;
174
175 IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor,
176 const char* name = nullptr) override;
177
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000178 IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
179 const char* name = nullptr) override;
180
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100181 IConnectableLayer* AddSpaceToDepthLayer(const SpaceToDepthDescriptor& spaceToDepthDescriptor,
182 const char* name = nullptr) override;
183
telsoa014fcda012018-03-09 14:13:49 +0000184 IConnectableLayer* AddFloorLayer(const char* name = nullptr) override;
185
186 IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) override;
187
telsoa01c577f2c2018-08-31 09:22:23 +0100188 IConnectableLayer* AddLstmLayer(const LstmDescriptor& descriptor,
189 const LstmInputParams& params,
190 const char* name = nullptr) override;
191
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100192 IConnectableLayer* AddDivisionLayer(const char* name = nullptr) override;
193
David Beck19526222018-09-12 16:00:08 +0100194 IConnectableLayer* AddSubtractionLayer(const char* name = nullptr) override;
195
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000196 IConnectableLayer* AddMaximumLayer(const char* name = nullptr) override;
197
narpra0132b90462018-09-13 11:07:48 +0100198 IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) override;
199
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100200 IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor, const char* name = nullptr) override;
201
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000202 IConnectableLayer* AddQuantizeLayer(const char* name = nullptr) override;
203
Conor Kennedy430b5d82018-11-14 15:28:28 +0000204 IConnectableLayer* AddStridedSliceLayer(const StridedSliceDescriptor& stridedSliceDescriptor,
205 const char* name = nullptr) override;
206
kevmay0190539692018-11-29 08:40:19 +0000207 IConnectableLayer* AddMinimumLayer(const char* name = nullptr) override;
208
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100209 ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000210 IConnectableLayer* AddGreaterLayer(const char* name = nullptr) override;
211
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100212 ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
FrancisMurtagh20995952018-12-17 12:11:36 +0000213 IConnectableLayer* AddEqualLayer(const char* name = nullptr) override;
214
josh minor4a3c6102020-01-06 16:40:46 -0600215 ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000216 IConnectableLayer* AddRsqrtLayer(const char* name = nullptr) override;
217
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100218 IConnectableLayer* AddMergeLayer(const char* name = nullptr) override;
219
Sadik Armaganeff363d2019-04-05 15:25:46 +0100220 IConnectableLayer* AddSwitchLayer(const char* name = nullptr) override;
221
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100222 IConnectableLayer* AddPreluLayer(const char* name = nullptr) override;
223
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100224 IConnectableLayer* AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor& descriptor,
225 const ConstTensor& weights,
226 const Optional<ConstTensor>& biases,
227 const char* name = nullptr) override;
228
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000229 IConnectableLayer* AddTransposeLayer(const TransposeDescriptor& transposeDescriptor,
230 const char* name = nullptr) override;
231
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100232 IConnectableLayer* AddStackLayer(const StackDescriptor& stackDescriptor,
233 const char* name = nullptr) override;
234
Derek Lamberti013c3902019-10-21 10:46:16 +0100235 IConnectableLayer* AddStandInLayer(const StandInDescriptor& descriptor,
236 const char* name = nullptr) override;
237
James Conroyee18dc82019-07-17 11:27:46 +0100238 IConnectableLayer* AddQuantizedLstmLayer(const QuantizedLstmInputParams& params,
239 const char* name = nullptr) override;
240
Mike Kelly8c1701a2019-02-11 17:01:27 +0000241 void Accept(ILayerVisitor& visitor) const override;
242
telsoa014fcda012018-03-09 14:13:49 +0000243private:
244 IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000245 const ConstTensor& weights,
246 const Optional<ConstTensor>& biases,
247 const char* name);
telsoa014fcda012018-03-09 14:13:49 +0000248
249 IConnectableLayer* AddConvolution2dLayerImpl(const Convolution2dDescriptor& convolution2dDescriptor,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000250 const ConstTensor& weights,
251 const Optional<ConstTensor>& biases,
252 const char* name);
telsoa014fcda012018-03-09 14:13:49 +0000253
254 IConnectableLayer* AddDepthwiseConvolution2dLayerImpl(
255 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
256 const ConstTensor& weights,
Aron Virginas-Tarad402702019-02-22 17:03:44 +0000257 const Optional<ConstTensor>& biases,
telsoa014fcda012018-03-09 14:13:49 +0000258 const char* name);
259
260 std::unique_ptr<Graph> m_Graph;
Jan Eilers99d9d4a2019-11-06 10:02:16 +0000261 profiling::ProfilingGuid m_Guid;
telsoa014fcda012018-03-09 14:13:49 +0000262};
263
264class OptimizedNetwork final : public IOptimizedNetwork
265{
266public:
267 OptimizedNetwork(std::unique_ptr<Graph> graph);
268 ~OptimizedNetwork();
269
270 Status PrintGraph() override;
surmeh01bceff2f2018-03-29 16:29:27 +0100271 Status SerializeToDot(std::ostream& stream) const override;
telsoa014fcda012018-03-09 14:13:49 +0000272
Jan Eilers99d9d4a2019-11-06 10:02:16 +0000273 profiling::ProfilingGuid GetGuid() const final { return m_Guid; };
274
telsoa014fcda012018-03-09 14:13:49 +0000275 Graph& GetGraph() { return *m_Graph; }
276
277private:
278 std::unique_ptr<Graph> m_Graph;
Jan Eilers99d9d4a2019-11-06 10:02:16 +0000279 profiling::ProfilingGuid m_Guid;
telsoa014fcda012018-03-09 14:13:49 +0000280};
281
Derek Lamberti84da38b2019-06-13 11:40:08 +0100282
283
284struct OptimizationResult
285{
286 bool m_Warning;
287 bool m_Error;
288
289 OptimizationResult()
290 : m_Warning(false)
291 , m_Error(false)
292 {}
293};
294
295using BackendsMap = std::map<BackendId, std::unique_ptr<class IBackendInternal>>;
296
297BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry& handleFactoryRegistry,
298 struct BackendSettings& backendSettings);
299
300OptimizationResult SelectTensorHandleStrategy(Graph& optGraph,
301 BackendsMap& backends,
302 TensorHandleFactoryRegistry& registry,
303 Optional<std::vector<std::string>&> errMessages);
304
telsoa014fcda012018-03-09 14:13:49 +0000305} // namespace armnn