blob: 84a9d53b695eab744197e26fb655e308395667f3 [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//
Mike Kelly8c1701a2019-02-11 17:01:27 +00005#include "Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00006#include "SerializerUtils.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000011#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan0663d662020-09-14 11:47:26 +010012#include <armnn/utility/NumericCast.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Finn Williamsb454c5c2021-02-09 15:56:23 +000014#include <fmt/format.h>
Mike Kelly8c1701a2019-02-11 17:01:27 +000015#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000016
Mike Kelly8c1701a2019-02-11 17:01:27 +000017using namespace armnn;
18namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000019namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000020
21namespace armnnSerializer
22{
23
Finn Williams85d36712021-01-26 22:30:06 +000024ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
25{
26}
27
28ISerializer::~ISerializer() = default;
29
30ISerializer* ISerializer::CreateRaw()
31{
32 return new ISerializer();
33}
34
35ISerializerPtr ISerializer::Create()
36{
37 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
38}
39
40void ISerializer::Destroy(ISerializer* serializer)
41{
42 delete serializer;
43}
44
45void ISerializer::Serialize(const armnn::INetwork& inNetwork)
46{
47 pSerializerImpl->Serialize(inNetwork);
48}
49
50bool ISerializer::SaveSerializedToStream(std::ostream& stream)
51{
52 return pSerializerImpl->SaveSerializedToStream(stream);
53}
54
Mike Kellyaf484012019-02-20 16:53:11 +000055serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
56{
57 switch (function)
58 {
59 case armnn::ActivationFunction::Sigmoid:
60 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
61 case armnn::ActivationFunction::TanH:
62 return serializer::ActivationFunction::ActivationFunction_TanH;
63 case armnn::ActivationFunction::Linear:
64 return serializer::ActivationFunction::ActivationFunction_Linear;
65 case armnn::ActivationFunction::ReLu:
66 return serializer::ActivationFunction::ActivationFunction_ReLu;
67 case armnn::ActivationFunction::BoundedReLu:
68 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
69 case armnn::ActivationFunction::LeakyReLu:
70 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
71 case armnn::ActivationFunction::Abs:
72 return serializer::ActivationFunction::ActivationFunction_Abs;
73 case armnn::ActivationFunction::Sqrt:
74 return serializer::ActivationFunction::ActivationFunction_Sqrt;
75 case armnn::ActivationFunction::Square:
76 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000077 case armnn::ActivationFunction::Elu:
78 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000079 case armnn::ActivationFunction::HardSwish:
80 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000081 default:
82 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
83 }
84}
85
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010086serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
87{
88 switch (function)
89 {
90 case armnn::ArgMinMaxFunction::Max:
91 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
92 case armnn::ArgMinMaxFunction::Min:
93 default:
94 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
95 }
96}
97
Finn Williamsb454c5c2021-02-09 15:56:23 +000098uint32_t SerializerStrategy::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000099{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100 if (m_guidMap.empty())
101 {
janeil013fec1ea2019-11-07 09:47:20 +0000102 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000103 }
104 else if (m_guidMap.find(guid) == m_guidMap.end())
105 {
janeil013fec1ea2019-11-07 09:47:20 +0000106 ++m_layerId;
107 m_guidMap.insert(std::make_pair(guid, m_layerId));
108
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000109 return m_layerId;
110 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000111 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112}
113
Mike Kelly8c1701a2019-02-11 17:01:27 +0000114// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000116{
Jan Eilers8eb25602020-03-09 12:13:48 +0000117 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000118
Mike Kelly8c1701a2019-02-11 17:01:27 +0000119 // Create FlatBuffer BaseLayer
120 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
121
122 // Create FlatBuffer BindableBaseLayer
123 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
124 flatBufferInputBaseLayer,
125 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000126 // Push layer binding id to outputIds.
127 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000128
129 // Create the FlatBuffer InputLayer
130 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
131
132 // Add the AnyLayer to the FlatBufferLayers
133 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
134}
135
136// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000137void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
138 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000139{
Jan Eilers8eb25602020-03-09 12:13:48 +0000140 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000141
Mike Kelly8c1701a2019-02-11 17:01:27 +0000142 // Create FlatBuffer BaseLayer
143 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
144
145 // Create FlatBuffer BindableBaseLayer
146 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
147 flatBufferOutputBaseLayer,
148 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000149 // Push layer binding id to outputIds.
150 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151
152 // Create the FlatBuffer OutputLayer
153 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
154 // Add the AnyLayer to the FlatBufferLayers
155 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
156}
157
Mike Kellyaf484012019-02-20 16:53:11 +0000158// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000159void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
160 const armnn::ActivationDescriptor& descriptor,
161 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000162{
Jan Eilers8eb25602020-03-09 12:13:48 +0000163 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000164
Mike Kellyaf484012019-02-20 16:53:11 +0000165 // Create FlatBuffer BaseLayer
166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
167
168 // Create the FlatBuffer ActivationDescriptor
169 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
170 GetFlatBufferActivationFunction(descriptor.m_Function),
171 descriptor.m_A,
172 descriptor.m_B);
173
174 // Create the FlatBuffer ActivationLayer
175 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
176 flatBufferBaseLayer,
177 flatBufferDescriptor);
178
179 // Add the AnyLayer to the FlatBufferLayers
180 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
181}
182
Mike Kelly8c1701a2019-02-11 17:01:27 +0000183// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000184void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000185{
Jan Eilers8eb25602020-03-09 12:13:48 +0000186 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000187
Mike Kelly8c1701a2019-02-11 17:01:27 +0000188 // Create FlatBuffer BaseLayer
189 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
190
191 // Create the FlatBuffer AdditionLayer
192 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
193
194 // Add the AnyLayer to the FlatBufferLayers
195 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
196}
197
Nikhil Rajee391d52019-09-05 17:50:44 +0100198// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000199void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
200 const armnn::ArgMinMaxDescriptor& descriptor,
201 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100202{
Jan Eilers8eb25602020-03-09 12:13:48 +0000203 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000204
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100205 // Create FlatBuffer BaseLayer
206 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
207
208 // Create FlatBuffer Descriptor
209 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
210 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
211 descriptor.m_Axis);
212
213 // Create FlatBuffer ArgMinMaxLayer
214 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
215 flatBufferBaseLayer,
216 flatBufferDescriptor);
217
218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100219}
220
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000221// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000222void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
223 const armnn::BatchToSpaceNdDescriptor& descriptor,
224 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000225{
Jan Eilers8eb25602020-03-09 12:13:48 +0000226 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000227
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000228 // Create FlatBuffer BaseLayer
229 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
230
231 std::vector<unsigned int> crops;
232 crops.reserve(descriptor.m_Crops.size() * 2);
233 for (auto& crop : descriptor.m_Crops)
234 {
235 crops.push_back(crop.first);
236 crops.push_back(crop.second);
237 }
238
239 auto flatBufferDescriptor =
240 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
241 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
242 m_flatBufferBuilder.CreateVector(crops),
243 GetFlatBufferDataLayout(descriptor.m_DataLayout));
244
245 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
246 flatBufferBaseLayer,
247 flatBufferDescriptor);
248
249 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
250}
251
Finn Williamsb454c5c2021-02-09 15:56:23 +0000252void SerializerStrategy::SerializeBatchNormalizationLayer(
253 const armnn::IConnectableLayer* layer,
254 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
255 const std::vector<armnn::ConstTensor>& constants,
256 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000257{
Jan Eilers8eb25602020-03-09 12:13:48 +0000258 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000259
Finn Williamsb454c5c2021-02-09 15:56:23 +0000260 const armnn::ConstTensor& mean = constants[0];
261 const armnn::ConstTensor& variance = constants[1];
262 const armnn::ConstTensor& beta = constants[2];
263 const armnn::ConstTensor& gamma = constants[3];
264
ruoyan018e7fa232019-02-28 15:09:07 +0000265 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
266 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
267 m_flatBufferBuilder,
268 batchNormDescriptor.m_Eps,
269 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
270
271 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
272 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
273 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
274 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
275 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
276 fbBatchNormalizationBaseLayer,
277 fbBatchNormalizationDescriptor,
278 fbMeanConstTensorInfo,
279 fbVarianceConstTensorInfo,
280 fbBetaConstTensorInfo,
281 fbGammaConstTensorInfo);
282
283 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
284}
285
mathad01b392e982021-04-07 12:07:30 +0100286void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
287 const char* name)
288{
289 IgnoreUnused(name);
290
291 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
292 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
293 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
294}
295
Simon Obute51f67772021-09-03 15:50:13 +0100296void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
297 const armnn::ChannelShuffleDescriptor& descriptor,
298 const char* name)
299{
300 IgnoreUnused(name);
301 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
302 descriptor.m_Axis,
303 descriptor.m_NumGroups);
304 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
305 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
306 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
307}
308
Finn Williamsb454c5c2021-02-09 15:56:23 +0000309void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100310 const armnn::ComparisonDescriptor& descriptor,
311 const char* name)
312{
Jan Eilers8eb25602020-03-09 12:13:48 +0000313 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000314
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100315 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
316 auto fbDescriptor = serializer::CreateComparisonDescriptor(
317 m_flatBufferBuilder,
318 GetFlatBufferComparisonOperation(descriptor.m_Operation));
319
320 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
321 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100322}
323
Conor Kennedy76277882019-02-26 08:29:54 +0000324// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000325void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
326 const std::vector<armnn::ConstTensor>& constants,
327 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000328{
Jan Eilers8eb25602020-03-09 12:13:48 +0000329 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000330
Finn Williamsb454c5c2021-02-09 15:56:23 +0000331 armnn::ConstTensor input = constants[0];
332
Conor Kennedy76277882019-02-26 08:29:54 +0000333 // Create FlatBuffer BaseLayer
334 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
335
336 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
337
338 // Create the FlatBuffer ConstantLayer
339 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
340 flatBufferConstantBaseLayer,
341 flatBufferConstTensorInfo);
342
343 // Add the AnyLayer to the FlatBufferLayers
344 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
345}
346
Mike Kellya0766c32019-02-19 17:22:07 +0000347// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000348void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
349 const armnn::Convolution2dDescriptor& descriptor,
350 const std::vector<armnn::ConstTensor>& constants,
351 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000352{
Jan Eilers8eb25602020-03-09 12:13:48 +0000353 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000354
Finn Williamsb454c5c2021-02-09 15:56:23 +0000355 const armnn::ConstTensor weights = constants[0];
356
Mike Kellya0766c32019-02-19 17:22:07 +0000357 // Create FlatBuffer BaseLayer
358 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
359
360 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
361 descriptor.m_PadLeft,
362 descriptor.m_PadRight,
363 descriptor.m_PadTop,
364 descriptor.m_PadBottom,
365 descriptor.m_StrideX,
366 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100367 descriptor.m_DilationX,
368 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000369 descriptor.m_BiasEnabled,
370 GetFlatBufferDataLayout(descriptor.m_DataLayout));
371 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
372 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
373
Finn Williamsb454c5c2021-02-09 15:56:23 +0000374 if (constants.size() > 1)
Mike Kellya0766c32019-02-19 17:22:07 +0000375 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000376 const armnn::ConstTensor biases = constants[1];
377 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Mike Kellya0766c32019-02-19 17:22:07 +0000378 }
379
380 // Create the FlatBuffer Convolution2dLayer
381 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
382 flatBufferBaseLayer,
383 flatBufferDescriptor,
384 flatBufferWeightsConstTensorInfo,
385 flatBufferBiasesConstTensorInfo);
386
387 // Add the AnyLayer to the FlatBufferLayers
388 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
389}
390
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100391// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100392void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
393 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100394 const char* name)
395{
396 IgnoreUnused(name);
397
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100398 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100399 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100400
401 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
402 descriptor.m_PadLeft,
403 descriptor.m_PadRight,
404 descriptor.m_PadTop,
405 descriptor.m_PadBottom,
406 descriptor.m_PadFront,
407 descriptor.m_PadBack,
408 descriptor.m_StrideX,
409 descriptor.m_StrideY,
410 descriptor.m_StrideZ,
411 descriptor.m_DilationX,
412 descriptor.m_DilationY,
413 descriptor.m_DilationZ,
414 descriptor.m_BiasEnabled,
415 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100416
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100417 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100418 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
419 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100420 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100421
422 // Add the AnyLayer to the FlatBufferLayers
423 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
424}
425
Finn Williamsb454c5c2021-02-09 15:56:23 +0000426void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100427 const armnn::DepthToSpaceDescriptor& descriptor,
428 const char* name)
429{
Jan Eilers8eb25602020-03-09 12:13:48 +0000430 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000431
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100432 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
433 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
434 descriptor.m_BlockSize,
435 GetFlatBufferDataLayout(descriptor.m_DataLayout));
436
437 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
438
439 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100440}
441
Finn Williamsb454c5c2021-02-09 15:56:23 +0000442void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
443 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
444 const std::vector<armnn::ConstTensor>& constants,
445 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000446{
Jan Eilers8eb25602020-03-09 12:13:48 +0000447 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000448
Finn Williamsb454c5c2021-02-09 15:56:23 +0000449 const armnn::ConstTensor& weights = constants[0];
450
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000451 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
452 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
453 descriptor.m_PadLeft,
454 descriptor.m_PadRight,
455 descriptor.m_PadTop,
456 descriptor.m_PadBottom,
457 descriptor.m_StrideX,
458 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100459 descriptor.m_DilationX,
460 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000461 descriptor.m_BiasEnabled,
462 GetFlatBufferDataLayout(descriptor.m_DataLayout));
463
464 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
465 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000466
467 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000468 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000469 const armnn::ConstTensor& biases = constants[1];
470 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000471 }
472
473 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
474 fbBaseLayer,
475 fbDescriptor,
476 fbWeightsConstTensorInfo,
477 fbBiasesConstTensorInfo);
478
479 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
480}
481
Finn Williamsb454c5c2021-02-09 15:56:23 +0000482void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000483 const char* name)
484{
Jan Eilers8eb25602020-03-09 12:13:48 +0000485 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000486
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000487 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
488 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
489
490 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
491}
492
Finn Williamsb454c5c2021-02-09 15:56:23 +0000493void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
494 const armnn::DetectionPostProcessDescriptor& descriptor,
495 const std::vector<armnn::ConstTensor>& constants,
496 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000497{
Jan Eilers8eb25602020-03-09 12:13:48 +0000498 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000499
Finn Williamsb454c5c2021-02-09 15:56:23 +0000500 const armnn::ConstTensor& anchors = constants[0];
501
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000502 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
503 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
504 descriptor.m_MaxDetections,
505 descriptor.m_MaxClassesPerDetection,
506 descriptor.m_DetectionsPerClass,
507 descriptor.m_NmsScoreThreshold,
508 descriptor.m_NmsIouThreshold,
509 descriptor.m_NumClasses,
510 descriptor.m_UseRegularNms,
511 descriptor.m_ScaleX,
512 descriptor.m_ScaleY,
513 descriptor.m_ScaleW,
514 descriptor.m_ScaleH);
515
516 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
517
518 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
519 fbBaseLayer,
520 fbDescriptor,
521 fbAnchorsConstTensorInfo);
522
523 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
524}
525
Finn Williamsb454c5c2021-02-09 15:56:23 +0000526void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000527{
Jan Eilers8eb25602020-03-09 12:13:48 +0000528 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000529
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000530 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
531 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000532
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000533 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
534}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000535
Finn Williamsb454c5c2021-02-09 15:56:23 +0000536void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600537 const armnn::ElementwiseUnaryDescriptor& descriptor,
538 const char* name)
539{
Jan Eilers8eb25602020-03-09 12:13:48 +0000540 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600541
542 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
543 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
544 m_flatBufferBuilder,
545 GetFlatBufferUnaryOperation(descriptor.m_Operation));
546
547 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
549}
550
Finn Williamsb454c5c2021-02-09 15:56:23 +0000551void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100552 const armnn::FillDescriptor& fillDescriptor,
553 const char* name)
554{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100555 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100556
557 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
558
559 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
560
561 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
562
563 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100564}
565
Finn Williamsb454c5c2021-02-09 15:56:23 +0000566void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000567{
Jan Eilers8eb25602020-03-09 12:13:48 +0000568 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000569
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000570 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
571 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
572
573 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
574}
575
Finn Williamsb454c5c2021-02-09 15:56:23 +0000576void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100577 const armnn::GatherDescriptor& gatherDescriptor,
578 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000579{
Jan Eilers8eb25602020-03-09 12:13:48 +0000580 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000581
Teresa Charlin52664732020-06-29 16:27:03 +0100582 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
583 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000584 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100585 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000586
587 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
588}
589
Finn Williamsb454c5c2021-02-09 15:56:23 +0000590void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100591 const armnn::IConnectableLayer* layer,
592 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
593 const char* name)
594{
Jan Eilers8eb25602020-03-09 12:13:48 +0000595 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000596
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100597 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
598 m_flatBufferBuilder,
599 instanceNormalizationDescriptor.m_Gamma,
600 instanceNormalizationDescriptor.m_Beta,
601 instanceNormalizationDescriptor.m_Eps,
602 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
603
604 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
605 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
606
607 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100608}
609
Finn Williamsb454c5c2021-02-09 15:56:23 +0000610void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000611 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
612 const char* name)
613{
Jan Eilers8eb25602020-03-09 12:13:48 +0000614 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000615
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000616 // Create FlatBuffer BaseLayer
617 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
618
619 // Create the FlatBuffer L2Normalization Descriptor
620 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100621 m_flatBufferBuilder,
622 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
623 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000624
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100625 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000626 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
627
628 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
629}
630
Finn Williamsb454c5c2021-02-09 15:56:23 +0000631void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000632 const armnn::LogicalBinaryDescriptor& descriptor,
633 const char* name)
634{
635 IgnoreUnused(name);
636
637 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
638 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
639 m_flatBufferBuilder,
640 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
641
642 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
643 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
644}
645
Finn Williamsb454c5c2021-02-09 15:56:23 +0000646void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100647 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
648 const char* name)
649{
Jan Eilers8eb25602020-03-09 12:13:48 +0000650 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000651
Sadik Armagan26257852019-10-14 13:00:47 +0100652 // Create FlatBuffer BaseLayer
653 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
654
655 // Create the FlatBuffer LogSoftmaxDescriptor
656 auto flatBufferLogSoftmaxDesc =
657 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
658 logSoftmaxDescriptor.m_Beta,
659 logSoftmaxDescriptor.m_Axis);
660
661 // Create the FlatBuffer LogSoftmaxLayer
662 auto flatBufferLogSoftmaxLayer =
663 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
664 flatBufferLogSoftmaxBaseLayer,
665 flatBufferLogSoftmaxDesc);
666
667 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100668}
669
Finn Williamsb454c5c2021-02-09 15:56:23 +0000670void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
671 const armnn::LstmDescriptor& descriptor,
672 const std::vector<armnn::ConstTensor>& constants,
673 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000674{
Jan Eilers8eb25602020-03-09 12:13:48 +0000675 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000676
Jim Flynn11af3752019-03-19 17:22:29 +0000677 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
678
679 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
680 m_flatBufferBuilder,
681 descriptor.m_ActivationFunc,
682 descriptor.m_ClippingThresCell,
683 descriptor.m_ClippingThresProj,
684 descriptor.m_CifgEnabled,
685 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100686 descriptor.m_ProjectionEnabled,
687 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000688
Finn Williamsb454c5c2021-02-09 15:56:23 +0000689 // Index for constants vector
690 std::size_t i = 0;
691
692 // Get mandatory/basic input parameters
693 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
694 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
695 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
696 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
697 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
698 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
699 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
700 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
701 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
702
703
Jim Flynn11af3752019-03-19 17:22:29 +0000704
705 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
706 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
707 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
708 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
709 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
710 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
711 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
712 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
713 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100714 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
715 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
716 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
717 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000718
719 if (!descriptor.m_CifgEnabled)
720 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000721 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
722 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
723 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000724 }
725
726 if (descriptor.m_PeepholeEnabled)
727 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000728 if (!descriptor.m_CifgEnabled)
729 {
730 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
731 }
732 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
733 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
734 }
735
736 if (descriptor.m_ProjectionEnabled)
737 {
738 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
739 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000740 }
741
Jan Eilersf8c62972019-07-17 11:07:49 +0100742 if (descriptor.m_LayerNormEnabled)
743 {
744 if (!descriptor.m_CifgEnabled)
745 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000746 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100747 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000748 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
749 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
750 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100751 }
752
Jim Flynn11af3752019-03-19 17:22:29 +0000753 auto fbLstmParams = serializer::CreateLstmInputParams(
754 m_flatBufferBuilder,
755 inputToForgetWeights,
756 inputToCellWeights,
757 inputToOutputWeights,
758 recurrentToForgetWeights,
759 recurrentToCellWeights,
760 recurrentToOutputWeights,
761 forgetGateBias,
762 cellBias,
763 outputGateBias,
764 inputToInputWeights,
765 recurrentToInputWeights,
766 cellToInputWeights,
767 inputGateBias,
768 projectionWeights,
769 projectionBias,
770 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100771 cellToOutputWeights,
772 inputLayerNormWeights,
773 forgetLayerNormWeights,
774 cellLayerNormWeights,
775 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000776
777 auto fbLstmLayer = serializer::CreateLstmLayer(
778 m_flatBufferBuilder,
779 fbLstmBaseLayer,
780 fbLstmDescriptor,
781 fbLstmParams);
782
783 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
784}
785
Finn Williamsb454c5c2021-02-09 15:56:23 +0000786void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000787{
Jan Eilers8eb25602020-03-09 12:13:48 +0000788 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000789
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000790 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
791 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
792
793 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
794}
795
Finn Williamsb454c5c2021-02-09 15:56:23 +0000796void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000797 const armnn::MeanDescriptor& descriptor,
798 const char* name)
799{
Jan Eilers8eb25602020-03-09 12:13:48 +0000800 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000801
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000802 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
803 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
804 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
805 descriptor.m_KeepDims);
806
807 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
808 fbMeanBaseLayer,
809 fbMeanDescriptor);
810
811 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
812}
813
Finn Williamsb454c5c2021-02-09 15:56:23 +0000814void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000815{
Jan Eilers8eb25602020-03-09 12:13:48 +0000816 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000817
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000818 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
819 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
820
821 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
822}
823
Finn Williamsb454c5c2021-02-09 15:56:23 +0000824void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100825{
Jan Eilers8eb25602020-03-09 12:13:48 +0000826 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000827
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100828 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
829 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
830
831 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
832}
833
Finn Williamsb454c5c2021-02-09 15:56:23 +0000834void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100835 const armnn::ConcatDescriptor& concatDescriptor,
836 const char* name)
837{
Jan Eilers8eb25602020-03-09 12:13:48 +0000838 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000839
Jim Flynne242f2d2019-05-22 14:24:13 +0100840 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000841
842 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100843 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000844 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100845 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000846 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100847 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000848 {
849 origins.push_back(origin[d]);
850 }
851 auto view = m_flatBufferBuilder.CreateVector(origins);
852 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
853 views.push_back(uintVector);
854 }
855
Jim Flynne242f2d2019-05-22 14:24:13 +0100856 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
857 concatDescriptor.GetConcatAxis(),
858 concatDescriptor.GetNumViews(),
859 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000860 m_flatBufferBuilder.CreateVector(views));
861
Jim Flynne242f2d2019-05-22 14:24:13 +0100862 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
863 flatBufferConcatBaseLayer,
864 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000865
Jim Flynne242f2d2019-05-22 14:24:13 +0100866 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000867}
868
Finn Williamsb454c5c2021-02-09 15:56:23 +0000869void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000870{
Jan Eilers8eb25602020-03-09 12:13:48 +0000871 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000872
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000873 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
874 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
875 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000876
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000877 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000878}
879
Finn Williamsb454c5c2021-02-09 15:56:23 +0000880void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000881 const armnn::PadDescriptor& padDescriptor,
882 const char* name)
883{
Jan Eilers8eb25602020-03-09 12:13:48 +0000884 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000885
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000886 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
887
888 std::vector<unsigned int> padList;
889 for (auto& p: padDescriptor.m_PadList)
890 {
891 padList.push_back(p.first);
892 padList.push_back(p.second);
893 }
894
895 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100896 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100897 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000898
899 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
900 flatBufferBaseLayer,
901 flatBufferPadDesc);
902
903 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
904}
905
Finn Williamsb454c5c2021-02-09 15:56:23 +0000906void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000907 const armnn::PermuteDescriptor& permuteDescriptor,
908 const char* name)
909{
Jan Eilers8eb25602020-03-09 12:13:48 +0000910 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000911
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000912 // Create FlatBuffer BaseLayer
913 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
914
915 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100916 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000917 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100918 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000919 }
920
921 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
922 m_flatBufferBuilder.CreateVector(dimMappings));
923
924 // Create the FlatBuffer PermuteLayer
925 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
926 flatBufferPermuteBaseLayer,
927 flatBufferPermuteDesc);
928
929 // Add the AnyLayer to the FlatBufferLayers
930 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
931}
932
Finn Williams2605b232020-06-10 15:53:46 +0100933// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000934void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100935 const char* name)
936{
937 IgnoreUnused(name);
938 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
939 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
940
941 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
942}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000943
Finn Williamsb454c5c2021-02-09 15:56:23 +0000944void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
945 const armnn::ReduceDescriptor& reduceDescriptor,
946 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000947{
948 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
949 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000950 reduceDescriptor.m_KeepDims,
951 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
952 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
953 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
954 fbReduceBaseLayer,
955 fbDescriptor);
956
957 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
958}
959
Saoirse Stewart263829c2019-02-19 15:54:14 +0000960// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000961void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000962 const armnn::ReshapeDescriptor& reshapeDescriptor,
963 const char* name)
964{
Jan Eilers8eb25602020-03-09 12:13:48 +0000965 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000966
Saoirse Stewart263829c2019-02-19 15:54:14 +0000967 // Create FlatBuffer BaseLayer
968 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
969
970 std::vector<unsigned int> targetShape;
971 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
972 {
973 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
974 }
975
976 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
977 m_flatBufferBuilder.CreateVector(targetShape));
978
979 // Create the FlatBuffer ReshapeLayer
980 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
981 flatBufferReshapeDesc);
982
983 // Add the AnyLayer to the FlatBufferLayers
984 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
985}
986
Finn Williamsb454c5c2021-02-09 15:56:23 +0000987void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +0100988 const armnn::ResizeDescriptor& resizeDescriptor,
989 const char* name)
990{
Jan Eilers8eb25602020-03-09 12:13:48 +0000991 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000992
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100993 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
994
995 auto flatBufferDescriptor =
996 CreateResizeDescriptor(m_flatBufferBuilder,
997 resizeDescriptor.m_TargetHeight,
998 resizeDescriptor.m_TargetWidth,
999 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001000 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1001 resizeDescriptor.m_AlignCorners,
1002 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001003
1004 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1005 flatBufferBaseLayer,
1006 flatBufferDescriptor);
1007
1008 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001009}
1010
Finn Williamsb454c5c2021-02-09 15:56:23 +00001011void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001012 const armnn::SliceDescriptor& sliceDescriptor,
1013 const char* name)
1014{
Jan Eilers8eb25602020-03-09 12:13:48 +00001015 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001016
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001017 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1018 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1019 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1020 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1021
1022 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1023
1024 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001025}
1026
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001027// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001028void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001029 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001030 const char* name)
1031{
Jan Eilers8eb25602020-03-09 12:13:48 +00001032 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001033
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001034 // Create FlatBuffer BaseLayer
1035 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1036
1037 // Create the FlatBuffer SoftmaxDescriptor
1038 auto flatBufferSoftmaxDesc =
1039 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1040
1041 // Create the FlatBuffer SoftmaxLayer
1042 auto flatBufferSoftmaxLayer =
1043 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1044 flatBufferSoftmaxBaseLayer,
1045 flatBufferSoftmaxDesc);
1046
1047 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1048}
1049
Finn Williamsb454c5c2021-02-09 15:56:23 +00001050void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001051 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001052 const char* name)
1053{
Jan Eilers8eb25602020-03-09 12:13:48 +00001054 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001055
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001056 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1057 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1058 m_flatBufferBuilder,
1059 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1060 pooling2dDescriptor.m_PadLeft,
1061 pooling2dDescriptor.m_PadRight,
1062 pooling2dDescriptor.m_PadTop,
1063 pooling2dDescriptor.m_PadBottom,
1064 pooling2dDescriptor.m_PoolWidth,
1065 pooling2dDescriptor.m_PoolHeight,
1066 pooling2dDescriptor.m_StrideX,
1067 pooling2dDescriptor.m_StrideY,
1068 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1069 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1070 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1071
1072 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1073 fbPooling2dBaseLayer,
1074 fbPooling2dDescriptor);
1075
1076 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1077}
1078
Finn Williamsb454c5c2021-02-09 15:56:23 +00001079void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001080 const char* name)
1081{
Jan Eilers8eb25602020-03-09 12:13:48 +00001082 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001083
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001084 // Create FlatBuffer BaseLayer
1085 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1086
1087 // Create the FlatBuffer AdditionLayer
1088 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1089
1090 // Add the AnyLayer to the FlatBufferLayers
1091 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001092}
1093
Finn Williamsb454c5c2021-02-09 15:56:23 +00001094void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001095{
Jan Eilers8eb25602020-03-09 12:13:48 +00001096 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001097
Derek Lamberti87acb272019-03-27 16:51:31 +00001098 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1099 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1100 fbQuantizeBaseLayer);
1101 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1102}
1103
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001104// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001105void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1106 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001107 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001108{
1109 // Create FlatBuffer BaseLayer
1110 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1111
1112 // Create FlatBuffer FullyConnectedDescriptor
1113 auto flatBufferDescriptor =
1114 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1115 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001116 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1117 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001118
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001119 // Create FlatBuffer FullyConnectedLayer
1120 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1121 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001122 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001123
1124 // Add created FullyConnectedLayer to the FlatBufferLayers
1125 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1126}
1127
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001128// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001129void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001130 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1131 const char* name)
1132{
Jan Eilers8eb25602020-03-09 12:13:48 +00001133 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001134
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001135 // Create FlatBuffer BaseLayer
1136 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1137
1138 std::vector<unsigned int> padList;
1139 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1140 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1141 {
1142 padList.push_back(pad.first);
1143 padList.push_back(pad.second);
1144 }
1145
1146 auto flatBufferDescriptor =
1147 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1148 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1149 m_flatBufferBuilder.CreateVector(padList),
1150 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1151
1152 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1153 flatBufferBaseLayer,
1154 flatBufferDescriptor);
1155
1156 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1157}
1158
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001159// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001160void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001161 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1162 const char* name)
1163{
Jan Eilers8eb25602020-03-09 12:13:48 +00001164 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001165
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1167 auto flatBufferDescriptor =
1168 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1169 spaceToDepthDescriptor.m_BlockSize,
1170 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1171
1172 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1173 flatBufferBaseLayer,
1174 flatBufferDescriptor);
1175
1176 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001177}
1178
Jim Flynn18ce3382019-03-08 11:08:30 +00001179// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001180void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001181 const armnn::ViewsDescriptor& viewsDescriptor,
1182 const char* name)
1183{
Jan Eilers8eb25602020-03-09 12:13:48 +00001184 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001185
Jim Flynn18ce3382019-03-08 11:08:30 +00001186 // Create FlatBuffer ViewOrigins
1187 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1188 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1189
1190 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1191 {
1192 std::vector<uint32_t> viewOrigin;
1193 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1194
1195 // Copy vector
1196 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1197 {
1198 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1199 }
1200
1201 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1202 m_flatBufferBuilder.CreateVector(viewOrigin)));
1203 }
1204
1205 // Create FlatBuffer OriginsDescriptor
1206 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1207 viewsDescriptor.GetOrigins().GetConcatAxis(),
1208 viewsDescriptor.GetOrigins().GetNumViews(),
1209 viewsDescriptor.GetOrigins().GetNumDimensions(),
1210 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1211
1212 // Create FlatBuffer ViewOrigins
1213 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1214 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1215
1216 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1217 {
1218 std::vector<uint32_t> viewSize;
1219 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1220
1221 // Copy vector
1222 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1223 {
1224 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1225 }
1226
1227 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1228 m_flatBufferBuilder.CreateVector(viewSize)));
1229 }
1230
1231 // Create FlatBuffer ViewsDescriptor
1232 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1233 flatBufferOriginDescriptor,
1234 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1235
1236 // Create FlatBuffer BaseLayer
1237 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1238
1239 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1240 flatBufferBaseLayer,
1241 flatBufferViewsDescriptor);
1242
1243 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1244}
1245
Finn Williamsb454c5c2021-02-09 15:56:23 +00001246void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001247 const armnn::NormalizationDescriptor& descriptor,
1248 const char* name)
1249{
Jan Eilers8eb25602020-03-09 12:13:48 +00001250 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001251
Nina Drozd57728782019-02-27 10:53:27 +00001252 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1253
1254 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1255 m_flatBufferBuilder,
1256 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1257 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1258 descriptor.m_NormSize,
1259 descriptor.m_Alpha,
1260 descriptor.m_Beta,
1261 descriptor.m_K,
1262 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1263
1264 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1265 fbNormalizationBaseLayer,
1266 fbNormalizationDescriptor);
1267
1268 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1269}
1270
Keith Davis3ae3f972021-05-21 16:33:48 +01001271void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1272 const char* name)
1273{
1274 IgnoreUnused(name);
1275
1276 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1277 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1278
1279 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1280}
1281
Finn Williamsb454c5c2021-02-09 15:56:23 +00001282void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001283 const armnn::StackDescriptor& stackDescriptor,
1284 const char* name)
1285{
Jan Eilers8eb25602020-03-09 12:13:48 +00001286 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001287
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001288 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1289
1290 std::vector<unsigned int> inputShape;
1291 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1292 {
1293 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1294 }
1295
1296 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1297 stackDescriptor.m_Axis,
1298 stackDescriptor.m_NumInputs,
1299 m_flatBufferBuilder.CreateVector(inputShape));
1300
1301 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1302 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001303}
1304
Finn Williamsb454c5c2021-02-09 15:56:23 +00001305void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001306 const armnn::StandInDescriptor& standInDescriptor,
1307 const char *name)
1308{
Jan Eilers8eb25602020-03-09 12:13:48 +00001309 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001310
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001311 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1312 standInDescriptor.m_NumInputs,
1313 standInDescriptor.m_NumOutputs);
1314
1315 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1316 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1317
1318 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001319}
1320
Finn Williamsb454c5c2021-02-09 15:56:23 +00001321void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001322 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1323 const char* name)
1324{
Jan Eilers8eb25602020-03-09 12:13:48 +00001325 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001326
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001327 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1328
1329 auto flatBufferDescriptor =
1330 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1331 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1332 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1333 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1334 stridedSliceDescriptor.m_BeginMask,
1335 stridedSliceDescriptor.m_EndMask,
1336 stridedSliceDescriptor.m_ShrinkAxisMask,
1337 stridedSliceDescriptor.m_EllipsisMask,
1338 stridedSliceDescriptor.m_NewAxisMask,
1339 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1340
1341 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1342 flatBufferBaseLayer,
1343 flatBufferDescriptor);
1344
1345 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1346}
1347
Finn Williamsb454c5c2021-02-09 15:56:23 +00001348void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001349{
Jan Eilers8eb25602020-03-09 12:13:48 +00001350 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001351
Conor Kennedyda1f9752019-03-01 14:37:12 +00001352 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1353 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1354
1355 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1356}
1357
Finn Williamsb454c5c2021-02-09 15:56:23 +00001358void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001359{
Jan Eilers8eb25602020-03-09 12:13:48 +00001360 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001361
Sadik Armaganeff363d2019-04-05 15:25:46 +01001362 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1363 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1364
1365 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1366}
1367
Finn Williamsb454c5c2021-02-09 15:56:23 +00001368void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001369 const armnn::IConnectableLayer* layer,
1370 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001371 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001372 const char* name)
1373{
Jan Eilers8eb25602020-03-09 12:13:48 +00001374 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001375
Finn Williamsb454c5c2021-02-09 15:56:23 +00001376 const armnn::ConstTensor& weights = constants.at(0);
1377
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001378 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1379 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1380 descriptor.m_PadLeft,
1381 descriptor.m_PadRight,
1382 descriptor.m_PadTop,
1383 descriptor.m_PadBottom,
1384 descriptor.m_StrideX,
1385 descriptor.m_StrideY,
1386 descriptor.m_BiasEnabled,
1387 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1388
1389 // weights & biases
1390 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1391 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001392 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001393 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001394 const armnn::ConstTensor& biases = constants.at(1);
1395 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001396 }
1397
1398 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1399 fbBaseLayer,
1400 fbDescriptor,
1401 fbWeightsConstTensorInfo,
1402 fbBiasesConstTensorInfo);
1403
1404 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001405}
1406
Finn Williamsb454c5c2021-02-09 15:56:23 +00001407void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001408 const armnn::TransposeDescriptor& descriptor,
1409 const char* name)
1410{
Jan Eilers8eb25602020-03-09 12:13:48 +00001411 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001412
1413 // Create FlatBuffer BaseLayer
1414 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1415
1416 std::vector<unsigned int> dimMappings;
1417 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1418 {
1419 dimMappings.push_back(descriptor.m_DimMappings[i]);
1420 }
1421
1422 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1423 m_flatBufferBuilder.CreateVector(dimMappings));
1424
1425 // Create the FlatBuffer TransposeLayer
1426 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1427 flatBufferBaseLayer,
1428 flatBufferDesc);
1429
1430 // Add the AnyLayer to the FlatBufferLayers
1431 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1432}
1433
Finn Williamsb454c5c2021-02-09 15:56:23 +00001434void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1435 const armnn::QLstmDescriptor& descriptor,
1436 const std::vector<armnn::ConstTensor>& constants,
1437 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001438{
James Conroy8d333182020-05-13 10:27:58 +01001439 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001440
James Conroy8d333182020-05-13 10:27:58 +01001441 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1442
1443 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1444 m_flatBufferBuilder,
1445 descriptor.m_CifgEnabled,
1446 descriptor.m_PeepholeEnabled,
1447 descriptor.m_ProjectionEnabled,
1448 descriptor.m_LayerNormEnabled,
1449 descriptor.m_CellClip,
1450 descriptor.m_ProjectionClip,
1451 descriptor.m_InputIntermediateScale,
1452 descriptor.m_ForgetIntermediateScale,
1453 descriptor.m_CellIntermediateScale,
1454 descriptor.m_OutputIntermediateScale,
1455 descriptor.m_HiddenStateZeroPoint,
1456 descriptor.m_HiddenStateScale
1457 );
1458
Finn Williamsb454c5c2021-02-09 15:56:23 +00001459 // Index for constants vector
1460 std::size_t i = 0;
1461
James Conroy8d333182020-05-13 10:27:58 +01001462 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001463 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1464 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1465 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1466 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1467 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1468 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1469 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1470 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1471 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001472
1473 // CIFG
1474 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1475 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1476 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1477
1478 if (!descriptor.m_CifgEnabled)
1479 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001480 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1481 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1482 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001483 }
1484
1485 // Peephole
1486 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1487 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1488 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1489
1490 if (descriptor.m_PeepholeEnabled)
1491 {
1492 if (!descriptor.m_CifgEnabled)
1493 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001494 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001495 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001496 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1497 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1498 }
James Conroy8d333182020-05-13 10:27:58 +01001499
Finn Williamsb454c5c2021-02-09 15:56:23 +00001500 // Projection
1501 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1502 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1503
1504 if (descriptor.m_ProjectionEnabled)
1505 {
1506 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1507 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001508 }
1509
1510 // Layer norm
1511 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1512 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1513 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1514 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1515
1516 if (descriptor.m_LayerNormEnabled)
1517 {
1518 if (!descriptor.m_CifgEnabled)
1519 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001520 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001521 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001522 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1523 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1524 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001525 }
1526
1527 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1528 m_flatBufferBuilder,
1529 inputToForgetWeights,
1530 inputToCellWeights,
1531 inputToOutputWeights,
1532 recurrentToForgetWeights,
1533 recurrentToCellWeights,
1534 recurrentToOutputWeights,
1535 forgetGateBias,
1536 cellBias,
1537 outputGateBias,
1538 inputToInputWeights,
1539 recurrentToInputWeights,
1540 inputGateBias,
1541 projectionWeights,
1542 projectionBias,
1543 cellToInputWeights,
1544 cellToForgetWeights,
1545 cellToOutputWeights,
1546 inputLayerNormWeights,
1547 forgetLayerNormWeights,
1548 cellLayerNormWeights,
1549 outputLayerNormWeights);
1550
1551 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1552 m_flatBufferBuilder,
1553 fbQLstmBaseLayer,
1554 fbQLstmDescriptor,
1555 fbQLstmParams);
1556
1557 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001558}
1559
Finn Williamsb454c5c2021-02-09 15:56:23 +00001560void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1561 const std::vector<armnn::ConstTensor>& constants,
1562 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001563{
Jan Eilers8eb25602020-03-09 12:13:48 +00001564 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001565
Jan Eilers5b01a892019-07-23 09:47:43 +01001566 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1567
Finn Williamsb454c5c2021-02-09 15:56:23 +00001568 // index for constants vector
1569 size_t i = 0;
1570
Jan Eilers5b01a892019-07-23 09:47:43 +01001571 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001572 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1573 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1574 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1575 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001576
Finn Williamsb454c5c2021-02-09 15:56:23 +00001577 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1578 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1579 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1580 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001581
Finn Williamsb454c5c2021-02-09 15:56:23 +00001582 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1583 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1584 auto cellBias = CreateConstTensorInfo(constants[i++]);
1585 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001586
1587 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1588 m_flatBufferBuilder,
1589 inputToInputWeights,
1590 inputToForgetWeights,
1591 inputToCellWeights,
1592 inputToOutputWeights,
1593 recurrentToInputWeights,
1594 recurrentToForgetWeights,
1595 recurrentToCellWeights,
1596 recurrentToOutputWeights,
1597 inputGateBias,
1598 forgetGateBias,
1599 cellBias,
1600 outputGateBias);
1601
1602 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1603 m_flatBufferBuilder,
1604 fbQuantizedLstmBaseLayer,
1605 fbQuantizedLstmParams);
1606
1607 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001608}
1609
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001610void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1611 const armnn::IConnectableLayer* layer,
1612 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1613 const std::vector<armnn::ConstTensor>& constants,
1614 const char* name)
1615{
1616 IgnoreUnused(name);
1617
1618 auto fbUnidirectionalSequenceLstmBaseLayer =
1619 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1620
1621 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1622 m_flatBufferBuilder,
1623 descriptor.m_ActivationFunc,
1624 descriptor.m_ClippingThresCell,
1625 descriptor.m_ClippingThresProj,
1626 descriptor.m_CifgEnabled,
1627 descriptor.m_PeepholeEnabled,
1628 descriptor.m_ProjectionEnabled,
1629 descriptor.m_LayerNormEnabled,
1630 descriptor.m_TimeMajor);
1631
1632 // Index for constants vector
1633 std::size_t i = 0;
1634
1635 // Get mandatory/basic input parameters
1636 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1637 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1638 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1639 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1640 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1641 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1642 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1643 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1644 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1645
1646 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1647 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1648 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1649 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1650 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1651 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1652 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1653 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1654 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1655 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1656 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1657 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1658 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1659
1660 if (!descriptor.m_CifgEnabled)
1661 {
1662 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1663 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1664 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1665 }
1666
1667 if (descriptor.m_PeepholeEnabled)
1668 {
1669 if (!descriptor.m_CifgEnabled)
1670 {
1671 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1672 }
1673 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1674 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1675 }
1676
1677 if (descriptor.m_ProjectionEnabled)
1678 {
1679 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1680 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1681 }
1682
1683 if (descriptor.m_LayerNormEnabled)
1684 {
1685 if (!descriptor.m_CifgEnabled)
1686 {
1687 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1688 }
1689 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1690 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1691 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1692 }
1693
1694 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1695 m_flatBufferBuilder,
1696 inputToForgetWeights,
1697 inputToCellWeights,
1698 inputToOutputWeights,
1699 recurrentToForgetWeights,
1700 recurrentToCellWeights,
1701 recurrentToOutputWeights,
1702 forgetGateBias,
1703 cellBias,
1704 outputGateBias,
1705 inputToInputWeights,
1706 recurrentToInputWeights,
1707 cellToInputWeights,
1708 inputGateBias,
1709 projectionWeights,
1710 projectionBias,
1711 cellToForgetWeights,
1712 cellToOutputWeights,
1713 inputLayerNormWeights,
1714 forgetLayerNormWeights,
1715 cellLayerNormWeights,
1716 outputLayerNormWeights);
1717
1718 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1719 m_flatBufferBuilder,
1720 fbUnidirectionalSequenceLstmBaseLayer,
1721 fbUnidirectionalSequenceLstmDescriptor,
1722 fbUnidirectionalSequenceLstmParams);
1723
1724 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1725}
1726
Finn Williamsb454c5c2021-02-09 15:56:23 +00001727fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001728 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001729{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001730
Sadik Armagandb059fd2019-03-20 12:28:32 +00001731 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1732
Mike Kelly8c1701a2019-02-11 17:01:27 +00001733 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1734 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1735
1736 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001737 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001738 m_flatBufferBuilder.CreateString(layer->GetName()),
1739 layerType,
1740 m_flatBufferBuilder.CreateVector(inputSlots),
1741 m_flatBufferBuilder.CreateVector(outputSlots));
1742}
1743
Finn Williamsb454c5c2021-02-09 15:56:23 +00001744void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001745{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001746
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001747 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001748 m_serializedLayers.push_back(anyLayer);
1749}
1750
Mike Kellya0766c32019-02-19 17:22:07 +00001751template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001752flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001753{
1754 const T* buffer = reinterpret_cast<const T*>(memory);
1755 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1756 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1757 return fbVector;
1758}
1759
Finn Williamsb454c5c2021-02-09 15:56:23 +00001760flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001761{
Mike Kellya0766c32019-02-19 17:22:07 +00001762 // Get the dimensions
1763 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001764 std::vector<bool> specificity;
1765 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1766 // matches the size of dimensions.
1767 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1768 {
1769 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001770
1771 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1772 {
1773 shape.push_back(tensorInfo.GetShape()[dim]);
1774 }
1775 else
1776 {
1777 shape.push_back(0);
1778 }
Colm Donelan800b2812021-02-12 12:43:35 +00001779 }
1780
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001781 if (tensorInfo.HasPerAxisQuantization())
1782 {
1783 // Create FlatBuffer TensorInfo
1784 auto flatBufferTensorInfo =
1785 serializer::CreateTensorInfo(m_flatBufferBuilder,
1786 m_flatBufferBuilder.CreateVector(shape),
1787 GetFlatBufferDataType(tensorInfo.GetDataType()),
1788 tensorInfo.GetQuantizationScales()[0],
1789 tensorInfo.GetQuantizationOffset(),
1790 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001791 tensorInfo.GetQuantizationDim().value(),
1792 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001793 (tensorInfo.GetShape().GetDimensionality()),
1794 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001795 return flatBufferTensorInfo;
1796 }
1797
Mike Kellya0766c32019-02-19 17:22:07 +00001798 // Create FlatBuffer TensorInfo
1799 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1800 m_flatBufferBuilder.CreateVector(shape),
1801 GetFlatBufferDataType(tensorInfo.GetDataType()),
1802 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001803 tensorInfo.GetQuantizationOffset(),
1804 0,
1805 0,
1806 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001807 (tensorInfo.GetShape().GetDimensionality()),
1808 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001809 return flatBufferTensorInfo;
1810}
1811
1812flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001813 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001814{
1815 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1816
Mike Kellya0766c32019-02-19 17:22:07 +00001817 flatbuffers::Offset<void> fbPayload;
1818
1819 switch (tensorInfo.GetDataType())
1820 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001821 case armnn::DataType::Signed64:
1822 {
1823 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1824 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1825 m_flatBufferBuilder,
1826 fbVector);
1827 fbPayload = flatBuffersData.o;
1828 break;
1829 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001830 case armnn::DataType::Float32:
1831 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001832 {
1833 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1834 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1835 m_flatBufferBuilder,
1836 fbVector);
1837 fbPayload = flatBuffersData.o;
1838 break;
1839 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001840 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001841 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001842 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001843 {
1844 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1845 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1846 m_flatBufferBuilder,
1847 fbVector);
1848 fbPayload = flatBuffersData.o;
1849 break;
1850 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001851 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001852 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001853 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001854 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001855 default:
1856 {
1857 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1858 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1859 m_flatBufferBuilder,
1860 fbVector);
1861 fbPayload = flatBuffersData.o;
1862 }
1863 }
1864 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1865 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001866 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001867 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1868 fbPayload);
1869 return flatBufferConstTensor;
1870}
1871
Finn Williamsb454c5c2021-02-09 15:56:23 +00001872flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001873{
1874 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1875 serializer::CreateFeatureCompatibilityVersions(
1876 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001877 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001878 1, // Weights layout scheme version
1879 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001880 );
1881 return versionsTable;
1882}
1883
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001884std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001885 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001886{
Mike Kellya0766c32019-02-19 17:22:07 +00001887 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001888
1889 // Get the InputSlots
1890 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1891 {
1892 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1893
1894 // Get the Connection for the InputSlot
1895 const IOutputSlot* connection = inputSlot.GetConnection();
1896
1897 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001898 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1899 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001900 // Create FlatBuffer InputSlot
1901 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1902 }
1903 return inputSlots;
1904}
1905
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001906std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001907 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001908{
1909 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1910
1911 // Get the OutputSlots
1912 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1913 {
1914 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001915 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001916
Mike Kelly8c1701a2019-02-11 17:01:27 +00001917 // Create FlatBuffer Outputslot
1918 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1919 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001920 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001921 }
1922 return outputSlots;
1923}
1924
Finn Williamsb454c5c2021-02-09 15:56:23 +00001925void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1926 const BaseDescriptor& descriptor,
1927 const std::vector<armnn::ConstTensor>& constants,
1928 const char* name,
1929 const armnn::LayerBindingId id)
1930{
1931 IgnoreUnused(constants);
1932
1933 switch (layer->GetType())
1934 {
1935 case armnn::LayerType::Activation :
1936 {
1937 const armnn::ActivationDescriptor& layerDescriptor =
1938 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1939 SerializeActivationLayer(layer, layerDescriptor, name);
1940 break;
1941 }
1942 case armnn::LayerType::Addition :
1943 {
1944 SerializeAdditionLayer(layer, name);
1945 break;
1946 }
1947 case armnn::LayerType::ArgMinMax :
1948 {
1949 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1950 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1951 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1952 break;
1953 }
1954 case armnn::LayerType::BatchNormalization :
1955 {
1956 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1957 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1958 SerializeBatchNormalizationLayer(layer,
1959 layerDescriptor,
1960 constants,
1961 name);
1962 break;
1963 }
1964 case armnn::LayerType::BatchToSpaceNd :
1965 {
1966 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1967 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1968 SerializeBatchToSpaceNdLayer(layer,
1969 layerDescriptor,
1970 name);
1971 break;
1972 }
mathad01b392e982021-04-07 12:07:30 +01001973 case armnn::LayerType::Cast :
1974 {
1975 SerializeCastLayer(layer, name);
1976 break;
1977 }
Simon Obute51f67772021-09-03 15:50:13 +01001978 case armnn::LayerType::ChannelShuffle :
1979 {
1980 const armnn::ChannelShuffleDescriptor& layerDescriptor =
1981 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
1982 SerializeChannelShuffleLayer(layer,
1983 layerDescriptor,
1984 name);
1985 break;
1986 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001987 case armnn::LayerType::Comparison :
1988 {
1989 const armnn::ComparisonDescriptor& layerDescriptor =
1990 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
1991 SerializeComparisonLayer(layer,
1992 layerDescriptor,
1993 name);
1994 break;
1995 }
1996 case armnn::LayerType::Concat :
1997 {
1998 const armnn::ConcatDescriptor& layerDescriptor =
1999 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2000 SerializeConcatLayer(layer,
2001 layerDescriptor,
2002 name);
2003 break;
2004 }
2005 case armnn::LayerType::Constant :
2006 {
2007 SerializeConstantLayer(layer,
2008 constants,
2009 name);
2010 break;
2011 }
2012 case armnn::LayerType::Convolution2d :
2013 {
2014 const armnn::Convolution2dDescriptor& layerDescriptor =
2015 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2016 SerializeConvolution2dLayer(layer,
2017 layerDescriptor,
2018 constants,
2019 name);
2020 break;
2021 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002022 case armnn::LayerType::Convolution3d :
2023 {
2024 const armnn::Convolution3dDescriptor& layerDescriptor =
2025 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2026 SerializeConvolution3dLayer(layer,
2027 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002028 name);
2029 break;
2030 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002031 case armnn::LayerType::DepthToSpace :
2032 {
2033 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2034 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2035 SerializeDepthToSpaceLayer(layer,
2036 layerDescriptor,
2037 name);
2038 break;
2039 }
2040 case armnn::LayerType::DepthwiseConvolution2d :
2041 {
2042 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2043 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2044 SerializeDepthwiseConvolution2dLayer(layer,
2045 layerDescriptor,
2046 constants,
2047 name);
2048 break;
2049 }
2050 case armnn::LayerType::Dequantize :
2051 {
2052 SerializeDequantizeLayer(layer,
2053 name);
2054 break;
2055 }
2056 case armnn::LayerType::DetectionPostProcess :
2057 {
2058 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2059 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2060 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2061 break;
2062 }
2063 case armnn::LayerType::Division :
2064 {
2065 SerializeDivisionLayer(layer, name);
2066 break;
2067 }
2068 case armnn::LayerType::ElementwiseUnary :
2069 {
2070 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2071 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2072 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2073 break;
2074 }
2075 case armnn::LayerType::Fill :
2076 {
2077 const armnn::FillDescriptor& layerDescriptor =
2078 static_cast<const armnn::FillDescriptor&>(descriptor);
2079 SerializeFillLayer(layer, layerDescriptor, name);
2080 break;
2081 }
2082 case armnn::LayerType::Floor :
2083 {
2084 SerializeFloorLayer(layer, name);
2085 break;
2086 }
2087 case armnn::LayerType::FullyConnected :
2088 {
2089 const armnn::FullyConnectedDescriptor& layerDescriptor =
2090 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002091 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002092 break;
2093 }
2094 case armnn::LayerType::Gather :
2095 {
2096 const armnn::GatherDescriptor& layerDescriptor =
2097 static_cast<const armnn::GatherDescriptor&>(descriptor);
2098 SerializeGatherLayer(layer, layerDescriptor, name);
2099 break;
2100 }
2101 case armnn::LayerType::Input:
2102 {
2103 SerializeInputLayer(layer, id, name);
2104 break;
2105 }
2106 case armnn::LayerType::InstanceNormalization :
2107 {
2108 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2109 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2110 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2111 break;
2112 }
2113 case armnn::LayerType::L2Normalization :
2114 {
2115 const armnn::L2NormalizationDescriptor& layerDescriptor =
2116 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2117 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2118 break;
2119 }
2120 case armnn::LayerType::LogicalBinary :
2121 {
2122 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2123 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2124 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2125 break;
2126 }
2127 case armnn::LayerType::LogSoftmax :
2128 {
2129 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2130 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2131 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2132 break;
2133 }
2134 case armnn::LayerType::Lstm :
2135 {
2136 const armnn::LstmDescriptor& layerDescriptor =
2137 static_cast<const armnn::LstmDescriptor&>(descriptor);
2138 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2139 break;
2140 }
2141 case armnn::LayerType::QLstm :
2142 {
2143 const armnn::QLstmDescriptor& layerDescriptor =
2144 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2145 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2146 break;
2147 }
2148 case armnn::LayerType::Maximum :
2149 {
2150 SerializeMaximumLayer(layer, name);
2151 break;
2152 }
2153 case armnn::LayerType::Mean :
2154 {
2155 const armnn::MeanDescriptor& layerDescriptor =
2156 static_cast<const armnn::MeanDescriptor&>(descriptor);
2157 SerializeMeanLayer(layer, layerDescriptor, name);
2158 break;
2159 }
2160 case armnn::LayerType::Merge :
2161 {
2162 SerializeMergeLayer(layer, name);
2163 break;
2164 }
2165 case armnn::LayerType::Minimum :
2166 {
2167 SerializeMinimumLayer(layer, name);
2168 break;
2169 }
2170 case armnn::LayerType::Multiplication :
2171 {
2172 SerializeMultiplicationLayer(layer, name);
2173 break;
2174 }
2175 case armnn::LayerType::Normalization :
2176 {
2177 const armnn::NormalizationDescriptor& layerDescriptor =
2178 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2179 SerializeNormalizationLayer(layer, layerDescriptor, name);
2180 break;
2181 }
2182 case armnn::LayerType::Output:
2183 {
2184 SerializeOutputLayer(layer, id, name);
2185 break;
2186 }
2187 case armnn::LayerType::Pad :
2188 {
2189 const armnn::PadDescriptor& layerDescriptor =
2190 static_cast<const armnn::PadDescriptor&>(descriptor);
2191 SerializePadLayer(layer, layerDescriptor, name);
2192 break;
2193 }
2194 case armnn::LayerType::Permute :
2195 {
2196 const armnn::PermuteDescriptor& layerDescriptor =
2197 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2198 SerializePermuteLayer(layer, layerDescriptor, name);
2199 break;
2200 }
2201 case armnn::LayerType::Pooling2d :
2202 {
2203 const armnn::Pooling2dDescriptor& layerDescriptor =
2204 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2205 SerializePooling2dLayer(layer, layerDescriptor, name);
2206 break;
2207 }
2208 case armnn::LayerType::Prelu :
2209 {
2210 SerializePreluLayer(layer, name);
2211 break;
2212 }
2213 case armnn::LayerType::Quantize :
2214 {
2215 SerializeQuantizeLayer(layer, name);
2216 break;
2217 }
2218 case armnn::LayerType::QuantizedLstm:
2219 SerializeQuantizedLstmLayer(layer, constants, name);
2220 break;
2221 case armnn::LayerType::Reshape:
2222 {
2223 const armnn::ReshapeDescriptor &layerDescriptor =
2224 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2225 SerializeReshapeLayer(layer, layerDescriptor, name);
2226 break;
2227 }
2228 case armnn::LayerType::Rank:
2229 {
2230 SerializeRankLayer(layer, name);
2231 break;
2232 }
2233 case armnn::LayerType::Reduce:
2234 {
2235 const armnn::ReduceDescriptor& layerDescriptor =
2236 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2237 SerializeReduceLayer(layer, layerDescriptor, name);
2238 break;
2239 }
2240 case armnn::LayerType::Resize:
2241 {
2242 const armnn::ResizeDescriptor& layerDescriptor =
2243 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2244 SerializeResizeLayer(layer, layerDescriptor, name);
2245 break;
2246 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002247 case armnn::LayerType::Shape:
2248 {
2249 SerializeShapeLayer(layer, name);
2250 break;
2251 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002252 case armnn::LayerType::Slice:
2253 {
2254 const armnn::SliceDescriptor& layerDescriptor =
2255 static_cast<const armnn::SliceDescriptor&>(descriptor);
2256 SerializeSliceLayer(layer, layerDescriptor, name);
2257 break;
2258 }
2259 case armnn::LayerType::Softmax:
2260 {
2261 const armnn::SoftmaxDescriptor& layerDescriptor =
2262 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2263 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2264 break;
2265 }
2266 case armnn::LayerType::SpaceToBatchNd:
2267 {
2268 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2269 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2270 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2271 break;
2272 }
2273 case armnn::LayerType::SpaceToDepth:
2274 {
2275 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2276 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2277 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2278 break;
2279 }
2280 case armnn::LayerType::Splitter:
2281 {
2282 const armnn::SplitterDescriptor& layerDescriptor =
2283 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2284 SerializeSplitterLayer(layer, layerDescriptor, name);
2285 break;
2286 }
2287 case armnn::LayerType::Stack:
2288 {
2289 const armnn::StackDescriptor& layerDescriptor =
2290 static_cast<const armnn::StackDescriptor&>(descriptor);
2291 SerializeStackLayer(layer, layerDescriptor, name);
2292 break;
2293 }
2294 case armnn::LayerType::StandIn:
2295 {
2296 const armnn::StandInDescriptor& layerDescriptor =
2297 static_cast<const armnn::StandInDescriptor&>(descriptor);
2298 SerializeStandInLayer(layer, layerDescriptor, name);
2299 break;
2300 }
2301 case armnn::LayerType::StridedSlice:
2302 {
2303 const armnn::StridedSliceDescriptor& layerDescriptor =
2304 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2305 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2306 break;
2307 }
2308 case armnn::LayerType::Subtraction:
2309 {
2310 SerializeSubtractionLayer(layer, name);
2311 break;
2312 }
2313 case armnn::LayerType::Switch:
2314 {
2315 SerializeSwitchLayer(layer, name);
2316 break;
2317 }
2318 case armnn::LayerType::Transpose:
2319 {
2320 const armnn::TransposeDescriptor& layerDescriptor =
2321 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2322 SerializeTransposeLayer(layer, layerDescriptor, name);
2323 break;
2324 }
2325 case armnn::LayerType::TransposeConvolution2d:
2326 {
2327 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2328 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2329 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2330 break;
2331 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002332 case armnn::LayerType::UnidirectionalSequenceLstm :
2333 {
2334 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2335 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2336 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2337 break;
2338 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002339 default:
2340 {
2341 throw InvalidArgumentException(
2342 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2343 layer->GetName(),
2344 id));
2345 }
2346 }
2347}
2348
Finn Williams85d36712021-01-26 22:30:06 +00002349void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002350{
2351 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002352 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2353 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002354
2355 // Create FlatBuffer SerializedGraph
2356 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002357 fbBuilder,
2358 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2359 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2360 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2361 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002362
2363 // Serialize the graph
2364 fbBuilder.Finish(serializedGraph);
2365}
2366
Finn Williamsb454c5c2021-02-09 15:56:23 +00002367
Finn Williams85d36712021-01-26 22:30:06 +00002368bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002369{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002370 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002371
Matthew Sloyan0663d662020-09-14 11:47:26 +01002372 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002373 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002374 return !stream.bad();
2375}
2376
Finn Williams2605b232020-06-10 15:53:46 +01002377} // namespace armnnSerializer