blob: 0586700adad27a5513065ca3ce6ba71d77ca0815 [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
Matthew Benthamff130e22020-01-17 11:47:42 +000017
Mike Kelly8c1701a2019-02-11 17:01:27 +000018using namespace armnn;
19namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000020namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000021
22namespace armnnSerializer
23{
24
Finn Williams85d36712021-01-26 22:30:06 +000025ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
26{
27}
28
29ISerializer::~ISerializer() = default;
30
31ISerializer* ISerializer::CreateRaw()
32{
33 return new ISerializer();
34}
35
36ISerializerPtr ISerializer::Create()
37{
38 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
39}
40
41void ISerializer::Destroy(ISerializer* serializer)
42{
43 delete serializer;
44}
45
46void ISerializer::Serialize(const armnn::INetwork& inNetwork)
47{
48 pSerializerImpl->Serialize(inNetwork);
49}
50
51bool ISerializer::SaveSerializedToStream(std::ostream& stream)
52{
53 return pSerializerImpl->SaveSerializedToStream(stream);
54}
55
Mike Kellyaf484012019-02-20 16:53:11 +000056serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
57{
58 switch (function)
59 {
60 case armnn::ActivationFunction::Sigmoid:
61 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
62 case armnn::ActivationFunction::TanH:
63 return serializer::ActivationFunction::ActivationFunction_TanH;
64 case armnn::ActivationFunction::Linear:
65 return serializer::ActivationFunction::ActivationFunction_Linear;
66 case armnn::ActivationFunction::ReLu:
67 return serializer::ActivationFunction::ActivationFunction_ReLu;
68 case armnn::ActivationFunction::BoundedReLu:
69 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
70 case armnn::ActivationFunction::LeakyReLu:
71 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
72 case armnn::ActivationFunction::Abs:
73 return serializer::ActivationFunction::ActivationFunction_Abs;
74 case armnn::ActivationFunction::Sqrt:
75 return serializer::ActivationFunction::ActivationFunction_Sqrt;
76 case armnn::ActivationFunction::Square:
77 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000078 case armnn::ActivationFunction::Elu:
79 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000080 case armnn::ActivationFunction::HardSwish:
81 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000082 default:
83 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
84 }
85}
86
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010087serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
88{
89 switch (function)
90 {
91 case armnn::ArgMinMaxFunction::Max:
92 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
93 case armnn::ArgMinMaxFunction::Min:
94 default:
95 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
96 }
97}
98
Finn Williamsb454c5c2021-02-09 15:56:23 +000099uint32_t SerializerStrategy::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000101 if (m_guidMap.empty())
102 {
janeil013fec1ea2019-11-07 09:47:20 +0000103 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000104 }
105 else if (m_guidMap.find(guid) == m_guidMap.end())
106 {
janeil013fec1ea2019-11-07 09:47:20 +0000107 ++m_layerId;
108 m_guidMap.insert(std::make_pair(guid, m_layerId));
109
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000110 return m_layerId;
111 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000112 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000113}
114
Mike Kelly8c1701a2019-02-11 17:01:27 +0000115// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000116void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000117{
Jan Eilers8eb25602020-03-09 12:13:48 +0000118 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000119
Mike Kelly8c1701a2019-02-11 17:01:27 +0000120 // Create FlatBuffer BaseLayer
121 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
122
123 // Create FlatBuffer BindableBaseLayer
124 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
125 flatBufferInputBaseLayer,
126 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000127 // Push layer binding id to outputIds.
128 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000129
130 // Create the FlatBuffer InputLayer
131 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
132
133 // Add the AnyLayer to the FlatBufferLayers
134 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
135}
136
137// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000138void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
139 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000140{
Jan Eilers8eb25602020-03-09 12:13:48 +0000141 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000142
Mike Kelly8c1701a2019-02-11 17:01:27 +0000143 // Create FlatBuffer BaseLayer
144 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
145
146 // Create FlatBuffer BindableBaseLayer
147 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
148 flatBufferOutputBaseLayer,
149 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000150 // Push layer binding id to outputIds.
151 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000152
153 // Create the FlatBuffer OutputLayer
154 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
155 // Add the AnyLayer to the FlatBufferLayers
156 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
157}
158
Finn Williamsb454c5c2021-02-09 15:56:23 +0000159void SerializerStrategy::SerializeAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
Kevin May868eb142019-09-04 17:29:31 +0100160{
Jan Eilers8eb25602020-03-09 12:13:48 +0000161 IgnoreUnused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100162 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
163 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
164
165 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100166}
167
Mike Kellyaf484012019-02-20 16:53:11 +0000168// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000169void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
170 const armnn::ActivationDescriptor& descriptor,
171 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000172{
Jan Eilers8eb25602020-03-09 12:13:48 +0000173 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000174
Mike Kellyaf484012019-02-20 16:53:11 +0000175 // Create FlatBuffer BaseLayer
176 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
177
178 // Create the FlatBuffer ActivationDescriptor
179 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
180 GetFlatBufferActivationFunction(descriptor.m_Function),
181 descriptor.m_A,
182 descriptor.m_B);
183
184 // Create the FlatBuffer ActivationLayer
185 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
186 flatBufferBaseLayer,
187 flatBufferDescriptor);
188
189 // Add the AnyLayer to the FlatBufferLayers
190 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
191}
192
Mike Kelly8c1701a2019-02-11 17:01:27 +0000193// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000194void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000195{
Jan Eilers8eb25602020-03-09 12:13:48 +0000196 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000197
Mike Kelly8c1701a2019-02-11 17:01:27 +0000198 // Create FlatBuffer BaseLayer
199 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
200
201 // Create the FlatBuffer AdditionLayer
202 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
203
204 // Add the AnyLayer to the FlatBufferLayers
205 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
206}
207
Nikhil Rajee391d52019-09-05 17:50:44 +0100208// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000209void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
210 const armnn::ArgMinMaxDescriptor& descriptor,
211 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100212{
Jan Eilers8eb25602020-03-09 12:13:48 +0000213 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000214
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100215 // Create FlatBuffer BaseLayer
216 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
217
218 // Create FlatBuffer Descriptor
219 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
220 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
221 descriptor.m_Axis);
222
223 // Create FlatBuffer ArgMinMaxLayer
224 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
225 flatBufferBaseLayer,
226 flatBufferDescriptor);
227
228 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100229}
230
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000231// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000232void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
233 const armnn::BatchToSpaceNdDescriptor& descriptor,
234 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000235{
Jan Eilers8eb25602020-03-09 12:13:48 +0000236 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000237
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000238 // Create FlatBuffer BaseLayer
239 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
240
241 std::vector<unsigned int> crops;
242 crops.reserve(descriptor.m_Crops.size() * 2);
243 for (auto& crop : descriptor.m_Crops)
244 {
245 crops.push_back(crop.first);
246 crops.push_back(crop.second);
247 }
248
249 auto flatBufferDescriptor =
250 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
251 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
252 m_flatBufferBuilder.CreateVector(crops),
253 GetFlatBufferDataLayout(descriptor.m_DataLayout));
254
255 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
256 flatBufferBaseLayer,
257 flatBufferDescriptor);
258
259 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
260}
261
Finn Williamsb454c5c2021-02-09 15:56:23 +0000262void SerializerStrategy::SerializeBatchNormalizationLayer(
263 const armnn::IConnectableLayer* layer,
264 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
265 const std::vector<armnn::ConstTensor>& constants,
266 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000267{
Jan Eilers8eb25602020-03-09 12:13:48 +0000268 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000269
Finn Williamsb454c5c2021-02-09 15:56:23 +0000270 const armnn::ConstTensor& mean = constants[0];
271 const armnn::ConstTensor& variance = constants[1];
272 const armnn::ConstTensor& beta = constants[2];
273 const armnn::ConstTensor& gamma = constants[3];
274
ruoyan018e7fa232019-02-28 15:09:07 +0000275 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
276 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
277 m_flatBufferBuilder,
278 batchNormDescriptor.m_Eps,
279 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
280
281 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
282 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
283 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
284 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
285 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
286 fbBatchNormalizationBaseLayer,
287 fbBatchNormalizationDescriptor,
288 fbMeanConstTensorInfo,
289 fbVarianceConstTensorInfo,
290 fbBetaConstTensorInfo,
291 fbGammaConstTensorInfo);
292
293 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
294}
295
Finn Williamsb454c5c2021-02-09 15:56:23 +0000296void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100297 const armnn::ComparisonDescriptor& descriptor,
298 const char* name)
299{
Jan Eilers8eb25602020-03-09 12:13:48 +0000300 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000301
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100302 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
303 auto fbDescriptor = serializer::CreateComparisonDescriptor(
304 m_flatBufferBuilder,
305 GetFlatBufferComparisonOperation(descriptor.m_Operation));
306
307 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
308 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100309}
310
Conor Kennedy76277882019-02-26 08:29:54 +0000311// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000312void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
313 const std::vector<armnn::ConstTensor>& constants,
314 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000315{
Jan Eilers8eb25602020-03-09 12:13:48 +0000316 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000317
Finn Williamsb454c5c2021-02-09 15:56:23 +0000318 armnn::ConstTensor input = constants[0];
319
Conor Kennedy76277882019-02-26 08:29:54 +0000320 // Create FlatBuffer BaseLayer
321 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
322
323 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
324
325 // Create the FlatBuffer ConstantLayer
326 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
327 flatBufferConstantBaseLayer,
328 flatBufferConstTensorInfo);
329
330 // Add the AnyLayer to the FlatBufferLayers
331 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
332}
333
Mike Kellya0766c32019-02-19 17:22:07 +0000334// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000335void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
336 const armnn::Convolution2dDescriptor& descriptor,
337 const std::vector<armnn::ConstTensor>& constants,
338 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000339{
Jan Eilers8eb25602020-03-09 12:13:48 +0000340 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000341
Finn Williamsb454c5c2021-02-09 15:56:23 +0000342 const armnn::ConstTensor weights = constants[0];
343
Mike Kellya0766c32019-02-19 17:22:07 +0000344 // Create FlatBuffer BaseLayer
345 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
346
347 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
348 descriptor.m_PadLeft,
349 descriptor.m_PadRight,
350 descriptor.m_PadTop,
351 descriptor.m_PadBottom,
352 descriptor.m_StrideX,
353 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100354 descriptor.m_DilationX,
355 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000356 descriptor.m_BiasEnabled,
357 GetFlatBufferDataLayout(descriptor.m_DataLayout));
358 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
359 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
360
Finn Williamsb454c5c2021-02-09 15:56:23 +0000361 if (constants.size() > 1)
Mike Kellya0766c32019-02-19 17:22:07 +0000362 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000363 const armnn::ConstTensor biases = constants[1];
364 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Mike Kellya0766c32019-02-19 17:22:07 +0000365 }
366
367 // Create the FlatBuffer Convolution2dLayer
368 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
369 flatBufferBaseLayer,
370 flatBufferDescriptor,
371 flatBufferWeightsConstTensorInfo,
372 flatBufferBiasesConstTensorInfo);
373
374 // Add the AnyLayer to the FlatBufferLayers
375 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
376}
377
Finn Williamsb454c5c2021-02-09 15:56:23 +0000378void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100379 const armnn::DepthToSpaceDescriptor& descriptor,
380 const char* name)
381{
Jan Eilers8eb25602020-03-09 12:13:48 +0000382 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000383
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100384 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
385 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
386 descriptor.m_BlockSize,
387 GetFlatBufferDataLayout(descriptor.m_DataLayout));
388
389 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
390
391 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100392}
393
Finn Williamsb454c5c2021-02-09 15:56:23 +0000394void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
395 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
396 const std::vector<armnn::ConstTensor>& constants,
397 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000398{
Jan Eilers8eb25602020-03-09 12:13:48 +0000399 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000400
Finn Williamsb454c5c2021-02-09 15:56:23 +0000401 const armnn::ConstTensor& weights = constants[0];
402
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000403 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
404 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
405 descriptor.m_PadLeft,
406 descriptor.m_PadRight,
407 descriptor.m_PadTop,
408 descriptor.m_PadBottom,
409 descriptor.m_StrideX,
410 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100411 descriptor.m_DilationX,
412 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000413 descriptor.m_BiasEnabled,
414 GetFlatBufferDataLayout(descriptor.m_DataLayout));
415
416 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
417 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000418
419 if (constants.size() > 1)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000420 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000421 const armnn::ConstTensor& biases = constants[1];
422 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000423 }
424
425 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
426 fbBaseLayer,
427 fbDescriptor,
428 fbWeightsConstTensorInfo,
429 fbBiasesConstTensorInfo);
430
431 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
432}
433
Finn Williamsb454c5c2021-02-09 15:56:23 +0000434void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000435 const char* name)
436{
Jan Eilers8eb25602020-03-09 12:13:48 +0000437 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000438
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000439 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
440 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
441
442 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
443}
444
Finn Williamsb454c5c2021-02-09 15:56:23 +0000445void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
446 const armnn::DetectionPostProcessDescriptor& descriptor,
447 const std::vector<armnn::ConstTensor>& constants,
448 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000449{
Jan Eilers8eb25602020-03-09 12:13:48 +0000450 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000451
Finn Williamsb454c5c2021-02-09 15:56:23 +0000452 const armnn::ConstTensor& anchors = constants[0];
453
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000454 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
455 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
456 descriptor.m_MaxDetections,
457 descriptor.m_MaxClassesPerDetection,
458 descriptor.m_DetectionsPerClass,
459 descriptor.m_NmsScoreThreshold,
460 descriptor.m_NmsIouThreshold,
461 descriptor.m_NumClasses,
462 descriptor.m_UseRegularNms,
463 descriptor.m_ScaleX,
464 descriptor.m_ScaleY,
465 descriptor.m_ScaleW,
466 descriptor.m_ScaleH);
467
468 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
469
470 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
471 fbBaseLayer,
472 fbDescriptor,
473 fbAnchorsConstTensorInfo);
474
475 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
476}
477
Finn Williamsb454c5c2021-02-09 15:56:23 +0000478void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000479{
Jan Eilers8eb25602020-03-09 12:13:48 +0000480 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000481
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000482 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
483 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000484
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000485 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
486}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000487
Finn Williamsb454c5c2021-02-09 15:56:23 +0000488void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600489 const armnn::ElementwiseUnaryDescriptor& descriptor,
490 const char* name)
491{
Jan Eilers8eb25602020-03-09 12:13:48 +0000492 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600493
494 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
495 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
496 m_flatBufferBuilder,
497 GetFlatBufferUnaryOperation(descriptor.m_Operation));
498
499 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
500 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
501}
502
Finn Williamsb454c5c2021-02-09 15:56:23 +0000503void SerializerStrategy::SerializeEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000504{
Jan Eilers8eb25602020-03-09 12:13:48 +0000505 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000506
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000507 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
508 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
509
510 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
511}
512
Finn Williamsb454c5c2021-02-09 15:56:23 +0000513void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100514 const armnn::FillDescriptor& fillDescriptor,
515 const char* name)
516{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100517 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100518
519 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
520
521 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
522
523 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
524
525 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100526}
527
Finn Williamsb454c5c2021-02-09 15:56:23 +0000528void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000529{
Jan Eilers8eb25602020-03-09 12:13:48 +0000530 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000531
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000532 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
533 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
534
535 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
536}
537
Finn Williamsb454c5c2021-02-09 15:56:23 +0000538void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100539 const armnn::GatherDescriptor& gatherDescriptor,
540 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000541{
Jan Eilers8eb25602020-03-09 12:13:48 +0000542 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000543
Teresa Charlin52664732020-06-29 16:27:03 +0100544 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
545 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000546 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100547 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000548
549 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
550}
551
Finn Williamsb454c5c2021-02-09 15:56:23 +0000552
553void SerializerStrategy::SerializeGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000554{
Jan Eilers8eb25602020-03-09 12:13:48 +0000555 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000556
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000557 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000558 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000559
560 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
561}
562
Finn Williamsb454c5c2021-02-09 15:56:23 +0000563void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100564 const armnn::IConnectableLayer* layer,
565 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
566 const char* name)
567{
Jan Eilers8eb25602020-03-09 12:13:48 +0000568 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000569
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100570 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
571 m_flatBufferBuilder,
572 instanceNormalizationDescriptor.m_Gamma,
573 instanceNormalizationDescriptor.m_Beta,
574 instanceNormalizationDescriptor.m_Eps,
575 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
576
577 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
578 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
579
580 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100581}
582
Finn Williamsb454c5c2021-02-09 15:56:23 +0000583void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000584 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
585 const char* name)
586{
Jan Eilers8eb25602020-03-09 12:13:48 +0000587 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000588
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000589 // Create FlatBuffer BaseLayer
590 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
591
592 // Create the FlatBuffer L2Normalization Descriptor
593 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100594 m_flatBufferBuilder,
595 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
596 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000597
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100598 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000599 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
600
601 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
602}
603
Finn Williamsb454c5c2021-02-09 15:56:23 +0000604void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000605 const armnn::LogicalBinaryDescriptor& descriptor,
606 const char* name)
607{
608 IgnoreUnused(name);
609
610 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
611 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
612 m_flatBufferBuilder,
613 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
614
615 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
616 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
617}
618
Finn Williamsb454c5c2021-02-09 15:56:23 +0000619void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100620 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
621 const char* name)
622{
Jan Eilers8eb25602020-03-09 12:13:48 +0000623 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000624
Sadik Armagan26257852019-10-14 13:00:47 +0100625 // Create FlatBuffer BaseLayer
626 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
627
628 // Create the FlatBuffer LogSoftmaxDescriptor
629 auto flatBufferLogSoftmaxDesc =
630 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
631 logSoftmaxDescriptor.m_Beta,
632 logSoftmaxDescriptor.m_Axis);
633
634 // Create the FlatBuffer LogSoftmaxLayer
635 auto flatBufferLogSoftmaxLayer =
636 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
637 flatBufferLogSoftmaxBaseLayer,
638 flatBufferLogSoftmaxDesc);
639
640 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100641}
642
Finn Williamsb454c5c2021-02-09 15:56:23 +0000643void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
644 const armnn::LstmDescriptor& descriptor,
645 const std::vector<armnn::ConstTensor>& constants,
646 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000647{
Jan Eilers8eb25602020-03-09 12:13:48 +0000648 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000649
Jim Flynn11af3752019-03-19 17:22:29 +0000650 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
651
652 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
653 m_flatBufferBuilder,
654 descriptor.m_ActivationFunc,
655 descriptor.m_ClippingThresCell,
656 descriptor.m_ClippingThresProj,
657 descriptor.m_CifgEnabled,
658 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100659 descriptor.m_ProjectionEnabled,
660 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000661
Finn Williamsb454c5c2021-02-09 15:56:23 +0000662 // Index for constants vector
663 std::size_t i = 0;
664
665 // Get mandatory/basic input parameters
666 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
667 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
668 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
669 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
670 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
671 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
672 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
673 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
674 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
675
676
Jim Flynn11af3752019-03-19 17:22:29 +0000677
678 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
679 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
680 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
681 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
682 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
683 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
684 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
685 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
686 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100687 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
688 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
689 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
690 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000691
692 if (!descriptor.m_CifgEnabled)
693 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000694 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
695 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
696 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000697 }
698
699 if (descriptor.m_PeepholeEnabled)
700 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000701 if (!descriptor.m_CifgEnabled)
702 {
703 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
704 }
705 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
706 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
707 }
708
709 if (descriptor.m_ProjectionEnabled)
710 {
711 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
712 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000713 }
714
Jan Eilersf8c62972019-07-17 11:07:49 +0100715 if (descriptor.m_LayerNormEnabled)
716 {
717 if (!descriptor.m_CifgEnabled)
718 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000719 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100720 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000721 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
722 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
723 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100724 }
725
Jim Flynn11af3752019-03-19 17:22:29 +0000726 auto fbLstmParams = serializer::CreateLstmInputParams(
727 m_flatBufferBuilder,
728 inputToForgetWeights,
729 inputToCellWeights,
730 inputToOutputWeights,
731 recurrentToForgetWeights,
732 recurrentToCellWeights,
733 recurrentToOutputWeights,
734 forgetGateBias,
735 cellBias,
736 outputGateBias,
737 inputToInputWeights,
738 recurrentToInputWeights,
739 cellToInputWeights,
740 inputGateBias,
741 projectionWeights,
742 projectionBias,
743 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100744 cellToOutputWeights,
745 inputLayerNormWeights,
746 forgetLayerNormWeights,
747 cellLayerNormWeights,
748 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000749
750 auto fbLstmLayer = serializer::CreateLstmLayer(
751 m_flatBufferBuilder,
752 fbLstmBaseLayer,
753 fbLstmDescriptor,
754 fbLstmParams);
755
756 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
757}
758
Finn Williamsb454c5c2021-02-09 15:56:23 +0000759void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000760{
Jan Eilers8eb25602020-03-09 12:13:48 +0000761 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000762
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000763 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
764 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
765
766 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
767}
768
Finn Williamsb454c5c2021-02-09 15:56:23 +0000769void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000770 const armnn::MeanDescriptor& descriptor,
771 const char* name)
772{
Jan Eilers8eb25602020-03-09 12:13:48 +0000773 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000774
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000775 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
776 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
777 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
778 descriptor.m_KeepDims);
779
780 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
781 fbMeanBaseLayer,
782 fbMeanDescriptor);
783
784 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
785}
786
Finn Williamsb454c5c2021-02-09 15:56:23 +0000787void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000788{
Jan Eilers8eb25602020-03-09 12:13:48 +0000789 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000790
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000791 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
792 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
793
794 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
795}
796
Finn Williamsb454c5c2021-02-09 15:56:23 +0000797void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100798{
Jan Eilers8eb25602020-03-09 12:13:48 +0000799 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000800
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100801 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
802 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
803
804 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
805}
806
Finn Williamsb454c5c2021-02-09 15:56:23 +0000807void SerializerStrategy::SerializeMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100808 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000809 const char* name)
810{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000811 SerializeConcatLayer(layer, mergerDescriptor, name);
Jim Flynne242f2d2019-05-22 14:24:13 +0100812}
813
Finn Williamsb454c5c2021-02-09 15:56:23 +0000814void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100815 const armnn::ConcatDescriptor& concatDescriptor,
816 const char* name)
817{
Jan Eilers8eb25602020-03-09 12:13:48 +0000818 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000819
Jim Flynne242f2d2019-05-22 14:24:13 +0100820 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000821
822 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100823 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000824 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100825 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000826 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100827 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000828 {
829 origins.push_back(origin[d]);
830 }
831 auto view = m_flatBufferBuilder.CreateVector(origins);
832 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
833 views.push_back(uintVector);
834 }
835
Jim Flynne242f2d2019-05-22 14:24:13 +0100836 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
837 concatDescriptor.GetConcatAxis(),
838 concatDescriptor.GetNumViews(),
839 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000840 m_flatBufferBuilder.CreateVector(views));
841
Jim Flynne242f2d2019-05-22 14:24:13 +0100842 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
843 flatBufferConcatBaseLayer,
844 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000845
Jim Flynne242f2d2019-05-22 14:24:13 +0100846 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000847}
848
Finn Williamsb454c5c2021-02-09 15:56:23 +0000849void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000850{
Jan Eilers8eb25602020-03-09 12:13:48 +0000851 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000852
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000853 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
854 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
855 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000856
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000857 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000858}
859
Finn Williamsb454c5c2021-02-09 15:56:23 +0000860void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000861 const armnn::PadDescriptor& padDescriptor,
862 const char* name)
863{
Jan Eilers8eb25602020-03-09 12:13:48 +0000864 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000865
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000866 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
867
868 std::vector<unsigned int> padList;
869 for (auto& p: padDescriptor.m_PadList)
870 {
871 padList.push_back(p.first);
872 padList.push_back(p.second);
873 }
874
875 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100876 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100877 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000878
879 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
880 flatBufferBaseLayer,
881 flatBufferPadDesc);
882
883 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
884}
885
Finn Williamsb454c5c2021-02-09 15:56:23 +0000886void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000887 const armnn::PermuteDescriptor& permuteDescriptor,
888 const char* name)
889{
Jan Eilers8eb25602020-03-09 12:13:48 +0000890 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000891
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000892 // Create FlatBuffer BaseLayer
893 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
894
895 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100896 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000897 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100898 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000899 }
900
901 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
902 m_flatBufferBuilder.CreateVector(dimMappings));
903
904 // Create the FlatBuffer PermuteLayer
905 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
906 flatBufferPermuteBaseLayer,
907 flatBufferPermuteDesc);
908
909 // Add the AnyLayer to the FlatBufferLayers
910 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
911}
912
Finn Williams2605b232020-06-10 15:53:46 +0100913// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000914void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100915 const char* name)
916{
917 IgnoreUnused(name);
918 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
919 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
920
921 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
922}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000923
Finn Williamsb454c5c2021-02-09 15:56:23 +0000924void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
925 const armnn::ReduceDescriptor& reduceDescriptor,
926 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000927{
928 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
929 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000930 reduceDescriptor.m_KeepDims,
931 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
932 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
933 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
934 fbReduceBaseLayer,
935 fbDescriptor);
936
937 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
938}
939
Saoirse Stewart263829c2019-02-19 15:54:14 +0000940// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000941void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000942 const armnn::ReshapeDescriptor& reshapeDescriptor,
943 const char* name)
944{
Jan Eilers8eb25602020-03-09 12:13:48 +0000945 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000946
Saoirse Stewart263829c2019-02-19 15:54:14 +0000947 // Create FlatBuffer BaseLayer
948 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
949
950 std::vector<unsigned int> targetShape;
951 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
952 {
953 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
954 }
955
956 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
957 m_flatBufferBuilder.CreateVector(targetShape));
958
959 // Create the FlatBuffer ReshapeLayer
960 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
961 flatBufferReshapeDesc);
962
963 // Add the AnyLayer to the FlatBufferLayers
964 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
965}
966
Finn Williamsb454c5c2021-02-09 15:56:23 +0000967void SerializerStrategy::SerializeResizeBilinearLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000968 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
969 const char* name)
970{
Jan Eilers8eb25602020-03-09 12:13:48 +0000971 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000972
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000973 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
974
975 auto flatBufferDescriptor =
976 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
977 resizeDescriptor.m_TargetWidth,
978 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100979 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
980 resizeDescriptor.m_AlignCorners,
981 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000982
983 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
984 flatBufferBaseLayer,
985 flatBufferDescriptor);
986
987 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
988}
989
Finn Williamsb454c5c2021-02-09 15:56:23 +0000990void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +0100991 const armnn::ResizeDescriptor& resizeDescriptor,
992 const char* name)
993{
Jan Eilers8eb25602020-03-09 12:13:48 +0000994 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000995
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100996 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
997
998 auto flatBufferDescriptor =
999 CreateResizeDescriptor(m_flatBufferBuilder,
1000 resizeDescriptor.m_TargetHeight,
1001 resizeDescriptor.m_TargetWidth,
1002 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001003 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1004 resizeDescriptor.m_AlignCorners,
1005 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001006
1007 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1008 flatBufferBaseLayer,
1009 flatBufferDescriptor);
1010
1011 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001012}
1013
Finn Williamsb454c5c2021-02-09 15:56:23 +00001014void SerializerStrategy::SerializeRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan8b42a382019-03-01 14:24:49 +00001015{
Jan Eilers8eb25602020-03-09 12:13:48 +00001016 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001017
Sadik Armagan8b42a382019-03-01 14:24:49 +00001018 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
1019 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
1020
1021 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
1022}
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,
1120 const std::vector<armnn::ConstTensor>& constants,
1121 const char* name)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001122{
Jan Eilers8eb25602020-03-09 12:13:48 +00001123 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001124
Finn Williamsb454c5c2021-02-09 15:56:23 +00001125 const armnn::ConstTensor& weights = constants.at(0);
1126
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001127 // Create FlatBuffer BaseLayer
1128 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1129
1130 // Create FlatBuffer FullyConnectedDescriptor
1131 auto flatBufferDescriptor =
1132 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1133 fullyConnectedDescriptor.m_BiasEnabled,
1134 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1135
1136 // Create FlatBuffer weights data
1137 auto flatBufferWeights = CreateConstTensorInfo(weights);
1138
1139 // Create FlatBuffer bias data
1140 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1141 if (fullyConnectedDescriptor.m_BiasEnabled)
1142 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001143 armnn::ConstTensor biases = constants.at(1);
1144 flatBufferBiases = CreateConstTensorInfo(biases);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001145 }
1146
1147 // Create FlatBuffer FullyConnectedLayer
1148 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1149 flatBufferBaseLayer,
1150 flatBufferDescriptor,
1151 flatBufferWeights,
1152 flatBufferBiases);
1153
1154 // Add created FullyConnectedLayer to the FlatBufferLayers
1155 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1156}
1157
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001158// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001159void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001160 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1161 const char* name)
1162{
Jan Eilers8eb25602020-03-09 12:13:48 +00001163 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001164
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001165 // Create FlatBuffer BaseLayer
1166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1167
1168 std::vector<unsigned int> padList;
1169 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1170 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1171 {
1172 padList.push_back(pad.first);
1173 padList.push_back(pad.second);
1174 }
1175
1176 auto flatBufferDescriptor =
1177 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1178 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1179 m_flatBufferBuilder.CreateVector(padList),
1180 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1181
1182 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1183 flatBufferBaseLayer,
1184 flatBufferDescriptor);
1185
1186 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1187}
1188
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001189// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001190void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001191 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1192 const char* name)
1193{
Jan Eilers8eb25602020-03-09 12:13:48 +00001194 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001195
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001196 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1197 auto flatBufferDescriptor =
1198 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1199 spaceToDepthDescriptor.m_BlockSize,
1200 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1201
1202 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1203 flatBufferBaseLayer,
1204 flatBufferDescriptor);
1205
1206 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001207}
1208
Jim Flynn18ce3382019-03-08 11:08:30 +00001209// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001210void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001211 const armnn::ViewsDescriptor& viewsDescriptor,
1212 const char* name)
1213{
Jan Eilers8eb25602020-03-09 12:13:48 +00001214 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001215
Jim Flynn18ce3382019-03-08 11:08:30 +00001216 // Create FlatBuffer ViewOrigins
1217 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1218 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1219
1220 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1221 {
1222 std::vector<uint32_t> viewOrigin;
1223 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1224
1225 // Copy vector
1226 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1227 {
1228 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1229 }
1230
1231 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1232 m_flatBufferBuilder.CreateVector(viewOrigin)));
1233 }
1234
1235 // Create FlatBuffer OriginsDescriptor
1236 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1237 viewsDescriptor.GetOrigins().GetConcatAxis(),
1238 viewsDescriptor.GetOrigins().GetNumViews(),
1239 viewsDescriptor.GetOrigins().GetNumDimensions(),
1240 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1241
1242 // Create FlatBuffer ViewOrigins
1243 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1244 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1245
1246 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1247 {
1248 std::vector<uint32_t> viewSize;
1249 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1250
1251 // Copy vector
1252 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1253 {
1254 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1255 }
1256
1257 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1258 m_flatBufferBuilder.CreateVector(viewSize)));
1259 }
1260
1261 // Create FlatBuffer ViewsDescriptor
1262 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1263 flatBufferOriginDescriptor,
1264 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1265
1266 // Create FlatBuffer BaseLayer
1267 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1268
1269 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1270 flatBufferBaseLayer,
1271 flatBufferViewsDescriptor);
1272
1273 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1274}
1275
Finn Williamsb454c5c2021-02-09 15:56:23 +00001276void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001277 const armnn::NormalizationDescriptor& descriptor,
1278 const char* name)
1279{
Jan Eilers8eb25602020-03-09 12:13:48 +00001280 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001281
Nina Drozd57728782019-02-27 10:53:27 +00001282 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1283
1284 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1285 m_flatBufferBuilder,
1286 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1287 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1288 descriptor.m_NormSize,
1289 descriptor.m_Alpha,
1290 descriptor.m_Beta,
1291 descriptor.m_K,
1292 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1293
1294 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1295 fbNormalizationBaseLayer,
1296 fbNormalizationDescriptor);
1297
1298 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1299}
1300
Finn Williamsb454c5c2021-02-09 15:56:23 +00001301void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001302 const armnn::StackDescriptor& stackDescriptor,
1303 const char* name)
1304{
Jan Eilers8eb25602020-03-09 12:13:48 +00001305 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001306
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001307 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1308
1309 std::vector<unsigned int> inputShape;
1310 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1311 {
1312 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1313 }
1314
1315 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1316 stackDescriptor.m_Axis,
1317 stackDescriptor.m_NumInputs,
1318 m_flatBufferBuilder.CreateVector(inputShape));
1319
1320 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1321 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001322}
1323
Finn Williamsb454c5c2021-02-09 15:56:23 +00001324void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001325 const armnn::StandInDescriptor& standInDescriptor,
1326 const char *name)
1327{
Jan Eilers8eb25602020-03-09 12:13:48 +00001328 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001329
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001330 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1331 standInDescriptor.m_NumInputs,
1332 standInDescriptor.m_NumOutputs);
1333
1334 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1335 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1336
1337 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001338}
1339
Finn Williamsb454c5c2021-02-09 15:56:23 +00001340void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001341 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1342 const char* name)
1343{
Jan Eilers8eb25602020-03-09 12:13:48 +00001344 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001345
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001346 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1347
1348 auto flatBufferDescriptor =
1349 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1350 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1351 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1352 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1353 stridedSliceDescriptor.m_BeginMask,
1354 stridedSliceDescriptor.m_EndMask,
1355 stridedSliceDescriptor.m_ShrinkAxisMask,
1356 stridedSliceDescriptor.m_EllipsisMask,
1357 stridedSliceDescriptor.m_NewAxisMask,
1358 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1359
1360 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1361 flatBufferBaseLayer,
1362 flatBufferDescriptor);
1363
1364 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1365}
1366
Finn Williamsb454c5c2021-02-09 15:56:23 +00001367void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001368{
Jan Eilers8eb25602020-03-09 12:13:48 +00001369 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001370
Conor Kennedyda1f9752019-03-01 14:37:12 +00001371 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1372 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1373
1374 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1375}
1376
Finn Williamsb454c5c2021-02-09 15:56:23 +00001377void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001378{
Jan Eilers8eb25602020-03-09 12:13:48 +00001379 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001380
Sadik Armaganeff363d2019-04-05 15:25:46 +01001381 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1382 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1383
1384 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1385}
1386
Finn Williamsb454c5c2021-02-09 15:56:23 +00001387void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001388 const armnn::IConnectableLayer* layer,
1389 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001390 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001391 const char* name)
1392{
Jan Eilers8eb25602020-03-09 12:13:48 +00001393 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001394
Finn Williamsb454c5c2021-02-09 15:56:23 +00001395 const armnn::ConstTensor& weights = constants.at(0);
1396
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001397 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1398 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1399 descriptor.m_PadLeft,
1400 descriptor.m_PadRight,
1401 descriptor.m_PadTop,
1402 descriptor.m_PadBottom,
1403 descriptor.m_StrideX,
1404 descriptor.m_StrideY,
1405 descriptor.m_BiasEnabled,
1406 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1407
1408 // weights & biases
1409 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1410 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001411 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001412 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001413 const armnn::ConstTensor& biases = constants.at(1);
1414 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001415 }
1416
1417 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1418 fbBaseLayer,
1419 fbDescriptor,
1420 fbWeightsConstTensorInfo,
1421 fbBiasesConstTensorInfo);
1422
1423 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001424}
1425
Finn Williamsb454c5c2021-02-09 15:56:23 +00001426void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001427 const armnn::TransposeDescriptor& descriptor,
1428 const char* name)
1429{
Jan Eilers8eb25602020-03-09 12:13:48 +00001430 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001431
1432 // Create FlatBuffer BaseLayer
1433 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1434
1435 std::vector<unsigned int> dimMappings;
1436 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1437 {
1438 dimMappings.push_back(descriptor.m_DimMappings[i]);
1439 }
1440
1441 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1442 m_flatBufferBuilder.CreateVector(dimMappings));
1443
1444 // Create the FlatBuffer TransposeLayer
1445 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1446 flatBufferBaseLayer,
1447 flatBufferDesc);
1448
1449 // Add the AnyLayer to the FlatBufferLayers
1450 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1451}
1452
Finn Williamsb454c5c2021-02-09 15:56:23 +00001453void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1454 const armnn::QLstmDescriptor& descriptor,
1455 const std::vector<armnn::ConstTensor>& constants,
1456 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001457{
James Conroy8d333182020-05-13 10:27:58 +01001458 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001459
James Conroy8d333182020-05-13 10:27:58 +01001460 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1461
1462 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1463 m_flatBufferBuilder,
1464 descriptor.m_CifgEnabled,
1465 descriptor.m_PeepholeEnabled,
1466 descriptor.m_ProjectionEnabled,
1467 descriptor.m_LayerNormEnabled,
1468 descriptor.m_CellClip,
1469 descriptor.m_ProjectionClip,
1470 descriptor.m_InputIntermediateScale,
1471 descriptor.m_ForgetIntermediateScale,
1472 descriptor.m_CellIntermediateScale,
1473 descriptor.m_OutputIntermediateScale,
1474 descriptor.m_HiddenStateZeroPoint,
1475 descriptor.m_HiddenStateScale
1476 );
1477
Finn Williamsb454c5c2021-02-09 15:56:23 +00001478 // Index for constants vector
1479 std::size_t i = 0;
1480
James Conroy8d333182020-05-13 10:27:58 +01001481 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001482 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1483 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1484 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1485 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1486 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1487 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1488 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1489 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1490 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001491
1492 // CIFG
1493 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1494 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1495 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1496
1497 if (!descriptor.m_CifgEnabled)
1498 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001499 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1500 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1501 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001502 }
1503
1504 // Peephole
1505 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1506 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1507 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1508
1509 if (descriptor.m_PeepholeEnabled)
1510 {
1511 if (!descriptor.m_CifgEnabled)
1512 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001513 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001514 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001515 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1516 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1517 }
James Conroy8d333182020-05-13 10:27:58 +01001518
Finn Williamsb454c5c2021-02-09 15:56:23 +00001519 // Projection
1520 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1521 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1522
1523 if (descriptor.m_ProjectionEnabled)
1524 {
1525 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1526 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001527 }
1528
1529 // Layer norm
1530 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1531 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1532 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1533 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1534
1535 if (descriptor.m_LayerNormEnabled)
1536 {
1537 if (!descriptor.m_CifgEnabled)
1538 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001539 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001540 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001541 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1542 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1543 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001544 }
1545
1546 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1547 m_flatBufferBuilder,
1548 inputToForgetWeights,
1549 inputToCellWeights,
1550 inputToOutputWeights,
1551 recurrentToForgetWeights,
1552 recurrentToCellWeights,
1553 recurrentToOutputWeights,
1554 forgetGateBias,
1555 cellBias,
1556 outputGateBias,
1557 inputToInputWeights,
1558 recurrentToInputWeights,
1559 inputGateBias,
1560 projectionWeights,
1561 projectionBias,
1562 cellToInputWeights,
1563 cellToForgetWeights,
1564 cellToOutputWeights,
1565 inputLayerNormWeights,
1566 forgetLayerNormWeights,
1567 cellLayerNormWeights,
1568 outputLayerNormWeights);
1569
1570 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1571 m_flatBufferBuilder,
1572 fbQLstmBaseLayer,
1573 fbQLstmDescriptor,
1574 fbQLstmParams);
1575
1576 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001577}
1578
Finn Williamsb454c5c2021-02-09 15:56:23 +00001579void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1580 const std::vector<armnn::ConstTensor>& constants,
1581 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001582{
Jan Eilers8eb25602020-03-09 12:13:48 +00001583 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001584
Jan Eilers5b01a892019-07-23 09:47:43 +01001585 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1586
Finn Williamsb454c5c2021-02-09 15:56:23 +00001587 // index for constants vector
1588 size_t i = 0;
1589
Jan Eilers5b01a892019-07-23 09:47:43 +01001590 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001591 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1592 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1593 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1594 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001595
Finn Williamsb454c5c2021-02-09 15:56:23 +00001596 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1597 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1598 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1599 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001600
Finn Williamsb454c5c2021-02-09 15:56:23 +00001601 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1602 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1603 auto cellBias = CreateConstTensorInfo(constants[i++]);
1604 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001605
1606 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1607 m_flatBufferBuilder,
1608 inputToInputWeights,
1609 inputToForgetWeights,
1610 inputToCellWeights,
1611 inputToOutputWeights,
1612 recurrentToInputWeights,
1613 recurrentToForgetWeights,
1614 recurrentToCellWeights,
1615 recurrentToOutputWeights,
1616 inputGateBias,
1617 forgetGateBias,
1618 cellBias,
1619 outputGateBias);
1620
1621 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1622 m_flatBufferBuilder,
1623 fbQuantizedLstmBaseLayer,
1624 fbQuantizedLstmParams);
1625
1626 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001627}
1628
Finn Williamsb454c5c2021-02-09 15:56:23 +00001629fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001630 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001631{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001632
Sadik Armagandb059fd2019-03-20 12:28:32 +00001633 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1634
Mike Kelly8c1701a2019-02-11 17:01:27 +00001635 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1636 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1637
1638 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001639 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001640 m_flatBufferBuilder.CreateString(layer->GetName()),
1641 layerType,
1642 m_flatBufferBuilder.CreateVector(inputSlots),
1643 m_flatBufferBuilder.CreateVector(outputSlots));
1644}
1645
Finn Williamsb454c5c2021-02-09 15:56:23 +00001646void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001647{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001648
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001649 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001650 m_serializedLayers.push_back(anyLayer);
1651}
1652
Mike Kellya0766c32019-02-19 17:22:07 +00001653template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001654flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001655{
1656 const T* buffer = reinterpret_cast<const T*>(memory);
1657 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1658 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1659 return fbVector;
1660}
1661
Finn Williamsb454c5c2021-02-09 15:56:23 +00001662flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001663{
Mike Kellya0766c32019-02-19 17:22:07 +00001664 // Get the dimensions
1665 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001666 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1667 {
1668 shape.push_back(tensorInfo.GetShape()[dim]);
1669 }
1670
Colm Donelan800b2812021-02-12 12:43:35 +00001671 std::vector<bool> specificity;
1672 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1673 // matches the size of dimensions.
1674 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1675 {
1676 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
1677 }
1678
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001679 if (tensorInfo.HasPerAxisQuantization())
1680 {
1681 // Create FlatBuffer TensorInfo
1682 auto flatBufferTensorInfo =
1683 serializer::CreateTensorInfo(m_flatBufferBuilder,
1684 m_flatBufferBuilder.CreateVector(shape),
1685 GetFlatBufferDataType(tensorInfo.GetDataType()),
1686 tensorInfo.GetQuantizationScales()[0],
1687 tensorInfo.GetQuantizationOffset(),
1688 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001689 tensorInfo.GetQuantizationDim().value(),
1690 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001691 (tensorInfo.GetShape().GetDimensionality()),
1692 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001693 return flatBufferTensorInfo;
1694 }
1695
Mike Kellya0766c32019-02-19 17:22:07 +00001696 // Create FlatBuffer TensorInfo
1697 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1698 m_flatBufferBuilder.CreateVector(shape),
1699 GetFlatBufferDataType(tensorInfo.GetDataType()),
1700 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001701 tensorInfo.GetQuantizationOffset(),
1702 0,
1703 0,
1704 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001705 (tensorInfo.GetShape().GetDimensionality()),
1706 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001707 return flatBufferTensorInfo;
1708}
1709
1710flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001711 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001712{
1713 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1714
Mike Kellya0766c32019-02-19 17:22:07 +00001715 flatbuffers::Offset<void> fbPayload;
1716
1717 switch (tensorInfo.GetDataType())
1718 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001719 case armnn::DataType::Float32:
1720 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001721 {
1722 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1723 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1724 m_flatBufferBuilder,
1725 fbVector);
1726 fbPayload = flatBuffersData.o;
1727 break;
1728 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001729 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001730 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001731 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001732 {
1733 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1734 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1735 m_flatBufferBuilder,
1736 fbVector);
1737 fbPayload = flatBuffersData.o;
1738 break;
1739 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001740 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001741 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001742 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001743 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001744 default:
1745 {
1746 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1747 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1748 m_flatBufferBuilder,
1749 fbVector);
1750 fbPayload = flatBuffersData.o;
1751 }
1752 }
1753 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1754 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001755 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001756 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1757 fbPayload);
1758 return flatBufferConstTensor;
1759}
1760
Finn Williamsb454c5c2021-02-09 15:56:23 +00001761flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001762{
1763 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1764 serializer::CreateFeatureCompatibilityVersions(
1765 m_flatBufferBuilder,
1766 1 // Binding ids scheme version
1767 );
1768 return versionsTable;
1769}
1770
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001771std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001772 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001773{
Mike Kellya0766c32019-02-19 17:22:07 +00001774 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001775
1776 // Get the InputSlots
1777 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1778 {
1779 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1780
1781 // Get the Connection for the InputSlot
1782 const IOutputSlot* connection = inputSlot.GetConnection();
1783
1784 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001785 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1786 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001787 // Create FlatBuffer InputSlot
1788 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1789 }
1790 return inputSlots;
1791}
1792
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001793std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001794 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001795{
1796 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1797
1798 // Get the OutputSlots
1799 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1800 {
1801 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001802 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001803
Mike Kelly8c1701a2019-02-11 17:01:27 +00001804 // Create FlatBuffer Outputslot
1805 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1806 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001807 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001808 }
1809 return outputSlots;
1810}
1811
Finn Williamsb454c5c2021-02-09 15:56:23 +00001812void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1813 const BaseDescriptor& descriptor,
1814 const std::vector<armnn::ConstTensor>& constants,
1815 const char* name,
1816 const armnn::LayerBindingId id)
1817{
1818 IgnoreUnused(constants);
1819
1820 switch (layer->GetType())
1821 {
1822 case armnn::LayerType::Activation :
1823 {
1824 const armnn::ActivationDescriptor& layerDescriptor =
1825 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1826 SerializeActivationLayer(layer, layerDescriptor, name);
1827 break;
1828 }
1829 case armnn::LayerType::Addition :
1830 {
1831 SerializeAdditionLayer(layer, name);
1832 break;
1833 }
1834 case armnn::LayerType::ArgMinMax :
1835 {
1836 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1837 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1838 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1839 break;
1840 }
1841 case armnn::LayerType::BatchNormalization :
1842 {
1843 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1844 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1845 SerializeBatchNormalizationLayer(layer,
1846 layerDescriptor,
1847 constants,
1848 name);
1849 break;
1850 }
1851 case armnn::LayerType::BatchToSpaceNd :
1852 {
1853 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1854 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1855 SerializeBatchToSpaceNdLayer(layer,
1856 layerDescriptor,
1857 name);
1858 break;
1859 }
1860 case armnn::LayerType::Comparison :
1861 {
1862 const armnn::ComparisonDescriptor& layerDescriptor =
1863 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
1864 SerializeComparisonLayer(layer,
1865 layerDescriptor,
1866 name);
1867 break;
1868 }
1869 case armnn::LayerType::Concat :
1870 {
1871 const armnn::ConcatDescriptor& layerDescriptor =
1872 static_cast<const armnn::ConcatDescriptor&>(descriptor);
1873 SerializeConcatLayer(layer,
1874 layerDescriptor,
1875 name);
1876 break;
1877 }
1878 case armnn::LayerType::Constant :
1879 {
1880 SerializeConstantLayer(layer,
1881 constants,
1882 name);
1883 break;
1884 }
1885 case armnn::LayerType::Convolution2d :
1886 {
1887 const armnn::Convolution2dDescriptor& layerDescriptor =
1888 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
1889 SerializeConvolution2dLayer(layer,
1890 layerDescriptor,
1891 constants,
1892 name);
1893 break;
1894 }
1895 case armnn::LayerType::DepthToSpace :
1896 {
1897 const armnn::DepthToSpaceDescriptor& layerDescriptor =
1898 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
1899 SerializeDepthToSpaceLayer(layer,
1900 layerDescriptor,
1901 name);
1902 break;
1903 }
1904 case armnn::LayerType::DepthwiseConvolution2d :
1905 {
1906 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
1907 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
1908 SerializeDepthwiseConvolution2dLayer(layer,
1909 layerDescriptor,
1910 constants,
1911 name);
1912 break;
1913 }
1914 case armnn::LayerType::Dequantize :
1915 {
1916 SerializeDequantizeLayer(layer,
1917 name);
1918 break;
1919 }
1920 case armnn::LayerType::DetectionPostProcess :
1921 {
1922 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
1923 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
1924 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
1925 break;
1926 }
1927 case armnn::LayerType::Division :
1928 {
1929 SerializeDivisionLayer(layer, name);
1930 break;
1931 }
1932 case armnn::LayerType::ElementwiseUnary :
1933 {
1934 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
1935 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
1936 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
1937 break;
1938 }
1939 case armnn::LayerType::Fill :
1940 {
1941 const armnn::FillDescriptor& layerDescriptor =
1942 static_cast<const armnn::FillDescriptor&>(descriptor);
1943 SerializeFillLayer(layer, layerDescriptor, name);
1944 break;
1945 }
1946 case armnn::LayerType::Floor :
1947 {
1948 SerializeFloorLayer(layer, name);
1949 break;
1950 }
1951 case armnn::LayerType::FullyConnected :
1952 {
1953 const armnn::FullyConnectedDescriptor& layerDescriptor =
1954 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
1955 SerializeFullyConnectedLayer(layer, layerDescriptor, constants, name);
1956 break;
1957 }
1958 case armnn::LayerType::Gather :
1959 {
1960 const armnn::GatherDescriptor& layerDescriptor =
1961 static_cast<const armnn::GatherDescriptor&>(descriptor);
1962 SerializeGatherLayer(layer, layerDescriptor, name);
1963 break;
1964 }
1965 case armnn::LayerType::Input:
1966 {
1967 SerializeInputLayer(layer, id, name);
1968 break;
1969 }
1970 case armnn::LayerType::InstanceNormalization :
1971 {
1972 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
1973 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
1974 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
1975 break;
1976 }
1977 case armnn::LayerType::L2Normalization :
1978 {
1979 const armnn::L2NormalizationDescriptor& layerDescriptor =
1980 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
1981 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
1982 break;
1983 }
1984 case armnn::LayerType::LogicalBinary :
1985 {
1986 const armnn::LogicalBinaryDescriptor& layerDescriptor =
1987 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
1988 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
1989 break;
1990 }
1991 case armnn::LayerType::LogSoftmax :
1992 {
1993 const armnn::LogSoftmaxDescriptor& layerDescriptor =
1994 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
1995 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
1996 break;
1997 }
1998 case armnn::LayerType::Lstm :
1999 {
2000 const armnn::LstmDescriptor& layerDescriptor =
2001 static_cast<const armnn::LstmDescriptor&>(descriptor);
2002 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2003 break;
2004 }
2005 case armnn::LayerType::QLstm :
2006 {
2007 const armnn::QLstmDescriptor& layerDescriptor =
2008 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2009 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2010 break;
2011 }
2012 case armnn::LayerType::Maximum :
2013 {
2014 SerializeMaximumLayer(layer, name);
2015 break;
2016 }
2017 case armnn::LayerType::Mean :
2018 {
2019 const armnn::MeanDescriptor& layerDescriptor =
2020 static_cast<const armnn::MeanDescriptor&>(descriptor);
2021 SerializeMeanLayer(layer, layerDescriptor, name);
2022 break;
2023 }
2024 case armnn::LayerType::Merge :
2025 {
2026 SerializeMergeLayer(layer, name);
2027 break;
2028 }
2029 case armnn::LayerType::Minimum :
2030 {
2031 SerializeMinimumLayer(layer, name);
2032 break;
2033 }
2034 case armnn::LayerType::Multiplication :
2035 {
2036 SerializeMultiplicationLayer(layer, name);
2037 break;
2038 }
2039 case armnn::LayerType::Normalization :
2040 {
2041 const armnn::NormalizationDescriptor& layerDescriptor =
2042 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2043 SerializeNormalizationLayer(layer, layerDescriptor, name);
2044 break;
2045 }
2046 case armnn::LayerType::Output:
2047 {
2048 SerializeOutputLayer(layer, id, name);
2049 break;
2050 }
2051 case armnn::LayerType::Pad :
2052 {
2053 const armnn::PadDescriptor& layerDescriptor =
2054 static_cast<const armnn::PadDescriptor&>(descriptor);
2055 SerializePadLayer(layer, layerDescriptor, name);
2056 break;
2057 }
2058 case armnn::LayerType::Permute :
2059 {
2060 const armnn::PermuteDescriptor& layerDescriptor =
2061 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2062 SerializePermuteLayer(layer, layerDescriptor, name);
2063 break;
2064 }
2065 case armnn::LayerType::Pooling2d :
2066 {
2067 const armnn::Pooling2dDescriptor& layerDescriptor =
2068 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2069 SerializePooling2dLayer(layer, layerDescriptor, name);
2070 break;
2071 }
2072 case armnn::LayerType::Prelu :
2073 {
2074 SerializePreluLayer(layer, name);
2075 break;
2076 }
2077 case armnn::LayerType::Quantize :
2078 {
2079 SerializeQuantizeLayer(layer, name);
2080 break;
2081 }
2082 case armnn::LayerType::QuantizedLstm:
2083 SerializeQuantizedLstmLayer(layer, constants, name);
2084 break;
2085 case armnn::LayerType::Reshape:
2086 {
2087 const armnn::ReshapeDescriptor &layerDescriptor =
2088 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2089 SerializeReshapeLayer(layer, layerDescriptor, name);
2090 break;
2091 }
2092 case armnn::LayerType::Rank:
2093 {
2094 SerializeRankLayer(layer, name);
2095 break;
2096 }
2097 case armnn::LayerType::Reduce:
2098 {
2099 const armnn::ReduceDescriptor& layerDescriptor =
2100 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2101 SerializeReduceLayer(layer, layerDescriptor, name);
2102 break;
2103 }
2104 case armnn::LayerType::Resize:
2105 {
2106 const armnn::ResizeDescriptor& layerDescriptor =
2107 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2108 SerializeResizeLayer(layer, layerDescriptor, name);
2109 break;
2110 }
2111 case armnn::LayerType::Slice:
2112 {
2113 const armnn::SliceDescriptor& layerDescriptor =
2114 static_cast<const armnn::SliceDescriptor&>(descriptor);
2115 SerializeSliceLayer(layer, layerDescriptor, name);
2116 break;
2117 }
2118 case armnn::LayerType::Softmax:
2119 {
2120 const armnn::SoftmaxDescriptor& layerDescriptor =
2121 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2122 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2123 break;
2124 }
2125 case armnn::LayerType::SpaceToBatchNd:
2126 {
2127 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2128 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2129 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2130 break;
2131 }
2132 case armnn::LayerType::SpaceToDepth:
2133 {
2134 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2135 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2136 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2137 break;
2138 }
2139 case armnn::LayerType::Splitter:
2140 {
2141 const armnn::SplitterDescriptor& layerDescriptor =
2142 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2143 SerializeSplitterLayer(layer, layerDescriptor, name);
2144 break;
2145 }
2146 case armnn::LayerType::Stack:
2147 {
2148 const armnn::StackDescriptor& layerDescriptor =
2149 static_cast<const armnn::StackDescriptor&>(descriptor);
2150 SerializeStackLayer(layer, layerDescriptor, name);
2151 break;
2152 }
2153 case armnn::LayerType::StandIn:
2154 {
2155 const armnn::StandInDescriptor& layerDescriptor =
2156 static_cast<const armnn::StandInDescriptor&>(descriptor);
2157 SerializeStandInLayer(layer, layerDescriptor, name);
2158 break;
2159 }
2160 case armnn::LayerType::StridedSlice:
2161 {
2162 const armnn::StridedSliceDescriptor& layerDescriptor =
2163 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2164 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2165 break;
2166 }
2167 case armnn::LayerType::Subtraction:
2168 {
2169 SerializeSubtractionLayer(layer, name);
2170 break;
2171 }
2172 case armnn::LayerType::Switch:
2173 {
2174 SerializeSwitchLayer(layer, name);
2175 break;
2176 }
2177 case armnn::LayerType::Transpose:
2178 {
2179 const armnn::TransposeDescriptor& layerDescriptor =
2180 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2181 SerializeTransposeLayer(layer, layerDescriptor, name);
2182 break;
2183 }
2184 case armnn::LayerType::TransposeConvolution2d:
2185 {
2186 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2187 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2188 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2189 break;
2190 }
2191 default:
2192 {
2193 throw InvalidArgumentException(
2194 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2195 layer->GetName(),
2196 id));
2197 }
2198 }
2199}
2200
Finn Williams85d36712021-01-26 22:30:06 +00002201void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002202{
2203 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002204 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2205 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002206
2207 // Create FlatBuffer SerializedGraph
2208 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002209 fbBuilder,
2210 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2211 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2212 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2213 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002214
2215 // Serialize the graph
2216 fbBuilder.Finish(serializedGraph);
2217}
2218
Finn Williamsb454c5c2021-02-09 15:56:23 +00002219
Finn Williams85d36712021-01-26 22:30:06 +00002220bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002221{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002222 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002223
Matthew Sloyan0663d662020-09-14 11:47:26 +01002224 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002225 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002226 return !stream.bad();
2227}
2228
Finn Williams2605b232020-06-10 15:53:46 +01002229} // namespace armnnSerializer