blob: c99e87d3e9c0877840cbd1a7639097a2a47bb6e8 [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,
187 const std::vector<armnn::ConstTensor>& constants,
188 const char* name = nullptr);
189
190 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
191 const armnn::GatherDescriptor& gatherDescriptor,
192 const char* name = nullptr);
193
194 ARMNN_DEPRECATED_MSG("Use VisitComparisonLayer instead")
195 void SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr);
196
197 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
198 armnn::LayerBindingId id,
199 const char* name = nullptr);
200
201 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
202 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
203 const char* name = nullptr);
204
205 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
206 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
207 const char* name = nullptr);
208
209 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
210 const armnn::LogicalBinaryDescriptor& descriptor,
211 const char* name = nullptr);
212
213 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
214 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
215 const char* name = nullptr);
216
217 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
218 const armnn::LstmDescriptor& descriptor,
219 const std::vector<armnn::ConstTensor>& constants,
220 const char* name = nullptr);
221
222 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
223 const armnn::MeanDescriptor& descriptor,
224 const char* name);
225
226 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
227 const char* name = nullptr);
228
229 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
230 const char* name = nullptr);
231
232 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
233 const char* name = nullptr);
234
235 ARMNN_DEPRECATED_MSG("Use VisitConcatLayer instead")
236 void SerializeMergerLayer(const armnn::IConnectableLayer* layer,
237 const armnn::MergerDescriptor& mergerDescriptor,
238 const char* name = nullptr);
239
240 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
241 const char* name = nullptr);
242
243 void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
244 armnn::LayerBindingId id,
245 const char* name = nullptr);
246
247 void SerializePadLayer(const armnn::IConnectableLayer* layer,
248 const armnn::PadDescriptor& PadDescriptor,
249 const char* name = nullptr);
250
251 void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
252 const armnn::PermuteDescriptor& PermuteDescriptor,
253 const char* name = nullptr);
254
255 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
256 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
257 const char* name = nullptr);
258
259 void SerializePreluLayer(const armnn::IConnectableLayer* layer,
260 const char* name = nullptr);
261
262 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
263 const char* name = nullptr);
264
265 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
266 const armnn::QLstmDescriptor& descriptor,
267 const std::vector<armnn::ConstTensor>& constants,
268 const char* name = nullptr);
269
270 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
271 const std::vector<armnn::ConstTensor>& constants,
272 const char* name = nullptr);
273
274 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
275 const char* name = nullptr);
276
277 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
278 const armnn::ReduceDescriptor& reduceDescriptor,
279 const char* name = nullptr);
280
281 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
282 const armnn::ReshapeDescriptor& reshapeDescriptor,
283 const char* name = nullptr);
284
285 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
286 const armnn::ResizeDescriptor& resizeDescriptor,
287 const char* name = nullptr);
288
289 ARMNN_DEPRECATED_MSG("Use VisitResizeLayer instead")
290 void SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
291 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
292 const char* name = nullptr);
293
294 ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
295 void SerializeRsqrtLayer(const armnn::IConnectableLayer* layer,
296 const char* name = nullptr);
297
298 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
299 const armnn::SliceDescriptor& sliceDescriptor,
300 const char* name = nullptr);
301
302 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
303 const armnn::SoftmaxDescriptor& softmaxDescriptor,
304 const char* name = nullptr);
305
306 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
307 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
308 const char* name = nullptr);
309
310 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
311 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
312 const char* name = nullptr);
313
314 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
315 const armnn::NormalizationDescriptor& normalizationDescriptor,
316 const char* name = nullptr);
317
Keith Davis3ae3f972021-05-21 16:33:48 +0100318 void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
319 const char* name = nullptr);
320
Finn Williamsb454c5c2021-02-09 15:56:23 +0000321 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
322 const armnn::ViewsDescriptor& viewsDescriptor,
323 const char* name = nullptr);
324
325 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
326 const armnn::StandInDescriptor& standInDescriptor,
327 const char* name = nullptr);
328
329 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
330 const armnn::StackDescriptor& stackDescriptor,
331 const char* name = nullptr);
332
333 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
334 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
335 const char* name = nullptr);
336
337 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
338 const char* name = nullptr);
339
340 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
341 const char* name = nullptr);
342
343 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
344 const armnn::TransposeConvolution2dDescriptor& descriptor,
345 const std::vector<armnn::ConstTensor>& constants,
346 const char* = nullptr);
347
348 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
349 const armnn::TransposeDescriptor& descriptor,
350 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000351};
352
Finn Williamsb454c5c2021-02-09 15:56:23 +0000353
354
Finn Williams85d36712021-01-26 22:30:06 +0000355class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000356{
357public:
Finn Williams85d36712021-01-26 22:30:06 +0000358 SerializerImpl() = default;
359 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000360
361 /// Serializes the network to ArmNN SerializedGraph.
362 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000363 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000364
365 /// Serializes the SerializedGraph to the stream.
366 /// @param [stream] the stream to save to
367 /// @return true if graph is Serialized to the Stream, false otherwise
Finn Williams85d36712021-01-26 22:30:06 +0000368 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000369
370private:
371
372 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000373 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000374};
375
Mike Kelly8c1701a2019-02-11 17:01:27 +0000376} //namespace armnnSerializer