blob: 3905e49cd1bafc804396cefccb9314002a73cca2 [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
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000078 uint32_t GetSerializedId(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.
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000101 std::unordered_map<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:
Finn Williamsb454c5c2021-02-09 15:56:23 +0000107 void SerializeActivationLayer(const armnn::IConnectableLayer* layer,
108 const armnn::ActivationDescriptor& descriptor,
109 const char* name = nullptr);
110
111 void SerializeAdditionLayer(const armnn::IConnectableLayer* layer,
112 const char* name = nullptr);
113
114 void SerializeArgMinMaxLayer(const armnn::IConnectableLayer* layer,
115 const armnn::ArgMinMaxDescriptor& argMinMaxDescriptor,
116 const char* name = nullptr);
117
118 void SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
119 const armnn::BatchToSpaceNdDescriptor& descriptor,
120 const char* name = nullptr);
121
122 void SerializeBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
123 const armnn::BatchNormalizationDescriptor& BatchNormalizationDescriptor,
124 const std::vector<armnn::ConstTensor>& constants,
125 const char* name = nullptr);
126
mathad01b392e982021-04-07 12:07:30 +0100127 void SerializeCastLayer(const armnn::IConnectableLayer* layer,
128 const char* name = nullptr);
129
Simon Obute51f67772021-09-03 15:50:13 +0100130 void SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
131 const armnn::ChannelShuffleDescriptor& descriptor,
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,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100143 const std::vector<armnn::ConstTensor>& constants,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000144 const char* name = nullptr);
145
146 void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
147 const armnn::Convolution2dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100148 const std::vector<armnn::ConstTensor>& constants,
149 const char* name = nullptr);
150
151 void SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
152 const armnn::Convolution3dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000153 const char* name = nullptr);
154
155 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
156 const armnn::DepthToSpaceDescriptor& descriptor,
157 const char* name = nullptr);
158
159 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
160 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
161 const std::vector<armnn::ConstTensor>& constants,
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,
168 const armnn::DetectionPostProcessDescriptor& descriptor,
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 SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
176 const armnn::ElementwiseUnaryDescriptor& descriptor,
177 const char* name = nullptr);
178
Finn Williamsb454c5c2021-02-09 15:56:23 +0000179 void SerializeFillLayer(const armnn::IConnectableLayer* layer,
180 const armnn::FillDescriptor& fillDescriptor,
181 const char* name = nullptr);
182
183 void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
184 const char *name = nullptr);
185
186 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
187 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000188 const char* name = nullptr);
189
190 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
191 const armnn::GatherDescriptor& gatherDescriptor,
192 const char* name = nullptr);
193
Finn Williamsb454c5c2021-02-09 15:56:23 +0000194 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
195 armnn::LayerBindingId id,
196 const char* name = nullptr);
197
198 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
199 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
200 const char* name = nullptr);
201
202 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
203 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
204 const char* name = nullptr);
205
206 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
207 const armnn::LogicalBinaryDescriptor& descriptor,
208 const char* name = nullptr);
209
210 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
211 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
212 const char* name = nullptr);
213
214 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
215 const armnn::LstmDescriptor& descriptor,
216 const std::vector<armnn::ConstTensor>& constants,
217 const char* name = nullptr);
218
219 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
220 const armnn::MeanDescriptor& descriptor,
221 const char* name);
222
223 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
224 const char* name = nullptr);
225
226 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
227 const char* name = nullptr);
228
229 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
230 const char* name = nullptr);
231
Finn Williamsb454c5c2021-02-09 15:56:23 +0000232 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
233 const char* name = nullptr);
234
235 void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
236 armnn::LayerBindingId id,
237 const char* name = nullptr);
238
239 void SerializePadLayer(const armnn::IConnectableLayer* layer,
240 const armnn::PadDescriptor& PadDescriptor,
241 const char* name = nullptr);
242
243 void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
244 const armnn::PermuteDescriptor& PermuteDescriptor,
245 const char* name = nullptr);
246
247 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
248 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
249 const char* name = nullptr);
250
Tamas Nyirid998a1c2021-11-05 14:55:33 +0000251 void SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
252 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
253 const char* name = nullptr);
254
Finn Williamsb454c5c2021-02-09 15:56:23 +0000255 void SerializePreluLayer(const armnn::IConnectableLayer* layer,
256 const char* name = nullptr);
257
258 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
259 const char* name = nullptr);
260
261 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
262 const armnn::QLstmDescriptor& descriptor,
263 const std::vector<armnn::ConstTensor>& constants,
264 const char* name = nullptr);
265
266 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
267 const std::vector<armnn::ConstTensor>& constants,
268 const char* name = nullptr);
269
270 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
271 const char* name = nullptr);
272
273 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
274 const armnn::ReduceDescriptor& reduceDescriptor,
275 const char* name = nullptr);
276
277 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
278 const armnn::ReshapeDescriptor& reshapeDescriptor,
279 const char* name = nullptr);
280
281 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
282 const armnn::ResizeDescriptor& resizeDescriptor,
283 const char* name = nullptr);
284
Finn Williamsb454c5c2021-02-09 15:56:23 +0000285 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
286 const armnn::SliceDescriptor& sliceDescriptor,
287 const char* name = nullptr);
288
289 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
290 const armnn::SoftmaxDescriptor& softmaxDescriptor,
291 const char* name = nullptr);
292
293 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
294 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
295 const char* name = nullptr);
296
297 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
298 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
299 const char* name = nullptr);
300
301 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
302 const armnn::NormalizationDescriptor& normalizationDescriptor,
303 const char* name = nullptr);
304
Keith Davis3ae3f972021-05-21 16:33:48 +0100305 void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
306 const char* name = nullptr);
307
Finn Williamsb454c5c2021-02-09 15:56:23 +0000308 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
309 const armnn::ViewsDescriptor& viewsDescriptor,
310 const char* name = nullptr);
311
312 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
313 const armnn::StandInDescriptor& standInDescriptor,
314 const char* name = nullptr);
315
316 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
317 const armnn::StackDescriptor& stackDescriptor,
318 const char* name = nullptr);
319
320 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
321 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
322 const char* name = nullptr);
323
324 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
325 const char* name = nullptr);
326
327 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
328 const char* name = nullptr);
329
330 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
331 const armnn::TransposeConvolution2dDescriptor& descriptor,
332 const std::vector<armnn::ConstTensor>& constants,
333 const char* = nullptr);
334
335 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
336 const armnn::TransposeDescriptor& descriptor,
337 const char* name = nullptr);
Narumol Prangnawarata0162e12021-07-23 14:47:49 +0100338
339 void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer,
340 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
341 const std::vector<armnn::ConstTensor>& constants,
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