ArmNN  NotReleased
Serializer.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
9 
11 
12 #include <unordered_map>
13 
14 #include <ArmnnSchema_generated.h>
15 
16 #include <armnn/Types.hpp>
17 
18 namespace armnnSerializer
19 {
20 
22 {
23 public:
24  SerializerVisitor() : m_layerId(0) {}
26 
27  flatbuffers::FlatBufferBuilder& GetFlatBufferBuilder()
28  {
29  return m_flatBufferBuilder;
30  }
31 
32  std::vector<int>& GetInputIds()
33  {
34  return m_inputIds;
35  }
36 
37  std::vector<int>& GetOutputIds()
38  {
39  return m_outputIds;
40  }
41 
42  std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>>& GetSerializedLayers()
43  {
44  return m_serializedLayers;
45  }
46 
47  flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> GetVersionTable();
48 
49 
50  ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
51  void VisitAbsLayer(const armnn::IConnectableLayer* layer,
52  const char* name = nullptr) override;
53 
55  const armnn::ActivationDescriptor& descriptor,
56  const char* name = nullptr) override;
57 
59  const char* name = nullptr) override;
60 
62  const armnn::ArgMinMaxDescriptor& argMinMaxDescriptor,
63  const char* name = nullptr) override;
64 
66  const armnn::BatchToSpaceNdDescriptor& descriptor,
67  const char* name = nullptr) override;
68 
70  const armnn::BatchNormalizationDescriptor& BatchNormalizationDescriptor,
71  const armnn::ConstTensor& mean,
72  const armnn::ConstTensor& variance,
73  const armnn::ConstTensor& beta,
74  const armnn::ConstTensor& gamma,
75  const char* name = nullptr) override;
76 
78  const armnn::ComparisonDescriptor& descriptor,
79  const char* name = nullptr) override;
80 
82  const armnn::ConcatDescriptor& concatDescriptor,
83  const char* name = nullptr) override;
84 
86  const armnn::ConstTensor& input,
87  const char* = nullptr) override;
88 
90  const armnn::Convolution2dDescriptor& descriptor,
91  const armnn::ConstTensor& weights,
93  const char* = nullptr) override;
94 
96  const armnn::DepthToSpaceDescriptor& descriptor,
97  const char* name = nullptr) override;
98 
100  const armnn::DepthwiseConvolution2dDescriptor& descriptor,
101  const armnn::ConstTensor& weights,
103  const char* name = nullptr) override;
104 
106  const char* name = nullptr) override;
107 
109  const armnn::DetectionPostProcessDescriptor& descriptor,
111  const char* name = nullptr) override;
112 
114  const char* name = nullptr) override;
115 
117  const armnn::ElementwiseUnaryDescriptor& descriptor,
118  const char* name = nullptr) override;
119 
120  ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
121  void VisitEqualLayer(const armnn::IConnectableLayer* layer,
122  const char* name = nullptr) override;
123 
124  void VisitFloorLayer(const armnn::IConnectableLayer *layer,
125  const char *name = nullptr) override;
126 
128  const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
129  const armnn::ConstTensor& weights,
131  const char* name = nullptr) override;
132 
133  void VisitGatherLayer(const armnn::IConnectableLayer* layer,
134  const char* name = nullptr) override;
135 
136  ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
138  const char* name = nullptr) override;
139 
140  void VisitInputLayer(const armnn::IConnectableLayer* layer,
142  const char* name = nullptr) override;
143 
145  const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
146  const char* name = nullptr) override;
147 
149  const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
150  const char* name = nullptr) override;
151 
153  const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
154  const char* name = nullptr) override;
155 
156  void VisitLstmLayer(const armnn::IConnectableLayer* layer,
157  const armnn::LstmDescriptor& descriptor,
158  const armnn::LstmInputParams& params,
159  const char* name = nullptr) override;
160 
161  void VisitMeanLayer(const armnn::IConnectableLayer* layer,
162  const armnn::MeanDescriptor& descriptor,
163  const char* name) override;
164 
166  const char* name = nullptr) override;
167 
169  const char* name = nullptr) override;
170 
171  void VisitMergeLayer(const armnn::IConnectableLayer* layer,
172  const char* name = nullptr) override;
173 
174  ARMNN_DEPRECATED_MSG("Use VisitConcatLayer instead")
175  void VisitMergerLayer(const armnn::IConnectableLayer* layer,
176  const armnn::MergerDescriptor& mergerDescriptor,
177  const char* name = nullptr) override;
178 
180  const char* name = nullptr) override;
181 
182  void VisitOutputLayer(const armnn::IConnectableLayer* layer,
184  const char* name = nullptr) override;
185 
186  void VisitPadLayer(const armnn::IConnectableLayer* layer,
187  const armnn::PadDescriptor& PadDescriptor,
188  const char* name = nullptr) override;
189 
191  const armnn::PermuteDescriptor& PermuteDescriptor,
192  const char* name = nullptr) override;
193 
195  const armnn::Pooling2dDescriptor& pooling2dDescriptor,
196  const char* name = nullptr) override;
197 
198  void VisitPreluLayer(const armnn::IConnectableLayer* layer,
199  const char* name = nullptr) override;
200 
202  const char* name = nullptr) override;
203 
205  const armnn::QuantizedLstmInputParams& params,
206  const char* name = nullptr) override;
207 
209  const armnn::ReshapeDescriptor& reshapeDescriptor,
210  const char* name = nullptr) override;
211 
212  void VisitResizeLayer(const armnn::IConnectableLayer* layer,
213  const armnn::ResizeDescriptor& resizeDescriptor,
214  const char* name = nullptr) override;
215 
216  ARMNN_DEPRECATED_MSG("Use VisitResizeLayer instead")
218  const armnn::ResizeBilinearDescriptor& resizeDescriptor,
219  const char* name = nullptr) override;
220 
221  ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
222  void VisitRsqrtLayer(const armnn::IConnectableLayer* layer,
223  const char* name = nullptr) override;
224 
225  void VisitSliceLayer(const armnn::IConnectableLayer* layer,
226  const armnn::SliceDescriptor& sliceDescriptor,
227  const char* name = nullptr) override;
228 
230  const armnn::SoftmaxDescriptor& softmaxDescriptor,
231  const char* name = nullptr) override;
232 
234  const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
235  const char* name = nullptr) override;
236 
238  const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
239  const char* name = nullptr) override;
240 
242  const armnn::NormalizationDescriptor& normalizationDescriptor,
243  const char* name = nullptr) override;
244 
246  const armnn::ViewsDescriptor& viewsDescriptor,
247  const char* name = nullptr) override;
248 
250  const armnn::StandInDescriptor& standInDescriptor,
251  const char* name = nullptr) override;
252 
253  void VisitStackLayer(const armnn::IConnectableLayer* layer,
254  const armnn::StackDescriptor& stackDescriptor,
255  const char* name = nullptr) override;
256 
258  const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
259  const char* name = nullptr) override;
260 
262  const char* name = nullptr) override;
263 
264  void VisitSwitchLayer(const armnn::IConnectableLayer* layer,
265  const char* name = nullptr) override;
266 
268  const armnn::TransposeConvolution2dDescriptor& descriptor,
269  const armnn::ConstTensor& weights,
271  const char* = nullptr) override;
272 
273 private:
274 
276  flatbuffers::Offset<armnnSerializer::LayerBase> CreateLayerBase(
277  const armnn::IConnectableLayer* layer,
278  const armnnSerializer::LayerType layerType);
279 
281  void CreateAnyLayer(const flatbuffers::Offset<void>& layer, const armnnSerializer::Layer serializerLayer);
282 
284  flatbuffers::Offset<armnnSerializer::ConstTensor> CreateConstTensorInfo(
285  const armnn::ConstTensor& constTensor);
286 
287  template <typename T>
288  flatbuffers::Offset<flatbuffers::Vector<T>> CreateDataVector(const void* memory, unsigned int size);
289 
291  uint32_t GetSerializedId(armnn::LayerGuid guid);
292 
294  std::vector<flatbuffers::Offset<armnnSerializer::InputSlot>> CreateInputSlots(
295  const armnn::IConnectableLayer* layer);
296 
298  std::vector<flatbuffers::Offset<armnnSerializer::OutputSlot>> CreateOutputSlots(
299  const armnn::IConnectableLayer* layer);
300 
302  flatbuffers::FlatBufferBuilder m_flatBufferBuilder;
303 
305  std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>> m_serializedLayers;
306 
308  std::vector<int> m_inputIds;
309 
311  std::vector<int> m_outputIds;
312 
314  std::unordered_map<armnn::LayerGuid, uint32_t > m_guidMap;
315 
317  uint32_t m_layerId;
318 };
319 
320 class Serializer : public ISerializer
321 {
322 public:
325 
328  void Serialize(const armnn::INetwork& inNetwork) override;
329 
333  bool SaveSerializedToStream(std::ostream& stream) override;
334 
335 private:
336 
338  SerializerVisitor m_SerializerVisitor;
339 };
340 
341 } //namespace armnnSerializer
void VisitSplitterLayer(const armnn::IConnectableLayer *layer, const armnn::ViewsDescriptor &viewsDescriptor, const char *name=nullptr) override
void VisitAbsLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:125
void VisitRsqrtLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:894
void VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer *layer, const armnn::DepthwiseConvolution2dDescriptor &descriptor, const armnn::ConstTensor &weights, const armnn::Optional< armnn::ConstTensor > &biases, const char *name=nullptr) override
Definition: Serializer.cpp:353
void VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer *layer, const armnn::SpaceToBatchNdDescriptor &spaceToBatchNdDescriptor, const char *name=nullptr) override
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
A NormalizationDescriptor for the NormalizationLayer.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:199
void VisitStackLayer(const armnn::IConnectableLayer *layer, const armnn::StackDescriptor &stackDescriptor, const char *name=nullptr) override
flatbuffers::Offset< armnnSerializer::FeatureCompatibilityVersions > GetVersionTable()
void VisitComparisonLayer(const armnn::IConnectableLayer *layer, const armnn::ComparisonDescriptor &descriptor, const char *name=nullptr) override
Definition: Serializer.cpp:259
void VisitFullyConnectedLayer(const armnn::IConnectableLayer *layer, const armnn::FullyConnectedDescriptor &fullyConnectedDescriptor, const armnn::ConstTensor &weights, const armnn::Optional< armnn::ConstTensor > &biases, const char *name=nullptr) override
Definition: Serializer.cpp:998
void VisitQuantizedLstmLayer(const armnn::IConnectableLayer *layer, const armnn::QuantizedLstmInputParams &params, const char *name=nullptr) override
A PadDescriptor for the PadLayer.
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:20
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
void VisitLstmLayer(const armnn::IConnectableLayer *layer, const armnn::LstmDescriptor &descriptor, const armnn::LstmInputParams &params, const char *name=nullptr) override
Definition: Serializer.cpp:562
void VisitPreluLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:972
void VisitConstantLayer(const armnn::IConnectableLayer *layer, const armnn::ConstTensor &input, const char *=nullptr) override
Definition: Serializer.cpp:275
void VisitNormalizationLayer(const armnn::IConnectableLayer *layer, const armnn::NormalizationDescriptor &normalizationDescriptor, const char *name=nullptr) override
void VisitConcatLayer(const armnn::IConnectableLayer *layer, const armnn::ConcatDescriptor &concatDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:725
void VisitBatchNormalizationLayer(const armnn::IConnectableLayer *layer, const armnn::BatchNormalizationDescriptor &BatchNormalizationDescriptor, const armnn::ConstTensor &mean, const armnn::ConstTensor &variance, const armnn::ConstTensor &beta, const armnn::ConstTensor &gamma, const char *name=nullptr) override
Definition: Serializer.cpp:228
A L2NormalizationDescriptor for the L2NormalizationLayer.
void VisitSoftmaxLayer(const armnn::IConnectableLayer *layer, const armnn::SoftmaxDescriptor &softmaxDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:921
A ViewsDescriptor for the SplitterLayer. Descriptor to configure the splitting process. Number of Views must be equal to the number of outputs, and their order must match - e.g. first view corresponds to the first output, second view to the second output, etc.
void VisitConvolution2dLayer(const armnn::IConnectableLayer *layer, const armnn::Convolution2dDescriptor &descriptor, const armnn::ConstTensor &weights, const armnn::Optional< armnn::ConstTensor > &biases, const char *=nullptr) override
Definition: Serializer.cpp:296
void VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:987
std::vector< int > & GetInputIds()
Definition: Serializer.hpp:32
void VisitAdditionLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:160
void VisitLogSoftmaxLayer(const armnn::IConnectableLayer *layer, const armnn::LogSoftmaxDescriptor &logSoftmaxDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:538
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
void VisitGatherLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:477
A ReshapeDescriptor for the ReshapeLayer.
void VisitMultiplicationLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:760
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
void VisitMergerLayer(const armnn::IConnectableLayer *layer, const armnn::MergerDescriptor &mergerDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:718
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:82
void VisitMergeLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:708
void VisitMaximumLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:670
void VisitMinimumLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:698
void VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer, const armnn::ArgMinMaxDescriptor &argMinMaxDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:175
void VisitReshapeLayer(const armnn::IConnectableLayer *layer, const armnn::ReshapeDescriptor &reshapeDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:825
void VisitActivationLayer(const armnn::IConnectableLayer *layer, const armnn::ActivationDescriptor &descriptor, const char *name=nullptr) override
Definition: Serializer.cpp:135
void VisitStridedSliceLayer(const armnn::IConnectableLayer *layer, const armnn::StridedSliceDescriptor &stridedSliceDescriptor, const char *name=nullptr) override
void VisitGreaterLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:487
void VisitDetectionPostProcessLayer(const armnn::IConnectableLayer *layer, const armnn::DetectionPostProcessDescriptor &descriptor, const armnn::ConstTensor &anchors, const char *name=nullptr) override
Definition: Serializer.cpp:401
void VisitInputLayer(const armnn::IConnectableLayer *layer, armnn::LayerBindingId id, const char *name=nullptr) override
Definition: Serializer.cpp:83
An LstmDescriptor for the LstmLayer.
void VisitDequantizeLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:390
void VisitMeanLayer(const armnn::IConnectableLayer *layer, const armnn::MeanDescriptor &descriptor, const char *name) override
Definition: Serializer.cpp:680
void VisitSliceLayer(const armnn::IConnectableLayer *layer, const armnn::SliceDescriptor &sliceDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:904
void VisitSwitchLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
void VisitPermuteLayer(const armnn::IConnectableLayer *layer, const armnn::PermuteDescriptor &PermuteDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:797
A FullyConnectedDescriptor for the FullyConnectedLayer.
void VisitStandInLayer(const armnn::IConnectableLayer *layer, const armnn::StandInDescriptor &standInDescriptor, const char *name=nullptr) override
flatbuffers::FlatBufferBuilder & GetFlatBufferBuilder()
Definition: Serializer.hpp:27
A StackDescriptor for the StackLayer.
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
void VisitDepthToSpaceLayer(const armnn::IConnectableLayer *layer, const armnn::DepthToSpaceDescriptor &descriptor, const char *name=nullptr) override
Definition: Serializer.cpp:337
A SoftmaxDescriptor for the SoftmaxLayer.
void VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:467
void VisitPadLayer(const armnn::IConnectableLayer *layer, const armnn::PadDescriptor &PadDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:771
void VisitL2NormalizationLayer(const armnn::IConnectableLayer *layer, const armnn::L2NormalizationDescriptor &l2NormalizationDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:517
void VisitResizeBilinearLayer(const armnn::IConnectableLayer *layer, const armnn::ResizeBilinearDescriptor &resizeDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:851
std::vector< float > anchors({ 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 100.5f, 1.0f, 1.0f })
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
void VisitTransposeConvolution2dLayer(const armnn::IConnectableLayer *layer, const armnn::TransposeConvolution2dDescriptor &descriptor, const armnn::ConstTensor &weights, const armnn::Optional< armnn::ConstTensor > &biases, const char *=nullptr) override
A Pooling2dDescriptor for the Pooling2dLayer.
A StandInDescriptor for the StandIn layer.
A SliceDescriptor for the SliceLayer.
void VisitInstanceNormalizationLayer(const armnn::IConnectableLayer *layer, const armnn::InstanceNormalizationDescriptor &instanceNormalizationDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:497
void VisitOutputLayer(const armnn::IConnectableLayer *layer, armnn::LayerBindingId id, const char *name=nullptr) override
Definition: Serializer.cpp:105
std::vector< int > & GetOutputIds()
Definition: Serializer.hpp:37
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
void VisitElementwiseUnaryLayer(const armnn::IConnectableLayer *layer, const armnn::ElementwiseUnaryDescriptor &descriptor, const char *name=nullptr) override
Definition: Serializer.cpp:442
A PermuteDescriptor for the PermuteLayer.
A Convolution2dDescriptor for the Convolution2dLayer.
A MeanDescriptor for the MeanLayer.
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
void VisitSpaceToDepthLayer(const armnn::IConnectableLayer *layer, const armnn::SpaceToDepthDescriptor &spaceToDepthDescriptor, const char *name=nullptr) override
void VisitSubtractionLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
void VisitEqualLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:457
void VisitResizeLayer(const armnn::IConnectableLayer *layer, const armnn::ResizeDescriptor &resizeDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:872
#define ARMNN_DEPRECATED_MSG(message)
Definition: Deprecated.hpp:43
void VisitDivisionLayer(const armnn::IConnectableLayer *layer, const char *name=nullptr) override
Definition: Serializer.cpp:432
void VisitPooling2dLayer(const armnn::IConnectableLayer *layer, const armnn::Pooling2dDescriptor &pooling2dDescriptor, const char *name=nullptr) override
Definition: Serializer.cpp:943
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:43
std::vector< flatbuffers::Offset< armnnSerializer::AnyLayer > > & GetSerializedLayers()
Definition: Serializer.hpp:42
void VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer *layer, const armnn::BatchToSpaceNdDescriptor &descriptor, const char *name=nullptr) override
Definition: Serializer.cpp:198
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:168
A ResizeDescriptor for the ResizeLayer.
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:62
An OriginsDescriptor for the ConcatLayer. Descriptor to configure the concatenation process...
A StridedSliceDescriptor for the StridedSliceLayer.