blob: 18b2cc77aca64565407a4c2a665c610e18c6c191 [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
Nikhil Raj7dcc6972021-04-30 15:44:24 +010013#include <common/include/ProfilingGuid.hpp>
14
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000015#include <unordered_map>
16
Sadik Armagan97bf84f2021-01-13 15:06:38 +000017#include "ArmnnSchema_generated.h"
Mike Kelly8c1701a2019-02-11 17:01:27 +000018
janeil013fec1ea2019-11-07 09:47:20 +000019#include <armnn/Types.hpp>
20
Mike Kelly8c1701a2019-02-11 17:01:27 +000021namespace armnnSerializer
22{
23
Finn Williamsb454c5c2021-02-09 15:56:23 +000024class SerializerStrategy : public armnn::IStrategy
Mike Kelly8c1701a2019-02-11 17:01:27 +000025{
26public:
Finn Williamsb454c5c2021-02-09 15:56:23 +000027 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) {}
34 ~SerializerStrategy() {}
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000035
36 flatbuffers::FlatBufferBuilder& GetFlatBufferBuilder()
37 {
38 return m_flatBufferBuilder;
39 }
40
Tee Jungaa920c52019-11-05 10:48:25 +000041 std::vector<int>& GetInputIds()
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000042 {
43 return m_inputIds;
44 }
45
Tee Jungaa920c52019-11-05 10:48:25 +000046 std::vector<int>& GetOutputIds()
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000047 {
48 return m_outputIds;
49 }
50
Derek Lamberti0028d1b2019-02-20 13:57:42 +000051 std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>>& GetSerializedLayers()
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +000052 {
53 return m_serializedLayers;
54 }
Mike Kelly8c1701a2019-02-11 17:01:27 +000055
Tee Jungaa920c52019-11-05 10:48:25 +000056 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> GetVersionTable();
57
Mike Kelly8c1701a2019-02-11 17:01:27 +000058private:
Mike Kelly8c1701a2019-02-11 17:01:27 +000059 /// Creates the Input Slots and Output Slots and LayerBase for the layer.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000060 flatbuffers::Offset<armnnSerializer::LayerBase> CreateLayerBase(
Mike Kelly8c1701a2019-02-11 17:01:27 +000061 const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +000062 const armnnSerializer::LayerType layerType);
Mike Kelly8c1701a2019-02-11 17:01:27 +000063
64 /// Creates the serializer AnyLayer for the layer and adds it to m_serializedLayers.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000065 void CreateAnyLayer(const flatbuffers::Offset<void>& layer, const armnnSerializer::Layer serializerLayer);
Mike Kelly8c1701a2019-02-11 17:01:27 +000066
Mike Kellya0766c32019-02-19 17:22:07 +000067 /// Creates the serializer ConstTensor for the armnn ConstTensor.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000068 flatbuffers::Offset<armnnSerializer::ConstTensor> CreateConstTensorInfo(
Mike Kellya0766c32019-02-19 17:22:07 +000069 const armnn::ConstTensor& constTensor);
70
Sadik Armagan1a84fe32020-03-27 15:56:57 +000071 /// Creates the serializer TensorInfo for the armnn TensorInfo.
72 flatbuffers::Offset<TensorInfo> CreateTensorInfo(const armnn::TensorInfo& tensorInfo);
73
Mike Kellya0766c32019-02-19 17:22:07 +000074 template <typename T>
75 flatbuffers::Offset<flatbuffers::Vector<T>> CreateDataVector(const void* memory, unsigned int size);
76
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000077 ///Function which maps Guid to an index
janeil013fec1ea2019-11-07 09:47:20 +000078 uint32_t GetSerializedId(armnn::LayerGuid guid);
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000079
Mike Kelly8c1701a2019-02-11 17:01:27 +000080 /// Creates the serializer InputSlots for the layer.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000081 std::vector<flatbuffers::Offset<armnnSerializer::InputSlot>> CreateInputSlots(
Finn Williamsb454c5c2021-02-09 15:56:23 +000082 const armnn::IConnectableLayer* layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +000083
84 /// Creates the serializer OutputSlots for the layer.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000085 std::vector<flatbuffers::Offset<armnnSerializer::OutputSlot>> CreateOutputSlots(
Finn Williamsb454c5c2021-02-09 15:56:23 +000086 const armnn::IConnectableLayer* layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +000087
88 /// FlatBufferBuilder to create our layers' FlatBuffers.
89 flatbuffers::FlatBufferBuilder m_flatBufferBuilder;
90
91 /// AnyLayers required by the SerializedGraph.
Derek Lamberti0028d1b2019-02-20 13:57:42 +000092 std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>> m_serializedLayers;
Mike Kelly8c1701a2019-02-11 17:01:27 +000093
Tee Jungaa920c52019-11-05 10:48:25 +000094 /// Vector of the binding ids of all Input Layers required by the SerializedGraph.
95 std::vector<int> m_inputIds;
Mike Kelly8c1701a2019-02-11 17:01:27 +000096
Tee Jungaa920c52019-11-05 10:48:25 +000097 /// Vector of the binding ids of all Output Layers required by the SerializedGraph.
98 std::vector<int> m_outputIds;
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000099
100 /// Mapped Guids of all Layers to match our index.
janeil013fec1ea2019-11-07 09:47:20 +0000101 std::unordered_map<armnn::LayerGuid, uint32_t > m_guidMap;
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000102
103 /// layer within our FlatBuffer index.
104 uint32_t m_layerId;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000105
106private:
107 ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
108 void SerializeAbsLayer(const armnn::IConnectableLayer* layer,
109 const char* name = nullptr);
110
111 void SerializeActivationLayer(const armnn::IConnectableLayer* layer,
112 const armnn::ActivationDescriptor& descriptor,
113 const char* name = nullptr);
114
115 void SerializeAdditionLayer(const armnn::IConnectableLayer* layer,
116 const char* name = nullptr);
117
118 void SerializeArgMinMaxLayer(const armnn::IConnectableLayer* layer,
119 const armnn::ArgMinMaxDescriptor& argMinMaxDescriptor,
120 const char* name = nullptr);
121
122 void SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
123 const armnn::BatchToSpaceNdDescriptor& descriptor,
124 const char* name = nullptr);
125
126 void SerializeBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
127 const armnn::BatchNormalizationDescriptor& BatchNormalizationDescriptor,
128 const std::vector<armnn::ConstTensor>& constants,
129 const char* name = nullptr);
130
mathad01b392e982021-04-07 12:07:30 +0100131 void SerializeCastLayer(const armnn::IConnectableLayer* layer,
132 const char* name = nullptr);
133
Finn Williamsb454c5c2021-02-09 15:56:23 +0000134 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>& contants,
144 const char* name = nullptr);
145
146 void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
147 const armnn::Convolution2dDescriptor& descriptor,
148 const std::vector<armnn::ConstTensor>& contants,
149 const char* name = nullptr);
150
151 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
152 const armnn::DepthToSpaceDescriptor& descriptor,
153 const char* name = nullptr);
154
155 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
156 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
157 const std::vector<armnn::ConstTensor>& constants,
158 const char* name = nullptr);
159
160 void SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
161 const char* name = nullptr);
162
163 void SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
164 const armnn::DetectionPostProcessDescriptor& descriptor,
165 const std::vector<armnn::ConstTensor>& constants,
166 const char* name = nullptr);
167
168 void SerializeDivisionLayer(const armnn::IConnectableLayer* layer,
169 const char* name = nullptr);
170
171 void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
172 const armnn::ElementwiseUnaryDescriptor& descriptor,
173 const char* name = nullptr);
174
175 ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
176 void SerializeEqualLayer(const armnn::IConnectableLayer* layer, const char* name);
177
178 void SerializeFillLayer(const armnn::IConnectableLayer* layer,
179 const armnn::FillDescriptor& fillDescriptor,
180 const char* name = nullptr);
181
182 void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
183 const char *name = nullptr);
184
185 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
186 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000187 const char* name = nullptr);
188
189 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
190 const armnn::GatherDescriptor& gatherDescriptor,
191 const char* name = nullptr);
192
193 ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
194 void SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr);
195
196 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
197 armnn::LayerBindingId id,
198 const char* name = nullptr);
199
200 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
201 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
202 const char* name = nullptr);
203
204 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
205 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
206 const char* name = nullptr);
207
208 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
209 const armnn::LogicalBinaryDescriptor& descriptor,
210 const char* name = nullptr);
211
212 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
213 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
214 const char* name = nullptr);
215
216 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
217 const armnn::LstmDescriptor& descriptor,
218 const std::vector<armnn::ConstTensor>& constants,
219 const char* name = nullptr);
220
221 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
222 const armnn::MeanDescriptor& descriptor,
223 const char* name);
224
225 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
226 const char* name = nullptr);
227
228 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
229 const char* name = nullptr);
230
231 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
232 const char* name = nullptr);
233
234 ARMNN_DEPRECATED_MSG("Use VisitConcatLayer instead")
235 void SerializeMergerLayer(const armnn::IConnectableLayer* layer,
236 const armnn::MergerDescriptor& mergerDescriptor,
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,
243 armnn::LayerBindingId id,
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 SerializePreluLayer(const armnn::IConnectableLayer* layer,
259 const char* name = nullptr);
260
261 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
262 const char* name = nullptr);
263
264 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
265 const armnn::QLstmDescriptor& descriptor,
266 const std::vector<armnn::ConstTensor>& constants,
267 const char* name = nullptr);
268
269 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
270 const std::vector<armnn::ConstTensor>& constants,
271 const char* name = nullptr);
272
273 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
274 const char* name = nullptr);
275
276 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
277 const armnn::ReduceDescriptor& reduceDescriptor,
278 const char* name = nullptr);
279
280 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
281 const armnn::ReshapeDescriptor& reshapeDescriptor,
282 const char* name = nullptr);
283
284 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
285 const armnn::ResizeDescriptor& resizeDescriptor,
286 const char* name = nullptr);
287
288 ARMNN_DEPRECATED_MSG("Use VisitResizeLayer instead")
289 void SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
290 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
291 const char* name = nullptr);
292
293 ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
294 void SerializeRsqrtLayer(const armnn::IConnectableLayer* layer,
295 const char* name = nullptr);
296
297 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
298 const armnn::SliceDescriptor& sliceDescriptor,
299 const char* name = nullptr);
300
301 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
302 const armnn::SoftmaxDescriptor& softmaxDescriptor,
303 const char* name = nullptr);
304
305 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
306 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
307 const char* name = nullptr);
308
309 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
310 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
311 const char* name = nullptr);
312
313 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
314 const armnn::NormalizationDescriptor& normalizationDescriptor,
315 const char* name = nullptr);
316
Keith Davis3ae3f972021-05-21 16:33:48 +0100317 void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
318 const char* name = nullptr);
319
Finn Williamsb454c5c2021-02-09 15:56:23 +0000320 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
321 const armnn::ViewsDescriptor& viewsDescriptor,
322 const char* name = nullptr);
323
324 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
325 const armnn::StandInDescriptor& standInDescriptor,
326 const char* name = nullptr);
327
328 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
329 const armnn::StackDescriptor& stackDescriptor,
330 const char* name = nullptr);
331
332 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
333 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
334 const char* name = nullptr);
335
336 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
337 const char* name = nullptr);
338
339 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
340 const char* name = nullptr);
341
342 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
343 const armnn::TransposeConvolution2dDescriptor& descriptor,
344 const std::vector<armnn::ConstTensor>& constants,
345 const char* = nullptr);
346
347 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
348 const armnn::TransposeDescriptor& descriptor,
349 const char* name = nullptr);
Narumol Prangnawarata0162e12021-07-23 14:47:49 +0100350
351 void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer,
352 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
353 const std::vector<armnn::ConstTensor>& constants,
354 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000355};
356
Finn Williamsb454c5c2021-02-09 15:56:23 +0000357
358
Finn Williams85d36712021-01-26 22:30:06 +0000359class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000360{
361public:
Finn Williams85d36712021-01-26 22:30:06 +0000362 SerializerImpl() = default;
363 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000364
365 /// Serializes the network to ArmNN SerializedGraph.
366 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000367 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000368
369 /// Serializes the SerializedGraph to the stream.
370 /// @param [stream] the stream to save to
371 /// @return true if graph is Serialized to the Stream, false otherwise
Finn Williams85d36712021-01-26 22:30:06 +0000372 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000373
374private:
375
376 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000377 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000378};
379
Mike Kelly8c1701a2019-02-11 17:01:27 +0000380} //namespace armnnSerializer