• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include <armnn/DescriptorsFwd.hpp>
8 #include <armnn/LstmParams.hpp>
9 #include <armnn/QuantizedLstmParams.hpp>
10 #include <armnn/TensorFwd.hpp>
11 #include <armnn/Types.hpp>
12 
13 #include <armnn/INetwork.hpp>
14 
15 #include <string>
16 #include <vector>
17 #include <map>
18 #include <memory>
19 
20 #include "Graph.hpp"
21 #include "Layer.hpp"
22 
23 namespace armnn
24 {
25 class Graph;
26 
27 /// Private implementation of INetwork.
28 class Network final : public INetwork
29 {
30 public:
31     Network(NetworkOptions networkOptions = {});
32     ~Network();
33 
GetGraph() const34     const Graph& GetGraph() const { return *m_Graph; }
35 
36     Status PrintGraph() override;
37 
38     IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name=nullptr) override;
39 
40     IConnectableLayer* AddArgMinMaxLayer(const ArgMinMaxDescriptor& desc,
41                                          const char* name = nullptr) override;
42 
43     IConnectableLayer* AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor,
44                                               const char* name = nullptr) override;
45 
46     IConnectableLayer* AddComparisonLayer(const ComparisonDescriptor& comparisonDescriptor,
47                                           const char* name = nullptr) override;
48 
49     IConnectableLayer* AddConcatLayer(const ConcatDescriptor& concatDescriptor,
50                                       const char* name = nullptr) override;
51 
52     IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
53                                              const ConstTensor& weights,
54                                              const Optional<ConstTensor>& biases,
55                                              const char* name = nullptr) override;
56 
57     ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
58     IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
59                                              const ConstTensor& weights,
60                                              const char* name = nullptr) override;
61 
62     ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
63     IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
64                                              const ConstTensor& weights,
65                                              const ConstTensor& biases,
66                                              const char* name = nullptr) override;
67 
68     IConnectableLayer* AddDepthToSpaceLayer(const DepthToSpaceDescriptor& depthToSpaceDescriptor,
69                                             const char* name = nullptr) override;
70 
71     IConnectableLayer* AddDepthwiseConvolution2dLayer(
72         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
73         const ConstTensor& weights,
74         const Optional<ConstTensor>& biases,
75         const char* name = nullptr) override;
76 
77     ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
78     IConnectableLayer* AddDepthwiseConvolution2dLayer(
79         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
80         const ConstTensor& weights,
81         const char* name = nullptr) override;
82 
83     ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
84     IConnectableLayer* AddDepthwiseConvolution2dLayer(
85         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
86         const ConstTensor& weights,
87         const ConstTensor& biases,
88         const char* name = nullptr) override;
89 
90     IConnectableLayer* AddDequantizeLayer(const char* name = nullptr) override;
91 
92     IConnectableLayer* AddDetectionPostProcessLayer(
93         const DetectionPostProcessDescriptor& descriptor,
94         const ConstTensor& anchors,
95         const char* name = nullptr) override;
96 
97     IConnectableLayer* AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor& elementwiseUnaryDescriptor,
98                                                 const char* name = nullptr) override;
99 
100     IConnectableLayer* AddFillLayer(const FillDescriptor& fillDescriptor,
101                                     const char* name = nullptr) override;
102 
103     IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
104                                               const ConstTensor& weights,
105                                               const Optional<ConstTensor>& biases,
106                                               const char* name = nullptr) override;
107 
108     ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
109     IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
110                                               const ConstTensor& weights,
111                                               const char* name = nullptr) override;
112 
113     ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
114     IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
115                                               const ConstTensor& weights,
116                                               const ConstTensor& biases,
117                                               const char* name = nullptr) override;
118 
119     ARMNN_DEPRECATED_MSG("This AddGatherLayer overload is deprecated")
120     IConnectableLayer* AddGatherLayer(const char* name = nullptr) override;
121 
122     IConnectableLayer* AddGatherLayer(const GatherDescriptor& gatherDescriptor,
123                                       const char* name = nullptr) override;
124 
125     IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor,
126                                        const char* name = nullptr) override;
127 
128     IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor,
129         const char* name = nullptr) override;
130 
131     IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor,
132         const char* name = nullptr) override;
133 
134     IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor,
135         const char* name = nullptr) override;
136 
137     IConnectableLayer* AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name = nullptr) override;
138 
139     IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor,
140         const char* name = nullptr) override;
141 
142     IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor,
143         const char* name = nullptr) override;
144 
145     ARMNN_DEPRECATED_MSG("Use AddConcatLayer instead")
146     IConnectableLayer* AddMergerLayer(const MergerDescriptor& mergerDescriptor,
147                                       const char* name = nullptr) override;
148 
149     ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
150     IConnectableLayer* AddAbsLayer(const char* name = nullptr) override;
151 
152     IConnectableLayer* AddAdditionLayer(const char* name = nullptr) override;
153 
154     IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr) override;
155 
156     IConnectableLayer* AddBatchNormalizationLayer(const BatchNormalizationDescriptor& desc,
157                                                   const ConstTensor&                  mean,
158                                                   const ConstTensor&                  variance,
159                                                   const ConstTensor&                  beta,
160                                                   const ConstTensor&                  gamma,
161                                                   const char*                         name = nullptr) override;
162 
163     IConnectableLayer* AddRankLayer(const char* name = nullptr) override;
164 
165     ARMNN_DEPRECATED_MSG("Use AddResizeLayer instead")
166     IConnectableLayer* AddResizeBilinearLayer(const ResizeBilinearDescriptor& resizeDesc,
167                                               const char* name = nullptr) override;
168 
169     IConnectableLayer* AddResizeLayer(const ResizeDescriptor& resizeDescriptor,
170                                       const char* name = nullptr) override;
171 
172     IConnectableLayer* AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor& desc,
173                                                      const char* name = nullptr) override;
174 
175     IConnectableLayer* AddL2NormalizationLayer(const L2NormalizationDescriptor& desc,
176                                                const char* name = nullptr) override;
177 
178     IConnectableLayer* AddLogSoftmaxLayer(const LogSoftmaxDescriptor& logSoftmaxDescriptor,
179                                           const char* name = nullptr) override;
180 
181     IConnectableLayer* AddConstantLayer(const ConstTensor& input, const char* name = nullptr) override;
182 
183     IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor,
184                                        const char* name = nullptr) override;
185 
186     IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
187                                               const char* name = nullptr) override;
188 
189     IConnectableLayer* AddSpaceToDepthLayer(const SpaceToDepthDescriptor& spaceToDepthDescriptor,
190                                             const char* name = nullptr) override;
191 
192     IConnectableLayer* AddFloorLayer(const char* name = nullptr) override;
193 
194     IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) override;
195 
196     IConnectableLayer* AddLstmLayer(const LstmDescriptor& descriptor,
197                                     const LstmInputParams& params,
198                                     const char* name = nullptr) override;
199 
200     IConnectableLayer* AddDivisionLayer(const char* name = nullptr) override;
201 
202     IConnectableLayer* AddSubtractionLayer(const char* name = nullptr) override;
203 
204     IConnectableLayer* AddMaximumLayer(const char* name = nullptr) override;
205 
206     IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) override;
207 
208     IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor, const char* name = nullptr) override;
209 
210     IConnectableLayer* AddQuantizeLayer(const char* name = nullptr) override;
211 
212     IConnectableLayer* AddStridedSliceLayer(const StridedSliceDescriptor& stridedSliceDescriptor,
213                                             const char* name = nullptr) override;
214 
215     IConnectableLayer* AddMinimumLayer(const char* name = nullptr) override;
216 
217     ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
218     IConnectableLayer* AddGreaterLayer(const char* name = nullptr) override;
219 
220     ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
221     IConnectableLayer* AddEqualLayer(const char* name = nullptr) override;
222 
223     ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
224     IConnectableLayer* AddRsqrtLayer(const char* name = nullptr) override;
225 
226     IConnectableLayer* AddMergeLayer(const char* name = nullptr) override;
227 
228     IConnectableLayer* AddSwitchLayer(const char* name = nullptr) override;
229 
230     IConnectableLayer* AddPreluLayer(const char* name = nullptr) override;
231 
232     IConnectableLayer* AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor& descriptor,
233                                                       const ConstTensor& weights,
234                                                       const Optional<ConstTensor>& biases,
235                                                       const char* name = nullptr) override;
236 
237     IConnectableLayer* AddTransposeLayer(const TransposeDescriptor& transposeDescriptor,
238                                          const char* name = nullptr) override;
239 
240     IConnectableLayer* AddStackLayer(const StackDescriptor& stackDescriptor,
241                                      const char* name = nullptr) override;
242 
243     IConnectableLayer* AddStandInLayer(const StandInDescriptor& descriptor,
244                                        const char* name = nullptr) override;
245 
246     IConnectableLayer* AddQLstmLayer(const QLstmDescriptor& descriptor,
247                                      const LstmInputParams& params,
248                                      const char* name = nullptr) override;
249 
250     IConnectableLayer* AddQuantizedLstmLayer(const QuantizedLstmInputParams& params,
251                                              const char* name = nullptr) override;
252 
253     IConnectableLayer* AddLogicalBinaryLayer(const LogicalBinaryDescriptor& logicalBinaryDescriptor,
254                                              const char* name = nullptr) override;
255 
256     void Accept(ILayerVisitor& visitor) const override;
257 
258 private:
259     IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor,
260                                                   const ConstTensor& weights,
261                                                   const Optional<ConstTensor>& biases,
262                                                   const char* name);
263 
264     IConnectableLayer* AddConvolution2dLayerImpl(const Convolution2dDescriptor& convolution2dDescriptor,
265                                                  const ConstTensor& weights,
266                                                  const Optional<ConstTensor>& biases,
267                                                  const char* name);
268 
269     IConnectableLayer* AddDepthwiseConvolution2dLayerImpl(
270         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
271         const ConstTensor& weights,
272         const Optional<ConstTensor>& biases,
273         const char* name);
274 
275     bool GetShapeInferenceMethod();
276     NetworkOptions m_NetworkOptions;
277 
278     std::unique_ptr<Graph> m_Graph;
279     ModelOptions m_ModelOptions;
280 };
281 
282 class OptimizedNetwork final : public IOptimizedNetwork
283 {
284 public:
285     OptimizedNetwork(std::unique_ptr<Graph> graph);
286     OptimizedNetwork(std::unique_ptr<Graph> graph, const ModelOptions& modelOptions);
287     ~OptimizedNetwork();
288 
289     Status PrintGraph() override;
290     Status SerializeToDot(std::ostream& stream) const override;
291 
GetGuid() const292     profiling::ProfilingGuid GetGuid() const final { return m_Guid; };
293 
GetGraph()294     Graph& GetGraph() { return *m_Graph; }
GetModelOptions()295     ModelOptions& GetModelOptions() { return m_ModelOptions; }
296 
297 private:
298     std::unique_ptr<Graph> m_Graph;
299     profiling::ProfilingGuid m_Guid;
300     ModelOptions m_ModelOptions;
301 };
302 
303 
304 
305 struct OptimizationResult
306 {
307     bool m_Warning;
308     bool m_Error;
309 
OptimizationResultarmnn::OptimizationResult310     OptimizationResult(bool warning, bool error)
311         : m_Warning(warning)
312         , m_Error(error)
313     {}
314 
OptimizationResultarmnn::OptimizationResult315     OptimizationResult()
316         : OptimizationResult(false, false)
317     {}
318 
IsOkarmnn::OptimizationResult319     bool IsOk() const { return !m_Warning && !m_Error; }
IsWarningOnlyarmnn::OptimizationResult320     bool IsWarningOnly() const { return m_Warning && !m_Error; }
IsErrorarmnn::OptimizationResult321     bool IsError() const { return m_Error; }
322 
323 };
324 
325 using BackendsMap = std::map<BackendId, std::unique_ptr<class IBackendInternal>>;
326 
327 BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry& handleFactoryRegistry,
328                                     struct BackendSettings& backendSettings);
329 
330 OptimizationResult SelectTensorHandleStrategy(Graph& optGraph,
331                                               BackendsMap& backends,
332                                               TensorHandleFactoryRegistry& registry,
333                                               bool importEnabled,
334                                               Optional<std::vector<std::string>&> errMessages);
335 
336 OptimizationResult AssignBackends(OptimizedNetwork* optNetObjPtr,
337                                   BackendSettings& backendSettings,
338                                   Graph::Iterator& firstLayer,
339                                   Graph::Iterator& lastLayer,
340                                   Optional<std::vector<std::string>&> errMessages);
341 
342 } // namespace armnn
343