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