blob: afde778dc2f9f82c59da09629cf5ed3d656f1762 [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,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000161 const char* name = nullptr);
162
163 void SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
164 const char* name = nullptr);
165
166 void SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
167 const armnn::DetectionPostProcessDescriptor& descriptor,
168 const std::vector<armnn::ConstTensor>& constants,
169 const char* name = nullptr);
170
171 void SerializeDivisionLayer(const armnn::IConnectableLayer* layer,
172 const char* name = nullptr);
173
174 void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
175 const armnn::ElementwiseUnaryDescriptor& descriptor,
176 const char* name = nullptr);
177
Finn Williamsb454c5c2021-02-09 15:56:23 +0000178 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
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100193 void SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
194 const char* name = nullptr);
195
Finn Williamsb454c5c2021-02-09 15:56:23 +0000196 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
Finn Williamsb454c5c2021-02-09 15:56:23 +0000234 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
235 const char* name = nullptr);
236
237 void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
238 armnn::LayerBindingId id,
239 const char* name = nullptr);
240
241 void SerializePadLayer(const armnn::IConnectableLayer* layer,
242 const armnn::PadDescriptor& PadDescriptor,
243 const char* name = nullptr);
244
245 void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
246 const armnn::PermuteDescriptor& PermuteDescriptor,
247 const char* name = nullptr);
248
249 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
250 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
251 const char* name = nullptr);
252
Tamas Nyirid998a1c2021-11-05 14:55:33 +0000253 void SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
254 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
255 const char* name = nullptr);
256
Finn Williamsb454c5c2021-02-09 15:56:23 +0000257 void SerializePreluLayer(const armnn::IConnectableLayer* layer,
258 const char* name = nullptr);
259
260 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
261 const char* name = nullptr);
262
263 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
264 const armnn::QLstmDescriptor& descriptor,
265 const std::vector<armnn::ConstTensor>& constants,
266 const char* name = nullptr);
267
268 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
269 const std::vector<armnn::ConstTensor>& constants,
270 const char* name = nullptr);
271
272 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
273 const char* name = nullptr);
274
275 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
276 const armnn::ReduceDescriptor& reduceDescriptor,
277 const char* name = nullptr);
278
279 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
280 const armnn::ReshapeDescriptor& reshapeDescriptor,
281 const char* name = nullptr);
282
283 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
284 const armnn::ResizeDescriptor& resizeDescriptor,
285 const char* name = nullptr);
286
Finn Williamsb454c5c2021-02-09 15:56:23 +0000287 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
288 const armnn::SliceDescriptor& sliceDescriptor,
289 const char* name = nullptr);
290
291 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
292 const armnn::SoftmaxDescriptor& softmaxDescriptor,
293 const char* name = nullptr);
294
295 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
296 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
297 const char* name = nullptr);
298
299 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
300 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
301 const char* name = nullptr);
302
303 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
304 const armnn::NormalizationDescriptor& normalizationDescriptor,
305 const char* name = nullptr);
306
Keith Davis3ae3f972021-05-21 16:33:48 +0100307 void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
308 const char* name = nullptr);
309
Finn Williamsb454c5c2021-02-09 15:56:23 +0000310 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
311 const armnn::ViewsDescriptor& viewsDescriptor,
312 const char* name = nullptr);
313
314 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
315 const armnn::StandInDescriptor& standInDescriptor,
316 const char* name = nullptr);
317
318 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
319 const armnn::StackDescriptor& stackDescriptor,
320 const char* name = nullptr);
321
322 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
323 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
324 const char* name = nullptr);
325
326 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
327 const char* name = nullptr);
328
329 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
330 const char* name = nullptr);
331
332 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
333 const armnn::TransposeConvolution2dDescriptor& descriptor,
334 const std::vector<armnn::ConstTensor>& constants,
335 const char* = nullptr);
336
337 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
338 const armnn::TransposeDescriptor& descriptor,
339 const char* name = nullptr);
Narumol Prangnawarata0162e12021-07-23 14:47:49 +0100340
341 void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer,
342 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
343 const std::vector<armnn::ConstTensor>& constants,
344 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000345};
346
Finn Williamsb454c5c2021-02-09 15:56:23 +0000347
348
Finn Williams85d36712021-01-26 22:30:06 +0000349class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000350{
351public:
Finn Williams85d36712021-01-26 22:30:06 +0000352 SerializerImpl() = default;
353 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000354
355 /// Serializes the network to ArmNN SerializedGraph.
356 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000357 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000358
359 /// Serializes the SerializedGraph to the stream.
360 /// @param [stream] the stream to save to
361 /// @return true if graph is Serialized to the Stream, false otherwise
Finn Williams85d36712021-01-26 22:30:06 +0000362 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000363
364private:
365
366 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000367 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000368};
369
Mike Kelly8c1701a2019-02-11 17:01:27 +0000370} //namespace armnnSerializer