blob: 216f4dc016cded802b86b38f1786be2dc157513f [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
Finn Williamsb454c5c2021-02-09 15:56:23 +00007#include <armnn/IStrategy.hpp>
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00008
9#include <armnnSerializer/ISerializer.hpp>
10
Nikhil Raj7dcc6972021-04-30 15:44:24 +010011#include <common/include/ProfilingGuid.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
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000076 uint32_t GetSerializedId(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.
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000099 std::unordered_map<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:
Finn Williamsb454c5c2021-02-09 15:56:23 +0000105 void SerializeActivationLayer(const armnn::IConnectableLayer* layer,
106 const armnn::ActivationDescriptor& descriptor,
107 const char* name = nullptr);
108
109 void SerializeAdditionLayer(const armnn::IConnectableLayer* layer,
110 const char* name = nullptr);
111
112 void SerializeArgMinMaxLayer(const armnn::IConnectableLayer* layer,
113 const armnn::ArgMinMaxDescriptor& argMinMaxDescriptor,
114 const char* name = nullptr);
115
116 void SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
117 const armnn::BatchToSpaceNdDescriptor& descriptor,
118 const char* name = nullptr);
119
120 void SerializeBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
121 const armnn::BatchNormalizationDescriptor& BatchNormalizationDescriptor,
122 const std::vector<armnn::ConstTensor>& constants,
123 const char* name = nullptr);
124
mathad01b392e982021-04-07 12:07:30 +0100125 void SerializeCastLayer(const armnn::IConnectableLayer* layer,
126 const char* name = nullptr);
127
Simon Obute51f67772021-09-03 15:50:13 +0100128 void SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
129 const armnn::ChannelShuffleDescriptor& descriptor,
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,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100141 const std::vector<armnn::ConstTensor>& constants,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000142 const char* name = nullptr);
143
144 void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
145 const armnn::Convolution2dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100146 const char* name = nullptr);
147
148 void SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
149 const armnn::Convolution3dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000150 const char* name = nullptr);
151
152 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
153 const armnn::DepthToSpaceDescriptor& descriptor,
154 const char* name = nullptr);
155
156 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
157 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000158 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
Finn Williamsb454c5c2021-02-09 15:56:23 +0000175 void SerializeFillLayer(const armnn::IConnectableLayer* layer,
176 const armnn::FillDescriptor& fillDescriptor,
177 const char* name = nullptr);
178
179 void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
180 const char *name = nullptr);
181
182 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
183 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000184 const char* name = nullptr);
185
186 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
187 const armnn::GatherDescriptor& gatherDescriptor,
188 const char* name = nullptr);
189
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100190 void SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
191 const char* name = nullptr);
192
Finn Williamsb454c5c2021-02-09 15:56:23 +0000193 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
194 armnn::LayerBindingId id,
195 const char* name = nullptr);
196
197 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
198 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
199 const char* name = nullptr);
200
201 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
202 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
203 const char* name = nullptr);
204
205 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
206 const armnn::LogicalBinaryDescriptor& descriptor,
207 const char* name = nullptr);
208
209 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
210 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
211 const char* name = nullptr);
212
213 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
214 const armnn::LstmDescriptor& descriptor,
215 const std::vector<armnn::ConstTensor>& constants,
216 const char* name = nullptr);
217
218 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
219 const armnn::MeanDescriptor& descriptor,
220 const char* name);
221
222 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
223 const char* name = nullptr);
224
225 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
226 const char* name = nullptr);
227
228 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
229 const char* name = nullptr);
230
Finn Williamsb454c5c2021-02-09 15:56:23 +0000231 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
232 const char* name = nullptr);
233
234 void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
235 armnn::LayerBindingId id,
236 const char* name = nullptr);
237
238 void SerializePadLayer(const armnn::IConnectableLayer* layer,
239 const armnn::PadDescriptor& PadDescriptor,
240 const char* name = nullptr);
241
242 void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
243 const armnn::PermuteDescriptor& PermuteDescriptor,
244 const char* name = nullptr);
245
246 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
247 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
248 const char* name = nullptr);
249
Tamas Nyirid998a1c2021-11-05 14:55:33 +0000250 void SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
251 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
252 const char* name = nullptr);
253
Finn Williamsb454c5c2021-02-09 15:56:23 +0000254 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
Finn Williamsb454c5c2021-02-09 15:56:23 +0000284 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
285 const armnn::SliceDescriptor& sliceDescriptor,
286 const char* name = nullptr);
287
288 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
289 const armnn::SoftmaxDescriptor& softmaxDescriptor,
290 const char* name = nullptr);
291
292 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
293 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
294 const char* name = nullptr);
295
296 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
297 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
298 const char* name = nullptr);
299
300 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
301 const armnn::NormalizationDescriptor& normalizationDescriptor,
302 const char* name = nullptr);
303
Keith Davis3ae3f972021-05-21 16:33:48 +0100304 void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
305 const char* name = nullptr);
306
Finn Williamsb454c5c2021-02-09 15:56:23 +0000307 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
308 const armnn::ViewsDescriptor& viewsDescriptor,
309 const char* name = nullptr);
310
311 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
312 const armnn::StandInDescriptor& standInDescriptor,
313 const char* name = nullptr);
314
315 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
316 const armnn::StackDescriptor& stackDescriptor,
317 const char* name = nullptr);
318
319 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
320 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
321 const char* name = nullptr);
322
323 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
324 const char* name = nullptr);
325
326 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
327 const char* name = nullptr);
328
329 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
330 const armnn::TransposeConvolution2dDescriptor& descriptor,
331 const std::vector<armnn::ConstTensor>& constants,
332 const char* = nullptr);
333
334 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
335 const armnn::TransposeDescriptor& descriptor,
336 const char* name = nullptr);
Narumol Prangnawarata0162e12021-07-23 14:47:49 +0100337
338 void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer,
339 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
340 const std::vector<armnn::ConstTensor>& constants,
341 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000342};
343
Finn Williamsb454c5c2021-02-09 15:56:23 +0000344
345
Finn Williams85d36712021-01-26 22:30:06 +0000346class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000347{
348public:
Finn Williams85d36712021-01-26 22:30:06 +0000349 SerializerImpl() = default;
350 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000351
352 /// Serializes the network to ArmNN SerializedGraph.
353 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000354 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000355
356 /// Serializes the SerializedGraph to the stream.
357 /// @param [stream] the stream to save to
358 /// @return true if graph is Serialized to the Stream, false otherwise
Finn Williams85d36712021-01-26 22:30:06 +0000359 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000360
361private:
362
363 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000364 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000365};
366
Mike Kelly8c1701a2019-02-11 17:01:27 +0000367} //namespace armnnSerializer