ArmNN
 22.02
Serializer.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
8 #include <armnn/IStrategy.hpp>
10 
12 
13 #include <common/include/ProfilingGuid.hpp>
14 
15 #include <unordered_map>
16 
17 #include "ArmnnSchema_generated.h"
18 
19 #include <armnn/Types.hpp>
20 
21 namespace armnnSerializer
22 {
23 
25 {
26 public:
27  void ExecuteStrategy(const armnn::IConnectableLayer* layer,
28  const armnn::BaseDescriptor& descriptor,
29  const std::vector<armnn::ConstTensor>& constants,
30  const char* name,
31  const armnn::LayerBindingId id) override;
32 
33  SerializerStrategy() : m_layerId(0) {}
35 
36  flatbuffers::FlatBufferBuilder& GetFlatBufferBuilder()
37  {
38  return m_flatBufferBuilder;
39  }
40 
41  std::vector<int>& GetInputIds()
42  {
43  return m_inputIds;
44  }
45 
46  std::vector<int>& GetOutputIds()
47  {
48  return m_outputIds;
49  }
50 
51  std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>>& GetSerializedLayers()
52  {
53  return m_serializedLayers;
54  }
55 
56  flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> GetVersionTable();
57 
58 private:
59  /// Creates the Input Slots and Output Slots and LayerBase for the layer.
60  flatbuffers::Offset<armnnSerializer::LayerBase> CreateLayerBase(
61  const armnn::IConnectableLayer* layer,
62  const armnnSerializer::LayerType layerType);
63 
64  /// Creates the serializer AnyLayer for the layer and adds it to m_serializedLayers.
65  void CreateAnyLayer(const flatbuffers::Offset<void>& layer, const armnnSerializer::Layer serializerLayer);
66 
67  /// Creates the serializer ConstTensor for the armnn ConstTensor.
68  flatbuffers::Offset<armnnSerializer::ConstTensor> CreateConstTensorInfo(
69  const armnn::ConstTensor& constTensor);
70 
71  /// Creates the serializer TensorInfo for the armnn TensorInfo.
72  flatbuffers::Offset<TensorInfo> CreateTensorInfo(const armnn::TensorInfo& tensorInfo);
73 
74  template <typename T>
75  flatbuffers::Offset<flatbuffers::Vector<T>> CreateDataVector(const void* memory, unsigned int size);
76 
77  ///Function which maps Guid to an index
78  uint32_t GetSerializedId(armnn::LayerGuid guid);
79 
80  /// Creates the serializer InputSlots for the layer.
81  std::vector<flatbuffers::Offset<armnnSerializer::InputSlot>> CreateInputSlots(
82  const armnn::IConnectableLayer* layer);
83 
84  /// Creates the serializer OutputSlots for the layer.
85  std::vector<flatbuffers::Offset<armnnSerializer::OutputSlot>> CreateOutputSlots(
86  const armnn::IConnectableLayer* layer);
87 
88  /// FlatBufferBuilder to create our layers' FlatBuffers.
89  flatbuffers::FlatBufferBuilder m_flatBufferBuilder;
90 
91  /// AnyLayers required by the SerializedGraph.
92  std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>> m_serializedLayers;
93 
94  /// Vector of the binding ids of all Input Layers required by the SerializedGraph.
95  std::vector<int> m_inputIds;
96 
97  /// Vector of the binding ids of all Output Layers required by the SerializedGraph.
98  std::vector<int> m_outputIds;
99 
100  /// Mapped Guids of all Layers to match our index.
101  std::unordered_map<armnn::LayerGuid, uint32_t > m_guidMap;
102 
103  /// layer within our FlatBuffer index.
104  uint32_t m_layerId;
105 
106 private:
107  void SerializeActivationLayer(const armnn::IConnectableLayer* layer,
108  const armnn::ActivationDescriptor& descriptor,
109  const char* name = nullptr);
110 
111  void SerializeAdditionLayer(const armnn::IConnectableLayer* layer,
112  const char* name = nullptr);
113 
114  void SerializeArgMinMaxLayer(const armnn::IConnectableLayer* layer,
115  const armnn::ArgMinMaxDescriptor& argMinMaxDescriptor,
116  const char* name = nullptr);
117 
118  void SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
119  const armnn::BatchToSpaceNdDescriptor& descriptor,
120  const char* name = nullptr);
121 
122  void SerializeBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
123  const armnn::BatchNormalizationDescriptor& BatchNormalizationDescriptor,
124  const std::vector<armnn::ConstTensor>& constants,
125  const char* name = nullptr);
126 
127  void SerializeCastLayer(const armnn::IConnectableLayer* layer,
128  const char* name = nullptr);
129 
130  void SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
131  const armnn::ChannelShuffleDescriptor& descriptor,
132  const char* name = nullptr);
133 
134  void SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
135  const armnn::ComparisonDescriptor& descriptor,
136  const char* name = nullptr);
137 
138  void SerializeConcatLayer(const armnn::IConnectableLayer* layer,
139  const armnn::ConcatDescriptor& concatDescriptor,
140  const char* name = nullptr);
141 
142  void SerializeConstantLayer(const armnn::IConnectableLayer* layer,
143  const std::vector<armnn::ConstTensor>& constants,
144  const char* name = nullptr);
145 
146  void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
147  const armnn::Convolution2dDescriptor& descriptor,
148  const std::vector<armnn::ConstTensor>& constants,
149  const char* name = nullptr);
150 
151  void SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
152  const armnn::Convolution3dDescriptor& descriptor,
153  const char* name = nullptr);
154 
155  void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
156  const armnn::DepthToSpaceDescriptor& descriptor,
157  const char* name = nullptr);
158 
159  void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
160  const armnn::DepthwiseConvolution2dDescriptor& descriptor,
161  const std::vector<armnn::ConstTensor>& constants,
162  const char* name = nullptr);
163 
164  void SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
165  const char* name = nullptr);
166 
167  void SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
168  const armnn::DetectionPostProcessDescriptor& descriptor,
169  const std::vector<armnn::ConstTensor>& constants,
170  const char* name = nullptr);
171 
172  void SerializeDivisionLayer(const armnn::IConnectableLayer* layer,
173  const char* name = nullptr);
174 
175  void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
176  const armnn::ElementwiseUnaryDescriptor& descriptor,
177  const char* name = nullptr);
178 
179  void SerializeFillLayer(const armnn::IConnectableLayer* layer,
180  const armnn::FillDescriptor& fillDescriptor,
181  const char* name = nullptr);
182 
183  void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
184  const char *name = nullptr);
185 
186  void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
187  const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
188  const char* name = nullptr);
189 
190  void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
191  const armnn::GatherDescriptor& gatherDescriptor,
192  const char* name = nullptr);
193 
194  void SerializeInputLayer(const armnn::IConnectableLayer* layer,
196  const char* name = nullptr);
197 
198  void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
199  const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
200  const char* name = nullptr);
201 
202  void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
203  const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
204  const char* name = nullptr);
205 
206  void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
207  const armnn::LogicalBinaryDescriptor& descriptor,
208  const char* name = nullptr);
209 
210  void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
211  const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
212  const char* name = nullptr);
213 
214  void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
215  const armnn::LstmDescriptor& descriptor,
216  const std::vector<armnn::ConstTensor>& constants,
217  const char* name = nullptr);
218 
219  void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
220  const armnn::MeanDescriptor& descriptor,
221  const char* name);
222 
223  void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
224  const char* name = nullptr);
225 
226  void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
227  const char* name = nullptr);
228 
229  void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
230  const char* name = nullptr);
231 
232  void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
233  const char* name = nullptr);
234 
235  void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
237  const char* name = nullptr);
238 
239  void SerializePadLayer(const armnn::IConnectableLayer* layer,
240  const armnn::PadDescriptor& PadDescriptor,
241  const char* name = nullptr);
242 
243  void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
244  const armnn::PermuteDescriptor& PermuteDescriptor,
245  const char* name = nullptr);
246 
247  void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
248  const armnn::Pooling2dDescriptor& pooling2dDescriptor,
249  const char* name = nullptr);
250 
251  void SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
252  const armnn::Pooling3dDescriptor& pooling3dDescriptor,
253  const char* name = nullptr);
254 
255  void SerializePreluLayer(const armnn::IConnectableLayer* layer,
256  const char* name = nullptr);
257 
258  void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
259  const char* name = nullptr);
260 
261  void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
262  const armnn::QLstmDescriptor& descriptor,
263  const std::vector<armnn::ConstTensor>& constants,
264  const char* name = nullptr);
265 
266  void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
267  const std::vector<armnn::ConstTensor>& constants,
268  const char* name = nullptr);
269 
270  void SerializeRankLayer(const armnn::IConnectableLayer* layer,
271  const char* name = nullptr);
272 
273  void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
274  const armnn::ReduceDescriptor& reduceDescriptor,
275  const char* name = nullptr);
276 
277  void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
278  const armnn::ReshapeDescriptor& reshapeDescriptor,
279  const char* name = nullptr);
280 
281  void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
282  const armnn::ResizeDescriptor& resizeDescriptor,
283  const char* name = nullptr);
284 
285  void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
286  const armnn::SliceDescriptor& sliceDescriptor,
287  const char* name = nullptr);
288 
289  void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
290  const armnn::SoftmaxDescriptor& softmaxDescriptor,
291  const char* name = nullptr);
292 
293  void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
294  const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
295  const char* name = nullptr);
296 
297  void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
298  const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
299  const char* name = nullptr);
300 
301  void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
302  const armnn::NormalizationDescriptor& normalizationDescriptor,
303  const char* name = nullptr);
304 
305  void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
306  const char* name = nullptr);
307 
308  void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
309  const armnn::ViewsDescriptor& viewsDescriptor,
310  const char* name = nullptr);
311 
312  void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
313  const armnn::StandInDescriptor& standInDescriptor,
314  const char* name = nullptr);
315 
316  void SerializeStackLayer(const armnn::IConnectableLayer* layer,
317  const armnn::StackDescriptor& stackDescriptor,
318  const char* name = nullptr);
319 
320  void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
321  const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
322  const char* name = nullptr);
323 
324  void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
325  const char* name = nullptr);
326 
327  void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
328  const char* name = nullptr);
329 
330  void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
331  const armnn::TransposeConvolution2dDescriptor& descriptor,
332  const std::vector<armnn::ConstTensor>& constants,
333  const char* = nullptr);
334 
335  void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
336  const armnn::TransposeDescriptor& descriptor,
337  const char* name = nullptr);
338 
339  void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer,
341  const std::vector<armnn::ConstTensor>& constants,
342  const char* name = nullptr);
343 };
344 
345 
346 
348 {
349 public:
350  SerializerImpl() = default;
351  ~SerializerImpl() = default;
352 
353  /// Serializes the network to ArmNN SerializedGraph.
354  /// @param [in] inNetwork The network to be serialized.
355  void Serialize(const armnn::INetwork& inNetwork);
356 
357  /// Serializes the SerializedGraph to the stream.
358  /// @param [stream] the stream to save to
359  /// @return true if graph is Serialized to the Stream, false otherwise
360  bool SaveSerializedToStream(std::ostream& stream);
361 
362 private:
363 
364  /// Visitor to contruct serialized network
365  SerializerStrategy m_SerializerStrategy;
366 };
367 
368 } //namespace armnnSerializer
A ViewsDescriptor for the SplitterLayer.
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:66
flatbuffers::FlatBufferBuilder & GetFlatBufferBuilder()
Definition: Serializer.hpp:36
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
A ReshapeDescriptor for the ReshapeLayer.
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:89
A Convolution2dDescriptor for the Convolution2dLayer.
Main network class which provides the interface for building up a neural network. ...
Definition: INetwork.hpp:249
A LogicalBinaryDescriptor for the LogicalBinaryLayer.
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id) override
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:277
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
Base class for all descriptors.
Definition: Descriptors.hpp:22
A StackDescriptor for the StackLayer.
A PadDescriptor for the PadLayer.
An LstmDescriptor for the LstmLayer.
A L2NormalizationDescriptor for the L2NormalizationLayer.
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:67
An OriginsDescriptor for the ConcatLayer.
A ReduceDescriptor for the REDUCE operators.
A FullyConnectedDescriptor for the FullyConnectedLayer.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:327
A GatherDescriptor for the GatherLayer.
A StandInDescriptor for the StandIn layer.
A QLstmDescriptor for the QLstmLayer.
std::vector< int > & GetInputIds()
Definition: Serializer.hpp:41
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:36
A SliceDescriptor for the SliceLayer.
A Convolution3dDescriptor for the Convolution3dLayer.
A Pooling3dDescriptor for the Pooling3dLayer.
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
std::vector< int > & GetOutputIds()
Definition: Serializer.hpp:46
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
profiling::ProfilingGuid LayerGuid
Define LayerGuid type.
Definition: Types.hpp:363
A MeanDescriptor for the MeanLayer.
A TransposeDescriptor for the TransposeLayer.
A StridedSliceDescriptor for the StridedSliceLayer.
A Pooling2dDescriptor for the Pooling2dLayer.
A NormalizationDescriptor for the NormalizationLayer.
std::vector< flatbuffers::Offset< armnnSerializer::AnyLayer > > & GetSerializedLayers()
Definition: Serializer.hpp:51
flatbuffers::Offset< armnnSerializer::FeatureCompatibilityVersions > GetVersionTable()
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
A ChannelShuffleDescriptor for the ChannelShuffle operator.
A SoftmaxDescriptor for the SoftmaxLayer.
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A FillDescriptor for the FillLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
A PermuteDescriptor for the PermuteLayer.