blob: 7e1b74e10d5af07a2c66ed3646dd93f4a30fbe86 [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 Sloyanb63a3112021-09-08 13:05:51 +0100391// Build FlatBuffer for Convolution2dLayer
392void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
393 const armnn::Convolution3dDescriptor& descriptor,
394 const std::vector<armnn::ConstTensor>& constants,
395 const char* name)
396{
397 IgnoreUnused(name);
398
399 const armnn::ConstTensor weights = constants[0];
400
401 // Create FlatBuffer BaseLayer
402 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
403
404 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
405 descriptor.m_PadLeft,
406 descriptor.m_PadRight,
407 descriptor.m_PadTop,
408 descriptor.m_PadBottom,
409 descriptor.m_PadFront,
410 descriptor.m_PadBack,
411 descriptor.m_StrideX,
412 descriptor.m_StrideY,
413 descriptor.m_StrideZ,
414 descriptor.m_DilationX,
415 descriptor.m_DilationY,
416 descriptor.m_DilationZ,
417 descriptor.m_BiasEnabled,
418 GetFlatBufferDataLayout(descriptor.m_DataLayout));
419 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
420 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
421
422 if (constants.size() > 1)
423 {
424 const armnn::ConstTensor biases = constants[1];
425 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
426 }
427
428 // Create the FlatBuffer Convolution2dLayer
429 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
430 flatBufferBaseLayer,
431 flatBufferDescriptor,
432 flatBufferWeightsConstTensorInfo,
433 flatBufferBiasesConstTensorInfo);
434
435 // Add the AnyLayer to the FlatBufferLayers
436 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
437}
438
Finn Williamsb454c5c2021-02-09 15:56:23 +0000439void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100440 const armnn::DepthToSpaceDescriptor& descriptor,
441 const char* name)
442{
Jan Eilers8eb25602020-03-09 12:13:48 +0000443 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000444
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100445 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
446 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
447 descriptor.m_BlockSize,
448 GetFlatBufferDataLayout(descriptor.m_DataLayout));
449
450 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
451
452 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100453}
454
Finn Williamsb454c5c2021-02-09 15:56:23 +0000455void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
456 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
457 const std::vector<armnn::ConstTensor>& constants,
458 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000459{
Jan Eilers8eb25602020-03-09 12:13:48 +0000460 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000461
Finn Williamsb454c5c2021-02-09 15:56:23 +0000462 const armnn::ConstTensor& weights = constants[0];
463
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000464 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
465 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
466 descriptor.m_PadLeft,
467 descriptor.m_PadRight,
468 descriptor.m_PadTop,
469 descriptor.m_PadBottom,
470 descriptor.m_StrideX,
471 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100472 descriptor.m_DilationX,
473 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000474 descriptor.m_BiasEnabled,
475 GetFlatBufferDataLayout(descriptor.m_DataLayout));
476
477 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
478 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000479
480 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000481 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000482 const armnn::ConstTensor& biases = constants[1];
483 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000484 }
485
486 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
487 fbBaseLayer,
488 fbDescriptor,
489 fbWeightsConstTensorInfo,
490 fbBiasesConstTensorInfo);
491
492 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
493}
494
Finn Williamsb454c5c2021-02-09 15:56:23 +0000495void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000496 const char* name)
497{
Jan Eilers8eb25602020-03-09 12:13:48 +0000498 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000499
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000500 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
501 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
502
503 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
504}
505
Finn Williamsb454c5c2021-02-09 15:56:23 +0000506void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
507 const armnn::DetectionPostProcessDescriptor& descriptor,
508 const std::vector<armnn::ConstTensor>& constants,
509 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000510{
Jan Eilers8eb25602020-03-09 12:13:48 +0000511 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000512
Finn Williamsb454c5c2021-02-09 15:56:23 +0000513 const armnn::ConstTensor& anchors = constants[0];
514
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000515 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
516 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
517 descriptor.m_MaxDetections,
518 descriptor.m_MaxClassesPerDetection,
519 descriptor.m_DetectionsPerClass,
520 descriptor.m_NmsScoreThreshold,
521 descriptor.m_NmsIouThreshold,
522 descriptor.m_NumClasses,
523 descriptor.m_UseRegularNms,
524 descriptor.m_ScaleX,
525 descriptor.m_ScaleY,
526 descriptor.m_ScaleW,
527 descriptor.m_ScaleH);
528
529 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
530
531 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
532 fbBaseLayer,
533 fbDescriptor,
534 fbAnchorsConstTensorInfo);
535
536 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
537}
538
Finn Williamsb454c5c2021-02-09 15:56:23 +0000539void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000540{
Jan Eilers8eb25602020-03-09 12:13:48 +0000541 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000542
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000543 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
544 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000545
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000546 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
547}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000548
Finn Williamsb454c5c2021-02-09 15:56:23 +0000549void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600550 const armnn::ElementwiseUnaryDescriptor& descriptor,
551 const char* name)
552{
Jan Eilers8eb25602020-03-09 12:13:48 +0000553 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600554
555 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
556 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
557 m_flatBufferBuilder,
558 GetFlatBufferUnaryOperation(descriptor.m_Operation));
559
560 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
561 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
562}
563
Finn Williamsb454c5c2021-02-09 15:56:23 +0000564void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100565 const armnn::FillDescriptor& fillDescriptor,
566 const char* name)
567{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100568 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100569
570 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
571
572 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
573
574 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
575
576 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100577}
578
Finn Williamsb454c5c2021-02-09 15:56:23 +0000579void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000580{
Jan Eilers8eb25602020-03-09 12:13:48 +0000581 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000582
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000583 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
584 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
585
586 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
587}
588
Finn Williamsb454c5c2021-02-09 15:56:23 +0000589void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100590 const armnn::GatherDescriptor& gatherDescriptor,
591 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000592{
Jan Eilers8eb25602020-03-09 12:13:48 +0000593 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000594
Teresa Charlin52664732020-06-29 16:27:03 +0100595 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
596 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000597 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100598 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000599
600 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
601}
602
Finn Williamsb454c5c2021-02-09 15:56:23 +0000603void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100604 const armnn::IConnectableLayer* layer,
605 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
606 const char* name)
607{
Jan Eilers8eb25602020-03-09 12:13:48 +0000608 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000609
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100610 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
611 m_flatBufferBuilder,
612 instanceNormalizationDescriptor.m_Gamma,
613 instanceNormalizationDescriptor.m_Beta,
614 instanceNormalizationDescriptor.m_Eps,
615 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
616
617 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
618 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
619
620 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100621}
622
Finn Williamsb454c5c2021-02-09 15:56:23 +0000623void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000624 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
625 const char* name)
626{
Jan Eilers8eb25602020-03-09 12:13:48 +0000627 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000628
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000629 // Create FlatBuffer BaseLayer
630 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
631
632 // Create the FlatBuffer L2Normalization Descriptor
633 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100634 m_flatBufferBuilder,
635 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
636 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000637
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100638 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000639 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
640
641 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
642}
643
Finn Williamsb454c5c2021-02-09 15:56:23 +0000644void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000645 const armnn::LogicalBinaryDescriptor& descriptor,
646 const char* name)
647{
648 IgnoreUnused(name);
649
650 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
651 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
652 m_flatBufferBuilder,
653 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
654
655 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
656 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
657}
658
Finn Williamsb454c5c2021-02-09 15:56:23 +0000659void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100660 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
661 const char* name)
662{
Jan Eilers8eb25602020-03-09 12:13:48 +0000663 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000664
Sadik Armagan26257852019-10-14 13:00:47 +0100665 // Create FlatBuffer BaseLayer
666 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
667
668 // Create the FlatBuffer LogSoftmaxDescriptor
669 auto flatBufferLogSoftmaxDesc =
670 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
671 logSoftmaxDescriptor.m_Beta,
672 logSoftmaxDescriptor.m_Axis);
673
674 // Create the FlatBuffer LogSoftmaxLayer
675 auto flatBufferLogSoftmaxLayer =
676 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
677 flatBufferLogSoftmaxBaseLayer,
678 flatBufferLogSoftmaxDesc);
679
680 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100681}
682
Finn Williamsb454c5c2021-02-09 15:56:23 +0000683void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
684 const armnn::LstmDescriptor& descriptor,
685 const std::vector<armnn::ConstTensor>& constants,
686 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000687{
Jan Eilers8eb25602020-03-09 12:13:48 +0000688 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000689
Jim Flynn11af3752019-03-19 17:22:29 +0000690 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
691
692 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
693 m_flatBufferBuilder,
694 descriptor.m_ActivationFunc,
695 descriptor.m_ClippingThresCell,
696 descriptor.m_ClippingThresProj,
697 descriptor.m_CifgEnabled,
698 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100699 descriptor.m_ProjectionEnabled,
700 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000701
Finn Williamsb454c5c2021-02-09 15:56:23 +0000702 // Index for constants vector
703 std::size_t i = 0;
704
705 // Get mandatory/basic input parameters
706 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
707 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
708 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
709 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
710 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
711 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
712 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
713 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
714 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
715
716
Jim Flynn11af3752019-03-19 17:22:29 +0000717
718 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
719 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
720 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
721 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
722 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
723 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
724 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
725 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
726 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100727 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
728 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
729 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
730 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000731
732 if (!descriptor.m_CifgEnabled)
733 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000734 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
735 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
736 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000737 }
738
739 if (descriptor.m_PeepholeEnabled)
740 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000741 if (!descriptor.m_CifgEnabled)
742 {
743 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
744 }
745 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
746 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
747 }
748
749 if (descriptor.m_ProjectionEnabled)
750 {
751 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
752 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000753 }
754
Jan Eilersf8c62972019-07-17 11:07:49 +0100755 if (descriptor.m_LayerNormEnabled)
756 {
757 if (!descriptor.m_CifgEnabled)
758 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000759 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100760 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000761 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
762 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
763 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100764 }
765
Jim Flynn11af3752019-03-19 17:22:29 +0000766 auto fbLstmParams = serializer::CreateLstmInputParams(
767 m_flatBufferBuilder,
768 inputToForgetWeights,
769 inputToCellWeights,
770 inputToOutputWeights,
771 recurrentToForgetWeights,
772 recurrentToCellWeights,
773 recurrentToOutputWeights,
774 forgetGateBias,
775 cellBias,
776 outputGateBias,
777 inputToInputWeights,
778 recurrentToInputWeights,
779 cellToInputWeights,
780 inputGateBias,
781 projectionWeights,
782 projectionBias,
783 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100784 cellToOutputWeights,
785 inputLayerNormWeights,
786 forgetLayerNormWeights,
787 cellLayerNormWeights,
788 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000789
790 auto fbLstmLayer = serializer::CreateLstmLayer(
791 m_flatBufferBuilder,
792 fbLstmBaseLayer,
793 fbLstmDescriptor,
794 fbLstmParams);
795
796 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
797}
798
Finn Williamsb454c5c2021-02-09 15:56:23 +0000799void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000800{
Jan Eilers8eb25602020-03-09 12:13:48 +0000801 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000802
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000803 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
804 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
805
806 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
807}
808
Finn Williamsb454c5c2021-02-09 15:56:23 +0000809void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000810 const armnn::MeanDescriptor& descriptor,
811 const char* name)
812{
Jan Eilers8eb25602020-03-09 12:13:48 +0000813 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000814
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000815 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
816 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
817 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
818 descriptor.m_KeepDims);
819
820 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
821 fbMeanBaseLayer,
822 fbMeanDescriptor);
823
824 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
825}
826
Finn Williamsb454c5c2021-02-09 15:56:23 +0000827void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000828{
Jan Eilers8eb25602020-03-09 12:13:48 +0000829 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000830
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000831 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
832 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
833
834 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
835}
836
Finn Williamsb454c5c2021-02-09 15:56:23 +0000837void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100838{
Jan Eilers8eb25602020-03-09 12:13:48 +0000839 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000840
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100841 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
842 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
843
844 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
845}
846
Finn Williamsb454c5c2021-02-09 15:56:23 +0000847void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100848 const armnn::ConcatDescriptor& concatDescriptor,
849 const char* name)
850{
Jan Eilers8eb25602020-03-09 12:13:48 +0000851 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000852
Jim Flynne242f2d2019-05-22 14:24:13 +0100853 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000854
855 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100856 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000857 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100858 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000859 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100860 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000861 {
862 origins.push_back(origin[d]);
863 }
864 auto view = m_flatBufferBuilder.CreateVector(origins);
865 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
866 views.push_back(uintVector);
867 }
868
Jim Flynne242f2d2019-05-22 14:24:13 +0100869 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
870 concatDescriptor.GetConcatAxis(),
871 concatDescriptor.GetNumViews(),
872 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000873 m_flatBufferBuilder.CreateVector(views));
874
Jim Flynne242f2d2019-05-22 14:24:13 +0100875 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
876 flatBufferConcatBaseLayer,
877 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000878
Jim Flynne242f2d2019-05-22 14:24:13 +0100879 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000880}
881
Finn Williamsb454c5c2021-02-09 15:56:23 +0000882void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000883{
Jan Eilers8eb25602020-03-09 12:13:48 +0000884 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000885
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000886 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
887 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
888 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000889
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000890 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000891}
892
Finn Williamsb454c5c2021-02-09 15:56:23 +0000893void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000894 const armnn::PadDescriptor& padDescriptor,
895 const char* name)
896{
Jan Eilers8eb25602020-03-09 12:13:48 +0000897 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000898
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000899 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
900
901 std::vector<unsigned int> padList;
902 for (auto& p: padDescriptor.m_PadList)
903 {
904 padList.push_back(p.first);
905 padList.push_back(p.second);
906 }
907
908 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100909 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100910 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000911
912 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
913 flatBufferBaseLayer,
914 flatBufferPadDesc);
915
916 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
917}
918
Finn Williamsb454c5c2021-02-09 15:56:23 +0000919void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000920 const armnn::PermuteDescriptor& permuteDescriptor,
921 const char* name)
922{
Jan Eilers8eb25602020-03-09 12:13:48 +0000923 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000924
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000925 // Create FlatBuffer BaseLayer
926 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
927
928 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100929 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000930 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100931 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000932 }
933
934 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
935 m_flatBufferBuilder.CreateVector(dimMappings));
936
937 // Create the FlatBuffer PermuteLayer
938 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
939 flatBufferPermuteBaseLayer,
940 flatBufferPermuteDesc);
941
942 // Add the AnyLayer to the FlatBufferLayers
943 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
944}
945
Finn Williams2605b232020-06-10 15:53:46 +0100946// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000947void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100948 const char* name)
949{
950 IgnoreUnused(name);
951 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
952 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
953
954 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
955}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000956
Finn Williamsb454c5c2021-02-09 15:56:23 +0000957void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
958 const armnn::ReduceDescriptor& reduceDescriptor,
959 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000960{
961 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
962 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000963 reduceDescriptor.m_KeepDims,
964 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
965 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
966 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
967 fbReduceBaseLayer,
968 fbDescriptor);
969
970 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
971}
972
Saoirse Stewart263829c2019-02-19 15:54:14 +0000973// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000974void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000975 const armnn::ReshapeDescriptor& reshapeDescriptor,
976 const char* name)
977{
Jan Eilers8eb25602020-03-09 12:13:48 +0000978 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000979
Saoirse Stewart263829c2019-02-19 15:54:14 +0000980 // Create FlatBuffer BaseLayer
981 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
982
983 std::vector<unsigned int> targetShape;
984 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
985 {
986 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
987 }
988
989 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
990 m_flatBufferBuilder.CreateVector(targetShape));
991
992 // Create the FlatBuffer ReshapeLayer
993 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
994 flatBufferReshapeDesc);
995
996 // Add the AnyLayer to the FlatBufferLayers
997 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
998}
999
Finn Williamsb454c5c2021-02-09 15:56:23 +00001000void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001001 const armnn::ResizeDescriptor& resizeDescriptor,
1002 const char* name)
1003{
Jan Eilers8eb25602020-03-09 12:13:48 +00001004 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001005
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001006 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1007
1008 auto flatBufferDescriptor =
1009 CreateResizeDescriptor(m_flatBufferBuilder,
1010 resizeDescriptor.m_TargetHeight,
1011 resizeDescriptor.m_TargetWidth,
1012 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001013 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1014 resizeDescriptor.m_AlignCorners,
1015 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001016
1017 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1018 flatBufferBaseLayer,
1019 flatBufferDescriptor);
1020
1021 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001022}
1023
Finn Williamsb454c5c2021-02-09 15:56:23 +00001024void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001025 const armnn::SliceDescriptor& sliceDescriptor,
1026 const char* name)
1027{
Jan Eilers8eb25602020-03-09 12:13:48 +00001028 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001029
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001030 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1031 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1032 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1033 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1034
1035 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1036
1037 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001038}
1039
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001040// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001041void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001042 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001043 const char* name)
1044{
Jan Eilers8eb25602020-03-09 12:13:48 +00001045 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001046
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001047 // Create FlatBuffer BaseLayer
1048 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1049
1050 // Create the FlatBuffer SoftmaxDescriptor
1051 auto flatBufferSoftmaxDesc =
1052 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1053
1054 // Create the FlatBuffer SoftmaxLayer
1055 auto flatBufferSoftmaxLayer =
1056 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1057 flatBufferSoftmaxBaseLayer,
1058 flatBufferSoftmaxDesc);
1059
1060 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1061}
1062
Finn Williamsb454c5c2021-02-09 15:56:23 +00001063void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001064 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001065 const char* name)
1066{
Jan Eilers8eb25602020-03-09 12:13:48 +00001067 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001068
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001069 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1070 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1071 m_flatBufferBuilder,
1072 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1073 pooling2dDescriptor.m_PadLeft,
1074 pooling2dDescriptor.m_PadRight,
1075 pooling2dDescriptor.m_PadTop,
1076 pooling2dDescriptor.m_PadBottom,
1077 pooling2dDescriptor.m_PoolWidth,
1078 pooling2dDescriptor.m_PoolHeight,
1079 pooling2dDescriptor.m_StrideX,
1080 pooling2dDescriptor.m_StrideY,
1081 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1082 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1083 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1084
1085 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1086 fbPooling2dBaseLayer,
1087 fbPooling2dDescriptor);
1088
1089 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1090}
1091
Finn Williamsb454c5c2021-02-09 15:56:23 +00001092void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001093 const char* name)
1094{
Jan Eilers8eb25602020-03-09 12:13:48 +00001095 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001096
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001097 // Create FlatBuffer BaseLayer
1098 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1099
1100 // Create the FlatBuffer AdditionLayer
1101 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1102
1103 // Add the AnyLayer to the FlatBufferLayers
1104 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001105}
1106
Finn Williamsb454c5c2021-02-09 15:56:23 +00001107void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001108{
Jan Eilers8eb25602020-03-09 12:13:48 +00001109 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001110
Derek Lamberti87acb272019-03-27 16:51:31 +00001111 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1112 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1113 fbQuantizeBaseLayer);
1114 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1115}
1116
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001117// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001118void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1119 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001120 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001121{
1122 // Create FlatBuffer BaseLayer
1123 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1124
1125 // Create FlatBuffer FullyConnectedDescriptor
1126 auto flatBufferDescriptor =
1127 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1128 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001129 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1130 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001131
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001132 // Create FlatBuffer FullyConnectedLayer
1133 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1134 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001135 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001136
1137 // Add created FullyConnectedLayer to the FlatBufferLayers
1138 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1139}
1140
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001141// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001142void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001143 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1144 const char* name)
1145{
Jan Eilers8eb25602020-03-09 12:13:48 +00001146 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001147
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001148 // Create FlatBuffer BaseLayer
1149 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1150
1151 std::vector<unsigned int> padList;
1152 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1153 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1154 {
1155 padList.push_back(pad.first);
1156 padList.push_back(pad.second);
1157 }
1158
1159 auto flatBufferDescriptor =
1160 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1161 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1162 m_flatBufferBuilder.CreateVector(padList),
1163 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1164
1165 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1166 flatBufferBaseLayer,
1167 flatBufferDescriptor);
1168
1169 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1170}
1171
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001172// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001173void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001174 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1175 const char* name)
1176{
Jan Eilers8eb25602020-03-09 12:13:48 +00001177 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001178
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001179 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1180 auto flatBufferDescriptor =
1181 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1182 spaceToDepthDescriptor.m_BlockSize,
1183 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1184
1185 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1186 flatBufferBaseLayer,
1187 flatBufferDescriptor);
1188
1189 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001190}
1191
Jim Flynn18ce3382019-03-08 11:08:30 +00001192// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001193void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001194 const armnn::ViewsDescriptor& viewsDescriptor,
1195 const char* name)
1196{
Jan Eilers8eb25602020-03-09 12:13:48 +00001197 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001198
Jim Flynn18ce3382019-03-08 11:08:30 +00001199 // Create FlatBuffer ViewOrigins
1200 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1201 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1202
1203 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1204 {
1205 std::vector<uint32_t> viewOrigin;
1206 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1207
1208 // Copy vector
1209 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1210 {
1211 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1212 }
1213
1214 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1215 m_flatBufferBuilder.CreateVector(viewOrigin)));
1216 }
1217
1218 // Create FlatBuffer OriginsDescriptor
1219 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1220 viewsDescriptor.GetOrigins().GetConcatAxis(),
1221 viewsDescriptor.GetOrigins().GetNumViews(),
1222 viewsDescriptor.GetOrigins().GetNumDimensions(),
1223 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1224
1225 // Create FlatBuffer ViewOrigins
1226 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1227 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1228
1229 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1230 {
1231 std::vector<uint32_t> viewSize;
1232 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1233
1234 // Copy vector
1235 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1236 {
1237 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1238 }
1239
1240 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1241 m_flatBufferBuilder.CreateVector(viewSize)));
1242 }
1243
1244 // Create FlatBuffer ViewsDescriptor
1245 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1246 flatBufferOriginDescriptor,
1247 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1248
1249 // Create FlatBuffer BaseLayer
1250 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1251
1252 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1253 flatBufferBaseLayer,
1254 flatBufferViewsDescriptor);
1255
1256 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1257}
1258
Finn Williamsb454c5c2021-02-09 15:56:23 +00001259void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001260 const armnn::NormalizationDescriptor& descriptor,
1261 const char* name)
1262{
Jan Eilers8eb25602020-03-09 12:13:48 +00001263 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001264
Nina Drozd57728782019-02-27 10:53:27 +00001265 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1266
1267 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1268 m_flatBufferBuilder,
1269 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1270 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1271 descriptor.m_NormSize,
1272 descriptor.m_Alpha,
1273 descriptor.m_Beta,
1274 descriptor.m_K,
1275 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1276
1277 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1278 fbNormalizationBaseLayer,
1279 fbNormalizationDescriptor);
1280
1281 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1282}
1283
Keith Davis3ae3f972021-05-21 16:33:48 +01001284void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1285 const char* name)
1286{
1287 IgnoreUnused(name);
1288
1289 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1290 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1291
1292 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1293}
1294
Finn Williamsb454c5c2021-02-09 15:56:23 +00001295void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001296 const armnn::StackDescriptor& stackDescriptor,
1297 const char* name)
1298{
Jan Eilers8eb25602020-03-09 12:13:48 +00001299 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001300
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001301 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1302
1303 std::vector<unsigned int> inputShape;
1304 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1305 {
1306 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1307 }
1308
1309 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1310 stackDescriptor.m_Axis,
1311 stackDescriptor.m_NumInputs,
1312 m_flatBufferBuilder.CreateVector(inputShape));
1313
1314 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1315 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001316}
1317
Finn Williamsb454c5c2021-02-09 15:56:23 +00001318void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001319 const armnn::StandInDescriptor& standInDescriptor,
1320 const char *name)
1321{
Jan Eilers8eb25602020-03-09 12:13:48 +00001322 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001323
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001324 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1325 standInDescriptor.m_NumInputs,
1326 standInDescriptor.m_NumOutputs);
1327
1328 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1329 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1330
1331 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001332}
1333
Finn Williamsb454c5c2021-02-09 15:56:23 +00001334void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001335 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1336 const char* name)
1337{
Jan Eilers8eb25602020-03-09 12:13:48 +00001338 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001339
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001340 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1341
1342 auto flatBufferDescriptor =
1343 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1344 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1345 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1346 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1347 stridedSliceDescriptor.m_BeginMask,
1348 stridedSliceDescriptor.m_EndMask,
1349 stridedSliceDescriptor.m_ShrinkAxisMask,
1350 stridedSliceDescriptor.m_EllipsisMask,
1351 stridedSliceDescriptor.m_NewAxisMask,
1352 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1353
1354 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1355 flatBufferBaseLayer,
1356 flatBufferDescriptor);
1357
1358 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1359}
1360
Finn Williamsb454c5c2021-02-09 15:56:23 +00001361void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001362{
Jan Eilers8eb25602020-03-09 12:13:48 +00001363 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001364
Conor Kennedyda1f9752019-03-01 14:37:12 +00001365 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1366 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1367
1368 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1369}
1370
Finn Williamsb454c5c2021-02-09 15:56:23 +00001371void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001372{
Jan Eilers8eb25602020-03-09 12:13:48 +00001373 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001374
Sadik Armaganeff363d2019-04-05 15:25:46 +01001375 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1376 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1377
1378 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1379}
1380
Finn Williamsb454c5c2021-02-09 15:56:23 +00001381void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001382 const armnn::IConnectableLayer* layer,
1383 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001384 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001385 const char* name)
1386{
Jan Eilers8eb25602020-03-09 12:13:48 +00001387 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001388
Finn Williamsb454c5c2021-02-09 15:56:23 +00001389 const armnn::ConstTensor& weights = constants.at(0);
1390
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001391 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1392 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1393 descriptor.m_PadLeft,
1394 descriptor.m_PadRight,
1395 descriptor.m_PadTop,
1396 descriptor.m_PadBottom,
1397 descriptor.m_StrideX,
1398 descriptor.m_StrideY,
1399 descriptor.m_BiasEnabled,
1400 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1401
1402 // weights & biases
1403 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1404 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001405 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001406 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001407 const armnn::ConstTensor& biases = constants.at(1);
1408 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001409 }
1410
1411 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1412 fbBaseLayer,
1413 fbDescriptor,
1414 fbWeightsConstTensorInfo,
1415 fbBiasesConstTensorInfo);
1416
1417 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001418}
1419
Finn Williamsb454c5c2021-02-09 15:56:23 +00001420void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001421 const armnn::TransposeDescriptor& descriptor,
1422 const char* name)
1423{
Jan Eilers8eb25602020-03-09 12:13:48 +00001424 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001425
1426 // Create FlatBuffer BaseLayer
1427 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1428
1429 std::vector<unsigned int> dimMappings;
1430 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1431 {
1432 dimMappings.push_back(descriptor.m_DimMappings[i]);
1433 }
1434
1435 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1436 m_flatBufferBuilder.CreateVector(dimMappings));
1437
1438 // Create the FlatBuffer TransposeLayer
1439 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1440 flatBufferBaseLayer,
1441 flatBufferDesc);
1442
1443 // Add the AnyLayer to the FlatBufferLayers
1444 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1445}
1446
Finn Williamsb454c5c2021-02-09 15:56:23 +00001447void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1448 const armnn::QLstmDescriptor& descriptor,
1449 const std::vector<armnn::ConstTensor>& constants,
1450 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001451{
James Conroy8d333182020-05-13 10:27:58 +01001452 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001453
James Conroy8d333182020-05-13 10:27:58 +01001454 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1455
1456 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1457 m_flatBufferBuilder,
1458 descriptor.m_CifgEnabled,
1459 descriptor.m_PeepholeEnabled,
1460 descriptor.m_ProjectionEnabled,
1461 descriptor.m_LayerNormEnabled,
1462 descriptor.m_CellClip,
1463 descriptor.m_ProjectionClip,
1464 descriptor.m_InputIntermediateScale,
1465 descriptor.m_ForgetIntermediateScale,
1466 descriptor.m_CellIntermediateScale,
1467 descriptor.m_OutputIntermediateScale,
1468 descriptor.m_HiddenStateZeroPoint,
1469 descriptor.m_HiddenStateScale
1470 );
1471
Finn Williamsb454c5c2021-02-09 15:56:23 +00001472 // Index for constants vector
1473 std::size_t i = 0;
1474
James Conroy8d333182020-05-13 10:27:58 +01001475 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001476 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1477 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1478 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1479 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1480 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1481 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1482 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1483 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1484 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001485
1486 // CIFG
1487 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1488 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1489 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1490
1491 if (!descriptor.m_CifgEnabled)
1492 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001493 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1494 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1495 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001496 }
1497
1498 // Peephole
1499 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1500 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1501 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1502
1503 if (descriptor.m_PeepholeEnabled)
1504 {
1505 if (!descriptor.m_CifgEnabled)
1506 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001507 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001508 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001509 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1510 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1511 }
James Conroy8d333182020-05-13 10:27:58 +01001512
Finn Williamsb454c5c2021-02-09 15:56:23 +00001513 // Projection
1514 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1515 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1516
1517 if (descriptor.m_ProjectionEnabled)
1518 {
1519 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1520 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001521 }
1522
1523 // Layer norm
1524 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1525 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1526 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1527 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1528
1529 if (descriptor.m_LayerNormEnabled)
1530 {
1531 if (!descriptor.m_CifgEnabled)
1532 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001533 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001534 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001535 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1536 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1537 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001538 }
1539
1540 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1541 m_flatBufferBuilder,
1542 inputToForgetWeights,
1543 inputToCellWeights,
1544 inputToOutputWeights,
1545 recurrentToForgetWeights,
1546 recurrentToCellWeights,
1547 recurrentToOutputWeights,
1548 forgetGateBias,
1549 cellBias,
1550 outputGateBias,
1551 inputToInputWeights,
1552 recurrentToInputWeights,
1553 inputGateBias,
1554 projectionWeights,
1555 projectionBias,
1556 cellToInputWeights,
1557 cellToForgetWeights,
1558 cellToOutputWeights,
1559 inputLayerNormWeights,
1560 forgetLayerNormWeights,
1561 cellLayerNormWeights,
1562 outputLayerNormWeights);
1563
1564 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1565 m_flatBufferBuilder,
1566 fbQLstmBaseLayer,
1567 fbQLstmDescriptor,
1568 fbQLstmParams);
1569
1570 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001571}
1572
Finn Williamsb454c5c2021-02-09 15:56:23 +00001573void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1574 const std::vector<armnn::ConstTensor>& constants,
1575 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001576{
Jan Eilers8eb25602020-03-09 12:13:48 +00001577 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001578
Jan Eilers5b01a892019-07-23 09:47:43 +01001579 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1580
Finn Williamsb454c5c2021-02-09 15:56:23 +00001581 // index for constants vector
1582 size_t i = 0;
1583
Jan Eilers5b01a892019-07-23 09:47:43 +01001584 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001585 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1586 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1587 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1588 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001589
Finn Williamsb454c5c2021-02-09 15:56:23 +00001590 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1591 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1592 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1593 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001594
Finn Williamsb454c5c2021-02-09 15:56:23 +00001595 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1596 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1597 auto cellBias = CreateConstTensorInfo(constants[i++]);
1598 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001599
1600 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1601 m_flatBufferBuilder,
1602 inputToInputWeights,
1603 inputToForgetWeights,
1604 inputToCellWeights,
1605 inputToOutputWeights,
1606 recurrentToInputWeights,
1607 recurrentToForgetWeights,
1608 recurrentToCellWeights,
1609 recurrentToOutputWeights,
1610 inputGateBias,
1611 forgetGateBias,
1612 cellBias,
1613 outputGateBias);
1614
1615 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1616 m_flatBufferBuilder,
1617 fbQuantizedLstmBaseLayer,
1618 fbQuantizedLstmParams);
1619
1620 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001621}
1622
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001623void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1624 const armnn::IConnectableLayer* layer,
1625 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1626 const std::vector<armnn::ConstTensor>& constants,
1627 const char* name)
1628{
1629 IgnoreUnused(name);
1630
1631 auto fbUnidirectionalSequenceLstmBaseLayer =
1632 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1633
1634 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1635 m_flatBufferBuilder,
1636 descriptor.m_ActivationFunc,
1637 descriptor.m_ClippingThresCell,
1638 descriptor.m_ClippingThresProj,
1639 descriptor.m_CifgEnabled,
1640 descriptor.m_PeepholeEnabled,
1641 descriptor.m_ProjectionEnabled,
1642 descriptor.m_LayerNormEnabled,
1643 descriptor.m_TimeMajor);
1644
1645 // Index for constants vector
1646 std::size_t i = 0;
1647
1648 // Get mandatory/basic input parameters
1649 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1650 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1651 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1652 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1653 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1654 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1655 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1656 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1657 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1658
1659 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1660 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1661 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1662 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1663 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1664 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1665 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1666 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1667 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1668 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1669 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1670 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1671 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1672
1673 if (!descriptor.m_CifgEnabled)
1674 {
1675 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1676 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1677 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1678 }
1679
1680 if (descriptor.m_PeepholeEnabled)
1681 {
1682 if (!descriptor.m_CifgEnabled)
1683 {
1684 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1685 }
1686 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1687 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1688 }
1689
1690 if (descriptor.m_ProjectionEnabled)
1691 {
1692 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1693 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1694 }
1695
1696 if (descriptor.m_LayerNormEnabled)
1697 {
1698 if (!descriptor.m_CifgEnabled)
1699 {
1700 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1701 }
1702 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1703 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1704 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1705 }
1706
1707 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1708 m_flatBufferBuilder,
1709 inputToForgetWeights,
1710 inputToCellWeights,
1711 inputToOutputWeights,
1712 recurrentToForgetWeights,
1713 recurrentToCellWeights,
1714 recurrentToOutputWeights,
1715 forgetGateBias,
1716 cellBias,
1717 outputGateBias,
1718 inputToInputWeights,
1719 recurrentToInputWeights,
1720 cellToInputWeights,
1721 inputGateBias,
1722 projectionWeights,
1723 projectionBias,
1724 cellToForgetWeights,
1725 cellToOutputWeights,
1726 inputLayerNormWeights,
1727 forgetLayerNormWeights,
1728 cellLayerNormWeights,
1729 outputLayerNormWeights);
1730
1731 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1732 m_flatBufferBuilder,
1733 fbUnidirectionalSequenceLstmBaseLayer,
1734 fbUnidirectionalSequenceLstmDescriptor,
1735 fbUnidirectionalSequenceLstmParams);
1736
1737 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1738}
1739
Finn Williamsb454c5c2021-02-09 15:56:23 +00001740fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001741 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001742{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001743
Sadik Armagandb059fd2019-03-20 12:28:32 +00001744 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1745
Mike Kelly8c1701a2019-02-11 17:01:27 +00001746 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1747 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1748
1749 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001750 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001751 m_flatBufferBuilder.CreateString(layer->GetName()),
1752 layerType,
1753 m_flatBufferBuilder.CreateVector(inputSlots),
1754 m_flatBufferBuilder.CreateVector(outputSlots));
1755}
1756
Finn Williamsb454c5c2021-02-09 15:56:23 +00001757void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001758{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001759
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001760 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001761 m_serializedLayers.push_back(anyLayer);
1762}
1763
Mike Kellya0766c32019-02-19 17:22:07 +00001764template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001765flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001766{
1767 const T* buffer = reinterpret_cast<const T*>(memory);
1768 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1769 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1770 return fbVector;
1771}
1772
Finn Williamsb454c5c2021-02-09 15:56:23 +00001773flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001774{
Mike Kellya0766c32019-02-19 17:22:07 +00001775 // Get the dimensions
1776 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001777 std::vector<bool> specificity;
1778 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1779 // matches the size of dimensions.
1780 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1781 {
1782 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001783
1784 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1785 {
1786 shape.push_back(tensorInfo.GetShape()[dim]);
1787 }
1788 else
1789 {
1790 shape.push_back(0);
1791 }
Colm Donelan800b2812021-02-12 12:43:35 +00001792 }
1793
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001794 if (tensorInfo.HasPerAxisQuantization())
1795 {
1796 // Create FlatBuffer TensorInfo
1797 auto flatBufferTensorInfo =
1798 serializer::CreateTensorInfo(m_flatBufferBuilder,
1799 m_flatBufferBuilder.CreateVector(shape),
1800 GetFlatBufferDataType(tensorInfo.GetDataType()),
1801 tensorInfo.GetQuantizationScales()[0],
1802 tensorInfo.GetQuantizationOffset(),
1803 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001804 tensorInfo.GetQuantizationDim().value(),
1805 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001806 (tensorInfo.GetShape().GetDimensionality()),
1807 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001808 return flatBufferTensorInfo;
1809 }
1810
Mike Kellya0766c32019-02-19 17:22:07 +00001811 // Create FlatBuffer TensorInfo
1812 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1813 m_flatBufferBuilder.CreateVector(shape),
1814 GetFlatBufferDataType(tensorInfo.GetDataType()),
1815 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001816 tensorInfo.GetQuantizationOffset(),
1817 0,
1818 0,
1819 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001820 (tensorInfo.GetShape().GetDimensionality()),
1821 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001822 return flatBufferTensorInfo;
1823}
1824
1825flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001826 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001827{
1828 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1829
Mike Kellya0766c32019-02-19 17:22:07 +00001830 flatbuffers::Offset<void> fbPayload;
1831
1832 switch (tensorInfo.GetDataType())
1833 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001834 case armnn::DataType::Signed64:
1835 {
1836 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1837 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1838 m_flatBufferBuilder,
1839 fbVector);
1840 fbPayload = flatBuffersData.o;
1841 break;
1842 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001843 case armnn::DataType::Float32:
1844 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001845 {
1846 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1847 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1848 m_flatBufferBuilder,
1849 fbVector);
1850 fbPayload = flatBuffersData.o;
1851 break;
1852 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001853 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001854 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001855 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001856 {
1857 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1858 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1859 m_flatBufferBuilder,
1860 fbVector);
1861 fbPayload = flatBuffersData.o;
1862 break;
1863 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001864 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001865 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001866 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001867 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001868 default:
1869 {
1870 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1871 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1872 m_flatBufferBuilder,
1873 fbVector);
1874 fbPayload = flatBuffersData.o;
1875 }
1876 }
1877 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1878 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001879 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001880 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1881 fbPayload);
1882 return flatBufferConstTensor;
1883}
1884
Finn Williamsb454c5c2021-02-09 15:56:23 +00001885flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001886{
1887 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1888 serializer::CreateFeatureCompatibilityVersions(
1889 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001890 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001891 1, // Weights layout scheme version
1892 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001893 );
1894 return versionsTable;
1895}
1896
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001897std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001898 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001899{
Mike Kellya0766c32019-02-19 17:22:07 +00001900 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001901
1902 // Get the InputSlots
1903 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1904 {
1905 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1906
1907 // Get the Connection for the InputSlot
1908 const IOutputSlot* connection = inputSlot.GetConnection();
1909
1910 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001911 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1912 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001913 // Create FlatBuffer InputSlot
1914 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1915 }
1916 return inputSlots;
1917}
1918
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001919std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001920 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001921{
1922 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1923
1924 // Get the OutputSlots
1925 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1926 {
1927 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001928 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001929
Mike Kelly8c1701a2019-02-11 17:01:27 +00001930 // Create FlatBuffer Outputslot
1931 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1932 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001933 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001934 }
1935 return outputSlots;
1936}
1937
Finn Williamsb454c5c2021-02-09 15:56:23 +00001938void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1939 const BaseDescriptor& descriptor,
1940 const std::vector<armnn::ConstTensor>& constants,
1941 const char* name,
1942 const armnn::LayerBindingId id)
1943{
1944 IgnoreUnused(constants);
1945
1946 switch (layer->GetType())
1947 {
1948 case armnn::LayerType::Activation :
1949 {
1950 const armnn::ActivationDescriptor& layerDescriptor =
1951 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1952 SerializeActivationLayer(layer, layerDescriptor, name);
1953 break;
1954 }
1955 case armnn::LayerType::Addition :
1956 {
1957 SerializeAdditionLayer(layer, name);
1958 break;
1959 }
1960 case armnn::LayerType::ArgMinMax :
1961 {
1962 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1963 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1964 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1965 break;
1966 }
1967 case armnn::LayerType::BatchNormalization :
1968 {
1969 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1970 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1971 SerializeBatchNormalizationLayer(layer,
1972 layerDescriptor,
1973 constants,
1974 name);
1975 break;
1976 }
1977 case armnn::LayerType::BatchToSpaceNd :
1978 {
1979 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1980 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1981 SerializeBatchToSpaceNdLayer(layer,
1982 layerDescriptor,
1983 name);
1984 break;
1985 }
mathad01b392e982021-04-07 12:07:30 +01001986 case armnn::LayerType::Cast :
1987 {
1988 SerializeCastLayer(layer, name);
1989 break;
1990 }
Simon Obute51f67772021-09-03 15:50:13 +01001991 case armnn::LayerType::ChannelShuffle :
1992 {
1993 const armnn::ChannelShuffleDescriptor& layerDescriptor =
1994 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
1995 SerializeChannelShuffleLayer(layer,
1996 layerDescriptor,
1997 name);
1998 break;
1999 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002000 case armnn::LayerType::Comparison :
2001 {
2002 const armnn::ComparisonDescriptor& layerDescriptor =
2003 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2004 SerializeComparisonLayer(layer,
2005 layerDescriptor,
2006 name);
2007 break;
2008 }
2009 case armnn::LayerType::Concat :
2010 {
2011 const armnn::ConcatDescriptor& layerDescriptor =
2012 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2013 SerializeConcatLayer(layer,
2014 layerDescriptor,
2015 name);
2016 break;
2017 }
2018 case armnn::LayerType::Constant :
2019 {
2020 SerializeConstantLayer(layer,
2021 constants,
2022 name);
2023 break;
2024 }
2025 case armnn::LayerType::Convolution2d :
2026 {
2027 const armnn::Convolution2dDescriptor& layerDescriptor =
2028 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2029 SerializeConvolution2dLayer(layer,
2030 layerDescriptor,
2031 constants,
2032 name);
2033 break;
2034 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002035 case armnn::LayerType::Convolution3d :
2036 {
2037 const armnn::Convolution3dDescriptor& layerDescriptor =
2038 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2039 SerializeConvolution3dLayer(layer,
2040 layerDescriptor,
2041 constants,
2042 name);
2043 break;
2044 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002045 case armnn::LayerType::DepthToSpace :
2046 {
2047 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2048 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2049 SerializeDepthToSpaceLayer(layer,
2050 layerDescriptor,
2051 name);
2052 break;
2053 }
2054 case armnn::LayerType::DepthwiseConvolution2d :
2055 {
2056 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2057 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2058 SerializeDepthwiseConvolution2dLayer(layer,
2059 layerDescriptor,
2060 constants,
2061 name);
2062 break;
2063 }
2064 case armnn::LayerType::Dequantize :
2065 {
2066 SerializeDequantizeLayer(layer,
2067 name);
2068 break;
2069 }
2070 case armnn::LayerType::DetectionPostProcess :
2071 {
2072 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2073 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2074 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2075 break;
2076 }
2077 case armnn::LayerType::Division :
2078 {
2079 SerializeDivisionLayer(layer, name);
2080 break;
2081 }
2082 case armnn::LayerType::ElementwiseUnary :
2083 {
2084 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2085 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2086 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2087 break;
2088 }
2089 case armnn::LayerType::Fill :
2090 {
2091 const armnn::FillDescriptor& layerDescriptor =
2092 static_cast<const armnn::FillDescriptor&>(descriptor);
2093 SerializeFillLayer(layer, layerDescriptor, name);
2094 break;
2095 }
2096 case armnn::LayerType::Floor :
2097 {
2098 SerializeFloorLayer(layer, name);
2099 break;
2100 }
2101 case armnn::LayerType::FullyConnected :
2102 {
2103 const armnn::FullyConnectedDescriptor& layerDescriptor =
2104 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002105 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002106 break;
2107 }
2108 case armnn::LayerType::Gather :
2109 {
2110 const armnn::GatherDescriptor& layerDescriptor =
2111 static_cast<const armnn::GatherDescriptor&>(descriptor);
2112 SerializeGatherLayer(layer, layerDescriptor, name);
2113 break;
2114 }
2115 case armnn::LayerType::Input:
2116 {
2117 SerializeInputLayer(layer, id, name);
2118 break;
2119 }
2120 case armnn::LayerType::InstanceNormalization :
2121 {
2122 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2123 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2124 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2125 break;
2126 }
2127 case armnn::LayerType::L2Normalization :
2128 {
2129 const armnn::L2NormalizationDescriptor& layerDescriptor =
2130 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2131 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2132 break;
2133 }
2134 case armnn::LayerType::LogicalBinary :
2135 {
2136 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2137 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2138 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2139 break;
2140 }
2141 case armnn::LayerType::LogSoftmax :
2142 {
2143 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2144 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2145 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2146 break;
2147 }
2148 case armnn::LayerType::Lstm :
2149 {
2150 const armnn::LstmDescriptor& layerDescriptor =
2151 static_cast<const armnn::LstmDescriptor&>(descriptor);
2152 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2153 break;
2154 }
2155 case armnn::LayerType::QLstm :
2156 {
2157 const armnn::QLstmDescriptor& layerDescriptor =
2158 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2159 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2160 break;
2161 }
2162 case armnn::LayerType::Maximum :
2163 {
2164 SerializeMaximumLayer(layer, name);
2165 break;
2166 }
2167 case armnn::LayerType::Mean :
2168 {
2169 const armnn::MeanDescriptor& layerDescriptor =
2170 static_cast<const armnn::MeanDescriptor&>(descriptor);
2171 SerializeMeanLayer(layer, layerDescriptor, name);
2172 break;
2173 }
2174 case armnn::LayerType::Merge :
2175 {
2176 SerializeMergeLayer(layer, name);
2177 break;
2178 }
2179 case armnn::LayerType::Minimum :
2180 {
2181 SerializeMinimumLayer(layer, name);
2182 break;
2183 }
2184 case armnn::LayerType::Multiplication :
2185 {
2186 SerializeMultiplicationLayer(layer, name);
2187 break;
2188 }
2189 case armnn::LayerType::Normalization :
2190 {
2191 const armnn::NormalizationDescriptor& layerDescriptor =
2192 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2193 SerializeNormalizationLayer(layer, layerDescriptor, name);
2194 break;
2195 }
2196 case armnn::LayerType::Output:
2197 {
2198 SerializeOutputLayer(layer, id, name);
2199 break;
2200 }
2201 case armnn::LayerType::Pad :
2202 {
2203 const armnn::PadDescriptor& layerDescriptor =
2204 static_cast<const armnn::PadDescriptor&>(descriptor);
2205 SerializePadLayer(layer, layerDescriptor, name);
2206 break;
2207 }
2208 case armnn::LayerType::Permute :
2209 {
2210 const armnn::PermuteDescriptor& layerDescriptor =
2211 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2212 SerializePermuteLayer(layer, layerDescriptor, name);
2213 break;
2214 }
2215 case armnn::LayerType::Pooling2d :
2216 {
2217 const armnn::Pooling2dDescriptor& layerDescriptor =
2218 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2219 SerializePooling2dLayer(layer, layerDescriptor, name);
2220 break;
2221 }
2222 case armnn::LayerType::Prelu :
2223 {
2224 SerializePreluLayer(layer, name);
2225 break;
2226 }
2227 case armnn::LayerType::Quantize :
2228 {
2229 SerializeQuantizeLayer(layer, name);
2230 break;
2231 }
2232 case armnn::LayerType::QuantizedLstm:
2233 SerializeQuantizedLstmLayer(layer, constants, name);
2234 break;
2235 case armnn::LayerType::Reshape:
2236 {
2237 const armnn::ReshapeDescriptor &layerDescriptor =
2238 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2239 SerializeReshapeLayer(layer, layerDescriptor, name);
2240 break;
2241 }
2242 case armnn::LayerType::Rank:
2243 {
2244 SerializeRankLayer(layer, name);
2245 break;
2246 }
2247 case armnn::LayerType::Reduce:
2248 {
2249 const armnn::ReduceDescriptor& layerDescriptor =
2250 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2251 SerializeReduceLayer(layer, layerDescriptor, name);
2252 break;
2253 }
2254 case armnn::LayerType::Resize:
2255 {
2256 const armnn::ResizeDescriptor& layerDescriptor =
2257 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2258 SerializeResizeLayer(layer, layerDescriptor, name);
2259 break;
2260 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002261 case armnn::LayerType::Shape:
2262 {
2263 SerializeShapeLayer(layer, name);
2264 break;
2265 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002266 case armnn::LayerType::Slice:
2267 {
2268 const armnn::SliceDescriptor& layerDescriptor =
2269 static_cast<const armnn::SliceDescriptor&>(descriptor);
2270 SerializeSliceLayer(layer, layerDescriptor, name);
2271 break;
2272 }
2273 case armnn::LayerType::Softmax:
2274 {
2275 const armnn::SoftmaxDescriptor& layerDescriptor =
2276 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2277 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2278 break;
2279 }
2280 case armnn::LayerType::SpaceToBatchNd:
2281 {
2282 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2283 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2284 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2285 break;
2286 }
2287 case armnn::LayerType::SpaceToDepth:
2288 {
2289 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2290 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2291 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2292 break;
2293 }
2294 case armnn::LayerType::Splitter:
2295 {
2296 const armnn::SplitterDescriptor& layerDescriptor =
2297 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2298 SerializeSplitterLayer(layer, layerDescriptor, name);
2299 break;
2300 }
2301 case armnn::LayerType::Stack:
2302 {
2303 const armnn::StackDescriptor& layerDescriptor =
2304 static_cast<const armnn::StackDescriptor&>(descriptor);
2305 SerializeStackLayer(layer, layerDescriptor, name);
2306 break;
2307 }
2308 case armnn::LayerType::StandIn:
2309 {
2310 const armnn::StandInDescriptor& layerDescriptor =
2311 static_cast<const armnn::StandInDescriptor&>(descriptor);
2312 SerializeStandInLayer(layer, layerDescriptor, name);
2313 break;
2314 }
2315 case armnn::LayerType::StridedSlice:
2316 {
2317 const armnn::StridedSliceDescriptor& layerDescriptor =
2318 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2319 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2320 break;
2321 }
2322 case armnn::LayerType::Subtraction:
2323 {
2324 SerializeSubtractionLayer(layer, name);
2325 break;
2326 }
2327 case armnn::LayerType::Switch:
2328 {
2329 SerializeSwitchLayer(layer, name);
2330 break;
2331 }
2332 case armnn::LayerType::Transpose:
2333 {
2334 const armnn::TransposeDescriptor& layerDescriptor =
2335 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2336 SerializeTransposeLayer(layer, layerDescriptor, name);
2337 break;
2338 }
2339 case armnn::LayerType::TransposeConvolution2d:
2340 {
2341 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2342 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2343 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2344 break;
2345 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002346 case armnn::LayerType::UnidirectionalSequenceLstm :
2347 {
2348 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2349 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2350 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2351 break;
2352 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002353 default:
2354 {
2355 throw InvalidArgumentException(
2356 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2357 layer->GetName(),
2358 id));
2359 }
2360 }
2361}
2362
Finn Williams85d36712021-01-26 22:30:06 +00002363void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002364{
2365 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002366 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2367 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002368
2369 // Create FlatBuffer SerializedGraph
2370 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002371 fbBuilder,
2372 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2373 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2374 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2375 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002376
2377 // Serialize the graph
2378 fbBuilder.Finish(serializedGraph);
2379}
2380
Finn Williamsb454c5c2021-02-09 15:56:23 +00002381
Finn Williams85d36712021-01-26 22:30:06 +00002382bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002383{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002384 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002385
Matthew Sloyan0663d662020-09-14 11:47:26 +01002386 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002387 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002388 return !stream.bad();
2389}
2390
Finn Williams2605b232020-06-10 15:53:46 +01002391} // namespace armnnSerializer