blob: 1a0978f0de7fce674e4818c010589ea752df7036 [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 char* name = nullptr);
149
150 void SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
151 const armnn::Convolution3dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000152 const char* name = nullptr);
153
154 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
155 const armnn::DepthToSpaceDescriptor& descriptor,
156 const char* name = nullptr);
157
158 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
159 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000160 const char* name = nullptr);
161
162 void SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
163 const char* name = nullptr);
164
165 void SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
166 const armnn::DetectionPostProcessDescriptor& descriptor,
167 const std::vector<armnn::ConstTensor>& constants,
168 const char* name = nullptr);
169
170 void SerializeDivisionLayer(const armnn::IConnectableLayer* layer,
171 const char* name = nullptr);
172
173 void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
174 const armnn::ElementwiseUnaryDescriptor& descriptor,
175 const char* name = nullptr);
176
Finn Williamsb454c5c2021-02-09 15:56:23 +0000177 void SerializeFillLayer(const armnn::IConnectableLayer* layer,
178 const armnn::FillDescriptor& fillDescriptor,
179 const char* name = nullptr);
180
181 void SerializeFloorLayer(const armnn::IConnectableLayer *layer,
182 const char *name = nullptr);
183
184 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
185 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000186 const char* name = nullptr);
187
188 void SerializeGatherLayer(const armnn::IConnectableLayer* layer,
189 const armnn::GatherDescriptor& gatherDescriptor,
190 const char* name = nullptr);
191
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100192 void SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
193 const char* name = nullptr);
194
Finn Williamsb454c5c2021-02-09 15:56:23 +0000195 void SerializeInputLayer(const armnn::IConnectableLayer* layer,
196 armnn::LayerBindingId id,
197 const char* name = nullptr);
198
199 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer,
200 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
201 const char* name = nullptr);
202
203 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
204 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
205 const char* name = nullptr);
206
207 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
208 const armnn::LogicalBinaryDescriptor& descriptor,
209 const char* name = nullptr);
210
211 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
212 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
213 const char* name = nullptr);
214
215 void SerializeLstmLayer(const armnn::IConnectableLayer* layer,
216 const armnn::LstmDescriptor& descriptor,
217 const std::vector<armnn::ConstTensor>& constants,
218 const char* name = nullptr);
219
220 void SerializeMeanLayer(const armnn::IConnectableLayer* layer,
221 const armnn::MeanDescriptor& descriptor,
222 const char* name);
223
224 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer,
225 const char* name = nullptr);
226
227 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer,
228 const char* name = nullptr);
229
230 void SerializeMergeLayer(const armnn::IConnectableLayer* layer,
231 const char* name = nullptr);
232
Finn Williamsb454c5c2021-02-09 15:56:23 +0000233 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer,
234 const char* name = nullptr);
235
236 void SerializeOutputLayer(const armnn::IConnectableLayer* layer,
237 armnn::LayerBindingId id,
238 const char* name = nullptr);
239
240 void SerializePadLayer(const armnn::IConnectableLayer* layer,
241 const armnn::PadDescriptor& PadDescriptor,
242 const char* name = nullptr);
243
244 void SerializePermuteLayer(const armnn::IConnectableLayer* layer,
245 const armnn::PermuteDescriptor& PermuteDescriptor,
246 const char* name = nullptr);
247
248 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
249 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
250 const char* name = nullptr);
251
Tamas Nyirid998a1c2021-11-05 14:55:33 +0000252 void SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
253 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
254 const char* name = nullptr);
255
Finn Williamsb454c5c2021-02-09 15:56:23 +0000256 void SerializePreluLayer(const armnn::IConnectableLayer* layer,
257 const char* name = nullptr);
258
259 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer,
260 const char* name = nullptr);
261
262 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
263 const armnn::QLstmDescriptor& descriptor,
264 const std::vector<armnn::ConstTensor>& constants,
265 const char* name = nullptr);
266
267 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
268 const std::vector<armnn::ConstTensor>& constants,
269 const char* name = nullptr);
270
271 void SerializeRankLayer(const armnn::IConnectableLayer* layer,
272 const char* name = nullptr);
273
274 void SerializeReduceLayer(const armnn::IConnectableLayer* layer,
275 const armnn::ReduceDescriptor& reduceDescriptor,
276 const char* name = nullptr);
277
278 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
279 const armnn::ReshapeDescriptor& reshapeDescriptor,
280 const char* name = nullptr);
281
282 void SerializeResizeLayer(const armnn::IConnectableLayer* layer,
283 const armnn::ResizeDescriptor& resizeDescriptor,
284 const char* name = nullptr);
285
Finn Williamsb454c5c2021-02-09 15:56:23 +0000286 void SerializeSliceLayer(const armnn::IConnectableLayer* layer,
287 const armnn::SliceDescriptor& sliceDescriptor,
288 const char* name = nullptr);
289
290 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
291 const armnn::SoftmaxDescriptor& softmaxDescriptor,
292 const char* name = nullptr);
293
294 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
295 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
296 const char* name = nullptr);
297
298 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
299 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
300 const char* name = nullptr);
301
302 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
303 const armnn::NormalizationDescriptor& normalizationDescriptor,
304 const char* name = nullptr);
305
Keith Davis3ae3f972021-05-21 16:33:48 +0100306 void SerializeShapeLayer(const armnn::IConnectableLayer* layer,
307 const char* name = nullptr);
308
Finn Williamsb454c5c2021-02-09 15:56:23 +0000309 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
310 const armnn::ViewsDescriptor& viewsDescriptor,
311 const char* name = nullptr);
312
313 void SerializeStandInLayer(const armnn::IConnectableLayer* layer,
314 const armnn::StandInDescriptor& standInDescriptor,
315 const char* name = nullptr);
316
317 void SerializeStackLayer(const armnn::IConnectableLayer* layer,
318 const armnn::StackDescriptor& stackDescriptor,
319 const char* name = nullptr);
320
321 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
322 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
323 const char* name = nullptr);
324
325 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer,
326 const char* name = nullptr);
327
328 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer,
329 const char* name = nullptr);
330
331 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer,
332 const armnn::TransposeConvolution2dDescriptor& descriptor,
333 const std::vector<armnn::ConstTensor>& constants,
334 const char* = nullptr);
335
336 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
337 const armnn::TransposeDescriptor& descriptor,
338 const char* name = nullptr);
Narumol Prangnawarata0162e12021-07-23 14:47:49 +0100339
340 void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer,
341 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
342 const std::vector<armnn::ConstTensor>& constants,
343 const char* name = nullptr);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000344};
345
Finn Williamsb454c5c2021-02-09 15:56:23 +0000346
347
Finn Williams85d36712021-01-26 22:30:06 +0000348class ISerializer::SerializerImpl
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000349{
350public:
Finn Williams85d36712021-01-26 22:30:06 +0000351 SerializerImpl() = default;
352 ~SerializerImpl() = default;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000353
354 /// Serializes the network to ArmNN SerializedGraph.
355 /// @param [in] inNetwork The network to be serialized.
Finn Williams85d36712021-01-26 22:30:06 +0000356 void Serialize(const armnn::INetwork& inNetwork);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000357
358 /// Serializes the SerializedGraph to the stream.
359 /// @param [stream] the stream to save to
360 /// @return true if graph is Serialized to the Stream, false otherwise
Finn Williams85d36712021-01-26 22:30:06 +0000361 bool SaveSerializedToStream(std::ostream& stream);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000362
363private:
364
365 /// Visitor to contruct serialized network
Finn Williamsb454c5c2021-02-09 15:56:23 +0000366 SerializerStrategy m_SerializerStrategy;
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +0000367};
368
Mike Kelly8c1701a2019-02-11 17:01:27 +0000369} //namespace armnnSerializer