blob: 7226006ceaf8c2af7166b46dfbb1c1c2aa14a0b6 [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
129 void SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
130 const armnn::ComparisonDescriptor& descriptor,
131 const char* name = nullptr);
132
133 void SerializeConcatLayer(const armnn::IConnectableLayer* layer,
134 const armnn::ConcatDescriptor& concatDescriptor,
135 const char* name = nullptr);
136
137 void SerializeConstantLayer(const armnn::IConnectableLayer* layer,
138 const std::vector<armnn::ConstTensor>& contants,
139 const char* name = nullptr);
140
141 void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
142 const armnn::Convolution2dDescriptor& descriptor,
143 const std::vector<armnn::ConstTensor>& contants,
144 const char* name = nullptr);
145
146 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
147 const armnn::DepthToSpaceDescriptor& descriptor,
148 const char* name = nullptr);
149
150 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
151 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
152 const std::vector<armnn::ConstTensor>& constants,
153 const char* name = nullptr);
154
155 void SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
156 const char* name = nullptr);
157
158 void SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
159 const armnn::DetectionPostProcessDescriptor& descriptor,
160 const std::vector<armnn::ConstTensor>& constants,
161 const char* name = nullptr);
162
163 void SerializeDivisionLayer(const armnn::IConnectableLayer* layer,
164 const char* name = nullptr);
165
166 void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
167 const armnn::ElementwiseUnaryDescriptor& descriptor,
168 const char* name = nullptr);
169
170 ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
171 void SerializeEqualLayer(const armnn::IConnectableLayer* layer, const char* name);
172
173 void SerializeFillLayer(const armnn::IConnectableLayer* layer,
174 const armnn::FillDescriptor& fillDescriptor,
175 const char* name = nullptr);
176
177 void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
178 const char *name = nullptr);
179
180 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
181 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
182 const std::vector<armnn::ConstTensor>& constants,
183 const char* name = nullptr);
184
185 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
186 const armnn::GatherDescriptor& gatherDescriptor,
187 const char* name = nullptr);
188
189 ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
190 void SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr);
191
192 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
193 armnn::LayerBindingId id,
194 const char* name = nullptr);
195
196 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
197 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
198 const char* name = nullptr);
199
200 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
201 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
202 const char* name = nullptr);
203
204 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
205 const armnn::LogicalBinaryDescriptor& descriptor,
206 const char* name = nullptr);
207
208 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
209 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
210 const char* name = nullptr);
211
212 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
213 const armnn::LstmDescriptor& descriptor,
214 const std::vector<armnn::ConstTensor>& constants,
215 const char* name = nullptr);
216
217 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
218 const armnn::MeanDescriptor& descriptor,
219 const char* name);
220
221 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
222 const char* name = nullptr);
223
224 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
225 const char* name = nullptr);
226
227 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
228 const char* name = nullptr);
229
230 ARMNN_DEPRECATED_MSG("Use VisitConcatLayer instead")
231 void SerializeMergerLayer(const armnn::IConnectableLayer* layer,
232 const armnn::MergerDescriptor& mergerDescriptor,
233 const char* name = nullptr);
234
235 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
236 const char* name = nullptr);
237
238 void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
239 armnn::LayerBindingId id,
240 const char* name = nullptr);
241
242 void SerializePadLayer(const armnn::IConnectableLayer* layer,
243 const armnn::PadDescriptor& PadDescriptor,
244 const char* name = nullptr);
245
246 void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
247 const armnn::PermuteDescriptor& PermuteDescriptor,
248 const char* name = nullptr);
249
250 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
251 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
252 const char* name = nullptr);
253
254 void SerializePreluLayer(const armnn::IConnectableLayer* layer,
255 const char* name = nullptr);
256
257 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
258 const char* name = nullptr);
259
260 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
261 const armnn::QLstmDescriptor& descriptor,
262 const std::vector<armnn::ConstTensor>& constants,
263 const char* name = nullptr);
264
265 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
266 const std::vector<armnn::ConstTensor>& constants,
267 const char* name = nullptr);
268
269 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
270 const char* name = nullptr);
271
272 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
273 const armnn::ReduceDescriptor& reduceDescriptor,
274 const char* name = nullptr);
275
276 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
277 const armnn::ReshapeDescriptor& reshapeDescriptor,
278 const char* name = nullptr);
279
280 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
281 const armnn::ResizeDescriptor& resizeDescriptor,
282 const char* name = nullptr);
283
284 ARMNN_DEPRECATED_MSG("Use VisitResizeLayer instead")
285 void SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
286 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
287 const char* name = nullptr);
288
289 ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
290 void SerializeRsqrtLayer(const armnn::IConnectableLayer* layer,
291 const char* name = nullptr);
292
293 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
294 const armnn::SliceDescriptor& sliceDescriptor,
295 const char* name = nullptr);
296
297 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
298 const armnn::SoftmaxDescriptor& softmaxDescriptor,
299 const char* name = nullptr);
300
301 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
302 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
303 const char* name = nullptr);
304
305 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
306 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
307 const char* name = nullptr);
308
309 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
310 const armnn::NormalizationDescriptor& normalizationDescriptor,
311 const char* name = nullptr);
312
313 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
314 const armnn::ViewsDescriptor& viewsDescriptor,
315 const char* name = nullptr);
316
317 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
318 const armnn::StandInDescriptor& standInDescriptor,
319 const char* name = nullptr);
320
321 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
322 const armnn::StackDescriptor& stackDescriptor,
323 const char* name = nullptr);
324
325 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
326 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
327 const char* name = nullptr);
328
329 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
330 const char* name = nullptr);
331
332 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
333 const char* name = nullptr);
334
335 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
336 const armnn::TransposeConvolution2dDescriptor& descriptor,
337 const std::vector<armnn::ConstTensor>& constants,
338 const char* = nullptr);
339
340 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
341 const armnn::TransposeDescriptor& descriptor,
342 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000343};
344
Finn Williamsb454c5c2021-02-09 15:56:23 +0000345
346
Finn Williams85d36712021-01-26 22:30:06 +0000347class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000348{
349public:
Finn Williams85d36712021-01-26 22:30:06 +0000350 SerializerImpl() = default;
351 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000352
353 /// Serializes the network to ArmNN SerializedGraph.
354 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000355 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000356
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
Finn Williams85d36712021-01-26 22:30:06 +0000360 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000361
362private:
363
364 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000365 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000366};
367
Mike Kelly8c1701a2019-02-11 17:01:27 +0000368} //namespace armnnSerializer