blob: afff66e21ab69bc100455f54bed564aae6197bda [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Mike Kelly3ec30772023-03-08 13:47:17 +00002// Copyright © 2017,2019-2023 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
Samuel Yapa04f4a12022-08-19 11:14:38 +0100116 void SerializeBatchMatMulLayer(const armnn::IConnectableLayer* layer,
117 const armnn::BatchMatMulDescriptor& descriptor,
118 const char* name = nullptr);
119
Finn Williamsb454c5c2021-02-09 15:56:23 +0000120 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
mathad01b392e982021-04-07 12:07:30 +0100129 void SerializeCastLayer(const armnn::IConnectableLayer* layer,
130 const char* name = nullptr);
131
Simon Obute51f67772021-09-03 15:50:13 +0100132 void SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
133 const armnn::ChannelShuffleDescriptor& descriptor,
134 const char* name = nullptr);
135
Finn Williamsb454c5c2021-02-09 15:56:23 +0000136 void SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
137 const armnn::ComparisonDescriptor& descriptor,
138 const char* name = nullptr);
139
140 void SerializeConcatLayer(const armnn::IConnectableLayer* layer,
141 const armnn::ConcatDescriptor& concatDescriptor,
142 const char* name = nullptr);
143
144 void SerializeConstantLayer(const armnn::IConnectableLayer* layer,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100145 const std::vector<armnn::ConstTensor>& constants,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000146 const char* name = nullptr);
147
148 void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
149 const armnn::Convolution2dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100150 const char* name = nullptr);
151
152 void SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
153 const armnn::Convolution3dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000154 const char* name = nullptr);
155
156 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
157 const armnn::DepthToSpaceDescriptor& descriptor,
158 const char* name = nullptr);
159
160 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
161 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000162 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
Mike Kelly3ec30772023-03-08 13:47:17 +0000175 void SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer,
176 const armnn::ElementwiseBinaryDescriptor& descriptor,
177 const char* name = nullptr);
178
Finn Williamsb454c5c2021-02-09 15:56:23 +0000179 void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
180 const armnn::ElementwiseUnaryDescriptor& descriptor,
181 const char* name = nullptr);
182
Finn Williamsb454c5c2021-02-09 15:56:23 +0000183 void SerializeFillLayer(const armnn::IConnectableLayer* layer,
184 const armnn::FillDescriptor& fillDescriptor,
185 const char* name = nullptr);
186
187 void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
188 const char *name = nullptr);
189
190 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
191 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000192 const char* name = nullptr);
193
194 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
195 const armnn::GatherDescriptor& gatherDescriptor,
196 const char* name = nullptr);
197
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100198 void SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
199 const char* name = nullptr);
200
Finn Williamsb454c5c2021-02-09 15:56:23 +0000201 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
202 armnn::LayerBindingId id,
203 const char* name = nullptr);
204
205 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
206 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
207 const char* name = nullptr);
208
209 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
210 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
211 const char* name = nullptr);
212
213 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
214 const armnn::LogicalBinaryDescriptor& descriptor,
215 const char* name = nullptr);
216
217 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
218 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
219 const char* name = nullptr);
220
221 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
222 const armnn::LstmDescriptor& descriptor,
223 const std::vector<armnn::ConstTensor>& constants,
224 const char* name = nullptr);
225
226 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
227 const armnn::MeanDescriptor& descriptor,
228 const char* name);
229
230 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
231 const char* name = nullptr);
232
233 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
234 const char* name = nullptr);
235
236 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
237 const char* name = nullptr);
238
Finn Williamsb454c5c2021-02-09 15:56:23 +0000239 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
Tamas Nyirid998a1c2021-11-05 14:55:33 +0000258 void SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
259 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
260 const char* name = nullptr);
261
Finn Williamsb454c5c2021-02-09 15:56:23 +0000262 void SerializePreluLayer(const armnn::IConnectableLayer* layer,
263 const char* name = nullptr);
264
265 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
266 const char* name = nullptr);
267
268 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
269 const armnn::QLstmDescriptor& descriptor,
270 const std::vector<armnn::ConstTensor>& constants,
271 const char* name = nullptr);
272
273 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
274 const std::vector<armnn::ConstTensor>& constants,
275 const char* name = nullptr);
276
277 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
278 const char* name = nullptr);
279
280 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
281 const armnn::ReduceDescriptor& reduceDescriptor,
282 const char* name = nullptr);
283
284 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
285 const armnn::ReshapeDescriptor& reshapeDescriptor,
286 const char* name = nullptr);
287
288 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
289 const armnn::ResizeDescriptor& resizeDescriptor,
290 const char* name = nullptr);
291
Tracy Narine944fb502023-07-04 15:08:57 +0100292 void SerializeReverseV2Layer(const armnn::IConnectableLayer* layer,
Tracy Narine944fb502023-07-04 15:08:57 +0100293 const char* name = nullptr);
294
Finn Williamsb454c5c2021-02-09 15:56:23 +0000295 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
296 const armnn::SliceDescriptor& sliceDescriptor,
297 const char* name = nullptr);
298
299 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
300 const armnn::SoftmaxDescriptor& softmaxDescriptor,
301 const char* name = nullptr);
302
303 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
304 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
305 const char* name = nullptr);
306
307 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
308 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
309 const char* name = nullptr);
310
311 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
312 const armnn::NormalizationDescriptor& normalizationDescriptor,
313 const char* name = nullptr);
314
Keith Davis3ae3f972021-05-21 16:33:48 +0100315 void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
316 const char* name = nullptr);
317
Finn Williamsb454c5c2021-02-09 15:56:23 +0000318 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
319 const armnn::ViewsDescriptor& viewsDescriptor,
320 const char* name = nullptr);
321
322 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
323 const armnn::StandInDescriptor& standInDescriptor,
324 const char* name = nullptr);
325
326 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
327 const armnn::StackDescriptor& stackDescriptor,
328 const char* name = nullptr);
329
330 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
331 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
332 const char* name = nullptr);
333
334 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
335 const char* name = nullptr);
336
337 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
338 const char* name = nullptr);
339
David Monahan616b22f2023-07-25 12:08:10 +0100340 void SerializeTileLayer(const armnn::IConnectableLayer* layer,
341 const armnn::TileDescriptor& descriptor,
342 const char* name);
343
Finn Williamsb454c5c2021-02-09 15:56:23 +0000344 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
345 const armnn::TransposeConvolution2dDescriptor& descriptor,
346 const std::vector<armnn::ConstTensor>& constants,
347 const char* = nullptr);
348
349 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
350 const armnn::TransposeDescriptor& descriptor,
351 const char* name = nullptr);
Narumol Prangnawarata0162e12021-07-23 14:47:49 +0100352
353 void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer,
354 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
355 const std::vector<armnn::ConstTensor>& constants,
356 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000357};
358
Finn Williamsb454c5c2021-02-09 15:56:23 +0000359
360
Finn Williams85d36712021-01-26 22:30:06 +0000361class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000362{
363public:
Finn Williams85d36712021-01-26 22:30:06 +0000364 SerializerImpl() = default;
365 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000366
367 /// Serializes the network to ArmNN SerializedGraph.
368 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000369 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000370
371 /// Serializes the SerializedGraph to the stream.
372 /// @param [stream] the stream to save to
373 /// @return true if graph is Serialized to the Stream, false otherwise
Finn Williams85d36712021-01-26 22:30:06 +0000374 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000375
376private:
377
378 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000379 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000380};
381
Mike Kelly8c1701a2019-02-11 17:01:27 +0000382} //namespace armnnSerializer