blob: 022cf6459296b2c84f00e763faee2ef651956c3c [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
5#pragma once
6
7#include <armnn/ILayerVisitor.hpp>
Finn Williamsb454c5c2021-02-09 15:56:23 +00008#include <armnn/IStrategy.hpp>
Mike Kelly8c1701a2019-02-11 17:01:27 +00009#include <armnn/LayerVisitorBase.hpp>
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000010
11#include <armnnSerializer/ISerializer.hpp>
12
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000013#include <unordered_map>
14
Sadik Armagan97bf84f2021-01-13 15:06:38 +000015#include "ArmnnSchema_generated.h"
Mike Kelly8c1701a2019-02-11 17:01:27 +000016
janeil013fec1ea2019-11-07 09:47:20 +000017#include <armnn/Types.hpp>
18
Mike Kelly8c1701a2019-02-11 17:01:27 +000019namespace armnnSerializer
20{
21
Finn Williamsb454c5c2021-02-09 15:56:23 +000022class SerializerStrategy : public armnn::IStrategy
Mike Kelly8c1701a2019-02-11 17:01:27 +000023{
24public:
Finn Williamsb454c5c2021-02-09 15:56:23 +000025 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
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) {}
32 ~SerializerStrategy() {}
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000033
34 flatbuffers::FlatBufferBuilder& GetFlatBufferBuilder()
35 {
36 return m_flatBufferBuilder;
37 }
38
Tee Jungaa920c52019-11-05 10:48:25 +000039 std::vector<int>& GetInputIds()
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000040 {
41 return m_inputIds;
42 }
43
Tee Jungaa920c52019-11-05 10:48:25 +000044 std::vector<int>& GetOutputIds()
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000045 {
46 return m_outputIds;
47 }
48
Derek Lamberti0028d1b2019-02-20 13:57:42 +000049 std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>>& GetSerializedLayers()
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000050 {
51 return m_serializedLayers;
52 }
Mike Kelly8c1701a2019-02-11 17:01:27 +000053
Tee Jungaa920c52019-11-05 10:48:25 +000054 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> GetVersionTable();
55
Mike Kelly8c1701a2019-02-11 17:01:27 +000056private:
Mike Kelly8c1701a2019-02-11 17:01:27 +000057 /// Creates the Input Slots and Output Slots and LayerBase for the layer.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000058 flatbuffers::Offset<armnnSerializer::LayerBase> CreateLayerBase(
Mike Kelly8c1701a2019-02-11 17:01:27 +000059 const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +000060 const armnnSerializer::LayerType layerType);
Mike Kelly8c1701a2019-02-11 17:01:27 +000061
62 /// Creates the serializer AnyLayer for the layer and adds it to m_serializedLayers.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000063 void CreateAnyLayer(const flatbuffers::Offset<void>& layer, const armnnSerializer::Layer serializerLayer);
Mike Kelly8c1701a2019-02-11 17:01:27 +000064
Mike Kellya0766c32019-02-19 17:22:07 +000065 /// Creates the serializer ConstTensor for the armnn ConstTensor.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000066 flatbuffers::Offset<armnnSerializer::ConstTensor> CreateConstTensorInfo(
Mike Kellya0766c32019-02-19 17:22:07 +000067 const armnn::ConstTensor& constTensor);
68
Sadik Armagan1a84fe32020-03-27 15:56:57 +000069 /// Creates the serializer TensorInfo for the armnn TensorInfo.
70 flatbuffers::Offset<TensorInfo> CreateTensorInfo(const armnn::TensorInfo& tensorInfo);
71
Mike Kellya0766c32019-02-19 17:22:07 +000072 template <typename T>
73 flatbuffers::Offset<flatbuffers::Vector<T>> CreateDataVector(const void* memory, unsigned int size);
74
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000075 ///Function which maps Guid to an index
janeil013fec1ea2019-11-07 09:47:20 +000076 uint32_t GetSerializedId(armnn::LayerGuid guid);
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000077
Mike Kelly8c1701a2019-02-11 17:01:27 +000078 /// Creates the serializer InputSlots for the layer.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000079 std::vector<flatbuffers::Offset<armnnSerializer::InputSlot>> CreateInputSlots(
Finn Williamsb454c5c2021-02-09 15:56:23 +000080 const armnn::IConnectableLayer* layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +000081
82 /// Creates the serializer OutputSlots for the layer.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000083 std::vector<flatbuffers::Offset<armnnSerializer::OutputSlot>> CreateOutputSlots(
Finn Williamsb454c5c2021-02-09 15:56:23 +000084 const armnn::IConnectableLayer* layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +000085
86 /// FlatBufferBuilder to create our layers' FlatBuffers.
87 flatbuffers::FlatBufferBuilder m_flatBufferBuilder;
88
89 /// AnyLayers required by the SerializedGraph.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000090 std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>> m_serializedLayers;
Mike Kelly8c1701a2019-02-11 17:01:27 +000091
Tee Jungaa920c52019-11-05 10:48:25 +000092 /// Vector of the binding ids of all Input Layers required by the SerializedGraph.
93 std::vector<int> m_inputIds;
Mike Kelly8c1701a2019-02-11 17:01:27 +000094
Tee Jungaa920c52019-11-05 10:48:25 +000095 /// Vector of the binding ids of all Output Layers required by the SerializedGraph.
96 std::vector<int> m_outputIds;
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000097
98 /// Mapped Guids of all Layers to match our index.
janeil013fec1ea2019-11-07 09:47:20 +000099 std::unordered_map<armnn::LayerGuid, uint32_t > m_guidMap;
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100
101 /// layer within our FlatBuffer index.
102 uint32_t m_layerId;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000103
104private:
105 ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
106 void SerializeAbsLayer(const armnn::IConnectableLayer* layer,
107 const char* name = nullptr);
108
109 void SerializeActivationLayer(const armnn::IConnectableLayer* layer,
110 const armnn::ActivationDescriptor& descriptor,
111 const char* name = nullptr);
112
113 void SerializeAdditionLayer(const armnn::IConnectableLayer* layer,
114 const char* name = nullptr);
115
116 void SerializeArgMinMaxLayer(const armnn::IConnectableLayer* layer,
117 const armnn::ArgMinMaxDescriptor& argMinMaxDescriptor,
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
mathad01b392e982021-04-07 12:07:30 +0100129 void SerializeCastLayer(const armnn::IConnectableLayer* layer,
130 const char* name = nullptr);
131
Finn Williamsb454c5c2021-02-09 15:56:23 +0000132 void SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
133 const armnn::ComparisonDescriptor& descriptor,
134 const char* name = nullptr);
135
136 void SerializeConcatLayer(const armnn::IConnectableLayer* layer,
137 const armnn::ConcatDescriptor& concatDescriptor,
138 const char* name = nullptr);
139
140 void SerializeConstantLayer(const armnn::IConnectableLayer* layer,
141 const std::vector<armnn::ConstTensor>& contants,
142 const char* name = nullptr);
143
144 void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
145 const armnn::Convolution2dDescriptor& descriptor,
146 const std::vector<armnn::ConstTensor>& contants,
147 const char* name = nullptr);
148
149 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
150 const armnn::DepthToSpaceDescriptor& descriptor,
151 const char* name = nullptr);
152
153 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
154 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
155 const std::vector<armnn::ConstTensor>& constants,
156 const char* name = nullptr);
157
158 void SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
159 const char* name = nullptr);
160
161 void SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
162 const armnn::DetectionPostProcessDescriptor& descriptor,
163 const std::vector<armnn::ConstTensor>& constants,
164 const char* name = nullptr);
165
166 void SerializeDivisionLayer(const armnn::IConnectableLayer* layer,
167 const char* name = nullptr);
168
169 void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
170 const armnn::ElementwiseUnaryDescriptor& descriptor,
171 const char* name = nullptr);
172
173 ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
174 void SerializeEqualLayer(const armnn::IConnectableLayer* layer, const char* name);
175
176 void SerializeFillLayer(const armnn::IConnectableLayer* layer,
177 const armnn::FillDescriptor& fillDescriptor,
178 const char* name = nullptr);
179
180 void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
181 const char *name = nullptr);
182
183 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
184 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
185 const std::vector<armnn::ConstTensor>& constants,
186 const char* name = nullptr);
187
188 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
189 const armnn::GatherDescriptor& gatherDescriptor,
190 const char* name = nullptr);
191
192 ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
193 void SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr);
194
195 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
196 armnn::LayerBindingId id,
197 const char* name = nullptr);
198
199 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
200 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
201 const char* name = nullptr);
202
203 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
204 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
205 const char* name = nullptr);
206
207 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
208 const armnn::LogicalBinaryDescriptor& descriptor,
209 const char* name = nullptr);
210
211 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
212 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
213 const char* name = nullptr);
214
215 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
216 const armnn::LstmDescriptor& descriptor,
217 const std::vector<armnn::ConstTensor>& constants,
218 const char* name = nullptr);
219
220 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
221 const armnn::MeanDescriptor& descriptor,
222 const char* name);
223
224 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
225 const char* name = nullptr);
226
227 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
228 const char* name = nullptr);
229
230 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
231 const char* name = nullptr);
232
233 ARMNN_DEPRECATED_MSG("Use VisitConcatLayer instead")
234 void SerializeMergerLayer(const armnn::IConnectableLayer* layer,
235 const armnn::MergerDescriptor& mergerDescriptor,
236 const char* name = nullptr);
237
238 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
239 const char* name = nullptr);
240
241 void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
242 armnn::LayerBindingId id,
243 const char* name = nullptr);
244
245 void SerializePadLayer(const armnn::IConnectableLayer* layer,
246 const armnn::PadDescriptor& PadDescriptor,
247 const char* name = nullptr);
248
249 void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
250 const armnn::PermuteDescriptor& PermuteDescriptor,
251 const char* name = nullptr);
252
253 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
254 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
255 const char* name = nullptr);
256
257 void SerializePreluLayer(const armnn::IConnectableLayer* layer,
258 const char* name = nullptr);
259
260 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
261 const char* name = nullptr);
262
263 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
264 const armnn::QLstmDescriptor& descriptor,
265 const std::vector<armnn::ConstTensor>& constants,
266 const char* name = nullptr);
267
268 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
269 const std::vector<armnn::ConstTensor>& constants,
270 const char* name = nullptr);
271
272 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
273 const char* name = nullptr);
274
275 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
276 const armnn::ReduceDescriptor& reduceDescriptor,
277 const char* name = nullptr);
278
279 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
280 const armnn::ReshapeDescriptor& reshapeDescriptor,
281 const char* name = nullptr);
282
283 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
284 const armnn::ResizeDescriptor& resizeDescriptor,
285 const char* name = nullptr);
286
287 ARMNN_DEPRECATED_MSG("Use VisitResizeLayer instead")
288 void SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
289 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
290 const char* name = nullptr);
291
292 ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
293 void SerializeRsqrtLayer(const armnn::IConnectableLayer* layer,
294 const char* name = nullptr);
295
296 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
297 const armnn::SliceDescriptor& sliceDescriptor,
298 const char* name = nullptr);
299
300 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
301 const armnn::SoftmaxDescriptor& softmaxDescriptor,
302 const char* name = nullptr);
303
304 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
305 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
306 const char* name = nullptr);
307
308 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
309 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
310 const char* name = nullptr);
311
312 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
313 const armnn::NormalizationDescriptor& normalizationDescriptor,
314 const char* name = nullptr);
315
316 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
317 const armnn::ViewsDescriptor& viewsDescriptor,
318 const char* name = nullptr);
319
320 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
321 const armnn::StandInDescriptor& standInDescriptor,
322 const char* name = nullptr);
323
324 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
325 const armnn::StackDescriptor& stackDescriptor,
326 const char* name = nullptr);
327
328 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
329 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
330 const char* name = nullptr);
331
332 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
333 const char* name = nullptr);
334
335 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
336 const char* name = nullptr);
337
338 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
339 const armnn::TransposeConvolution2dDescriptor& descriptor,
340 const std::vector<armnn::ConstTensor>& constants,
341 const char* = nullptr);
342
343 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
344 const armnn::TransposeDescriptor& descriptor,
345 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000346};
347
Finn Williamsb454c5c2021-02-09 15:56:23 +0000348
349
Finn Williams85d36712021-01-26 22:30:06 +0000350class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000351{
352public:
Finn Williams85d36712021-01-26 22:30:06 +0000353 SerializerImpl() = default;
354 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000355
356 /// Serializes the network to ArmNN SerializedGraph.
357 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000358 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000359
360 /// Serializes the SerializedGraph to the stream.
361 /// @param [stream] the stream to save to
362 /// @return true if graph is Serialized to the Stream, false otherwise
Finn Williams85d36712021-01-26 22:30:06 +0000363 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000364
365private:
366
367 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000368 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000369};
370
Mike Kelly8c1701a2019-02-11 17:01:27 +0000371} //namespace armnnSerializer