blob: ae9ddf29f2b46205b10d25f3846bd82e68dbe2c1 [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,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001121 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001122{
1123 // Create FlatBuffer BaseLayer
1124 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1125
1126 // Create FlatBuffer FullyConnectedDescriptor
1127 auto flatBufferDescriptor =
1128 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1129 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001130 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1131 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001132
1133 // Create FlatBuffer weights data
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001134 flatbuffers::Offset<serializer::ConstTensor> flatBufferWeights;
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001135 // Create FlatBuffer bias data
1136 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001137 if (fullyConnectedDescriptor.m_ConstantWeights && !constants.empty())
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001138 {
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001139 armnn::ConstTensor weights = constants.at(0);
1140 flatBufferWeights = CreateConstTensorInfo(weights);
1141
1142 if (fullyConnectedDescriptor.m_BiasEnabled)
1143 {
1144 armnn::ConstTensor biases = constants.at(1);
1145 flatBufferBiases = CreateConstTensorInfo(biases);
1146 }
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001147 }
1148
1149 // Create FlatBuffer FullyConnectedLayer
1150 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1151 flatBufferBaseLayer,
1152 flatBufferDescriptor,
1153 flatBufferWeights,
1154 flatBufferBiases);
1155
1156 // Add created FullyConnectedLayer to the FlatBufferLayers
1157 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1158}
1159
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001160// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001161void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001162 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1163 const char* name)
1164{
Jan Eilers8eb25602020-03-09 12:13:48 +00001165 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001166
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001167 // Create FlatBuffer BaseLayer
1168 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1169
1170 std::vector<unsigned int> padList;
1171 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1172 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1173 {
1174 padList.push_back(pad.first);
1175 padList.push_back(pad.second);
1176 }
1177
1178 auto flatBufferDescriptor =
1179 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1180 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1181 m_flatBufferBuilder.CreateVector(padList),
1182 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1183
1184 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1185 flatBufferBaseLayer,
1186 flatBufferDescriptor);
1187
1188 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1189}
1190
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001191// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001192void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001193 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1194 const char* name)
1195{
Jan Eilers8eb25602020-03-09 12:13:48 +00001196 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001197
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001198 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1199 auto flatBufferDescriptor =
1200 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1201 spaceToDepthDescriptor.m_BlockSize,
1202 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1203
1204 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1205 flatBufferBaseLayer,
1206 flatBufferDescriptor);
1207
1208 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001209}
1210
Jim Flynn18ce3382019-03-08 11:08:30 +00001211// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001212void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001213 const armnn::ViewsDescriptor& viewsDescriptor,
1214 const char* name)
1215{
Jan Eilers8eb25602020-03-09 12:13:48 +00001216 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001217
Jim Flynn18ce3382019-03-08 11:08:30 +00001218 // Create FlatBuffer ViewOrigins
1219 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1220 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1221
1222 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1223 {
1224 std::vector<uint32_t> viewOrigin;
1225 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1226
1227 // Copy vector
1228 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1229 {
1230 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1231 }
1232
1233 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1234 m_flatBufferBuilder.CreateVector(viewOrigin)));
1235 }
1236
1237 // Create FlatBuffer OriginsDescriptor
1238 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1239 viewsDescriptor.GetOrigins().GetConcatAxis(),
1240 viewsDescriptor.GetOrigins().GetNumViews(),
1241 viewsDescriptor.GetOrigins().GetNumDimensions(),
1242 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1243
1244 // Create FlatBuffer ViewOrigins
1245 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1246 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1247
1248 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1249 {
1250 std::vector<uint32_t> viewSize;
1251 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1252
1253 // Copy vector
1254 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1255 {
1256 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1257 }
1258
1259 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1260 m_flatBufferBuilder.CreateVector(viewSize)));
1261 }
1262
1263 // Create FlatBuffer ViewsDescriptor
1264 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1265 flatBufferOriginDescriptor,
1266 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1267
1268 // Create FlatBuffer BaseLayer
1269 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1270
1271 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1272 flatBufferBaseLayer,
1273 flatBufferViewsDescriptor);
1274
1275 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1276}
1277
Finn Williamsb454c5c2021-02-09 15:56:23 +00001278void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001279 const armnn::NormalizationDescriptor& descriptor,
1280 const char* name)
1281{
Jan Eilers8eb25602020-03-09 12:13:48 +00001282 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001283
Nina Drozd57728782019-02-27 10:53:27 +00001284 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1285
1286 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1287 m_flatBufferBuilder,
1288 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1289 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1290 descriptor.m_NormSize,
1291 descriptor.m_Alpha,
1292 descriptor.m_Beta,
1293 descriptor.m_K,
1294 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1295
1296 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1297 fbNormalizationBaseLayer,
1298 fbNormalizationDescriptor);
1299
1300 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1301}
1302
Finn Williamsb454c5c2021-02-09 15:56:23 +00001303void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001304 const armnn::StackDescriptor& stackDescriptor,
1305 const char* name)
1306{
Jan Eilers8eb25602020-03-09 12:13:48 +00001307 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001308
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001309 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1310
1311 std::vector<unsigned int> inputShape;
1312 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1313 {
1314 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1315 }
1316
1317 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1318 stackDescriptor.m_Axis,
1319 stackDescriptor.m_NumInputs,
1320 m_flatBufferBuilder.CreateVector(inputShape));
1321
1322 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1323 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001324}
1325
Finn Williamsb454c5c2021-02-09 15:56:23 +00001326void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001327 const armnn::StandInDescriptor& standInDescriptor,
1328 const char *name)
1329{
Jan Eilers8eb25602020-03-09 12:13:48 +00001330 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001331
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001332 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1333 standInDescriptor.m_NumInputs,
1334 standInDescriptor.m_NumOutputs);
1335
1336 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1337 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1338
1339 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001340}
1341
Finn Williamsb454c5c2021-02-09 15:56:23 +00001342void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001343 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1344 const char* name)
1345{
Jan Eilers8eb25602020-03-09 12:13:48 +00001346 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001347
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001348 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1349
1350 auto flatBufferDescriptor =
1351 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1352 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1353 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1354 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1355 stridedSliceDescriptor.m_BeginMask,
1356 stridedSliceDescriptor.m_EndMask,
1357 stridedSliceDescriptor.m_ShrinkAxisMask,
1358 stridedSliceDescriptor.m_EllipsisMask,
1359 stridedSliceDescriptor.m_NewAxisMask,
1360 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1361
1362 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1363 flatBufferBaseLayer,
1364 flatBufferDescriptor);
1365
1366 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1367}
1368
Finn Williamsb454c5c2021-02-09 15:56:23 +00001369void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001370{
Jan Eilers8eb25602020-03-09 12:13:48 +00001371 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001372
Conor Kennedyda1f9752019-03-01 14:37:12 +00001373 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1374 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1375
1376 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1377}
1378
Finn Williamsb454c5c2021-02-09 15:56:23 +00001379void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001380{
Jan Eilers8eb25602020-03-09 12:13:48 +00001381 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001382
Sadik Armaganeff363d2019-04-05 15:25:46 +01001383 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1384 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1385
1386 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1387}
1388
Finn Williamsb454c5c2021-02-09 15:56:23 +00001389void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001390 const armnn::IConnectableLayer* layer,
1391 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001392 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001393 const char* name)
1394{
Jan Eilers8eb25602020-03-09 12:13:48 +00001395 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001396
Finn Williamsb454c5c2021-02-09 15:56:23 +00001397 const armnn::ConstTensor& weights = constants.at(0);
1398
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001399 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1400 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1401 descriptor.m_PadLeft,
1402 descriptor.m_PadRight,
1403 descriptor.m_PadTop,
1404 descriptor.m_PadBottom,
1405 descriptor.m_StrideX,
1406 descriptor.m_StrideY,
1407 descriptor.m_BiasEnabled,
1408 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1409
1410 // weights & biases
1411 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1412 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001413 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001414 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001415 const armnn::ConstTensor& biases = constants.at(1);
1416 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001417 }
1418
1419 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1420 fbBaseLayer,
1421 fbDescriptor,
1422 fbWeightsConstTensorInfo,
1423 fbBiasesConstTensorInfo);
1424
1425 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001426}
1427
Finn Williamsb454c5c2021-02-09 15:56:23 +00001428void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001429 const armnn::TransposeDescriptor& descriptor,
1430 const char* name)
1431{
Jan Eilers8eb25602020-03-09 12:13:48 +00001432 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001433
1434 // Create FlatBuffer BaseLayer
1435 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1436
1437 std::vector<unsigned int> dimMappings;
1438 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1439 {
1440 dimMappings.push_back(descriptor.m_DimMappings[i]);
1441 }
1442
1443 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1444 m_flatBufferBuilder.CreateVector(dimMappings));
1445
1446 // Create the FlatBuffer TransposeLayer
1447 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1448 flatBufferBaseLayer,
1449 flatBufferDesc);
1450
1451 // Add the AnyLayer to the FlatBufferLayers
1452 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1453}
1454
Finn Williamsb454c5c2021-02-09 15:56:23 +00001455void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1456 const armnn::QLstmDescriptor& descriptor,
1457 const std::vector<armnn::ConstTensor>& constants,
1458 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001459{
James Conroy8d333182020-05-13 10:27:58 +01001460 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001461
James Conroy8d333182020-05-13 10:27:58 +01001462 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1463
1464 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1465 m_flatBufferBuilder,
1466 descriptor.m_CifgEnabled,
1467 descriptor.m_PeepholeEnabled,
1468 descriptor.m_ProjectionEnabled,
1469 descriptor.m_LayerNormEnabled,
1470 descriptor.m_CellClip,
1471 descriptor.m_ProjectionClip,
1472 descriptor.m_InputIntermediateScale,
1473 descriptor.m_ForgetIntermediateScale,
1474 descriptor.m_CellIntermediateScale,
1475 descriptor.m_OutputIntermediateScale,
1476 descriptor.m_HiddenStateZeroPoint,
1477 descriptor.m_HiddenStateScale
1478 );
1479
Finn Williamsb454c5c2021-02-09 15:56:23 +00001480 // Index for constants vector
1481 std::size_t i = 0;
1482
James Conroy8d333182020-05-13 10:27:58 +01001483 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001484 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1485 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1486 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1487 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1488 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1489 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1490 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1491 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1492 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001493
1494 // CIFG
1495 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1496 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1497 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1498
1499 if (!descriptor.m_CifgEnabled)
1500 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001501 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1502 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1503 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001504 }
1505
1506 // Peephole
1507 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1508 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1509 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1510
1511 if (descriptor.m_PeepholeEnabled)
1512 {
1513 if (!descriptor.m_CifgEnabled)
1514 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001515 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001516 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001517 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1518 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1519 }
James Conroy8d333182020-05-13 10:27:58 +01001520
Finn Williamsb454c5c2021-02-09 15:56:23 +00001521 // Projection
1522 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1523 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1524
1525 if (descriptor.m_ProjectionEnabled)
1526 {
1527 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1528 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001529 }
1530
1531 // Layer norm
1532 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1533 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1534 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1535 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1536
1537 if (descriptor.m_LayerNormEnabled)
1538 {
1539 if (!descriptor.m_CifgEnabled)
1540 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001541 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001542 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001543 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1544 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1545 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001546 }
1547
1548 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1549 m_flatBufferBuilder,
1550 inputToForgetWeights,
1551 inputToCellWeights,
1552 inputToOutputWeights,
1553 recurrentToForgetWeights,
1554 recurrentToCellWeights,
1555 recurrentToOutputWeights,
1556 forgetGateBias,
1557 cellBias,
1558 outputGateBias,
1559 inputToInputWeights,
1560 recurrentToInputWeights,
1561 inputGateBias,
1562 projectionWeights,
1563 projectionBias,
1564 cellToInputWeights,
1565 cellToForgetWeights,
1566 cellToOutputWeights,
1567 inputLayerNormWeights,
1568 forgetLayerNormWeights,
1569 cellLayerNormWeights,
1570 outputLayerNormWeights);
1571
1572 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1573 m_flatBufferBuilder,
1574 fbQLstmBaseLayer,
1575 fbQLstmDescriptor,
1576 fbQLstmParams);
1577
1578 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001579}
1580
Finn Williamsb454c5c2021-02-09 15:56:23 +00001581void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1582 const std::vector<armnn::ConstTensor>& constants,
1583 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001584{
Jan Eilers8eb25602020-03-09 12:13:48 +00001585 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001586
Jan Eilers5b01a892019-07-23 09:47:43 +01001587 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1588
Finn Williamsb454c5c2021-02-09 15:56:23 +00001589 // index for constants vector
1590 size_t i = 0;
1591
Jan Eilers5b01a892019-07-23 09:47:43 +01001592 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001593 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1594 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1595 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1596 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001597
Finn Williamsb454c5c2021-02-09 15:56:23 +00001598 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1599 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1600 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1601 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001602
Finn Williamsb454c5c2021-02-09 15:56:23 +00001603 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1604 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1605 auto cellBias = CreateConstTensorInfo(constants[i++]);
1606 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001607
1608 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1609 m_flatBufferBuilder,
1610 inputToInputWeights,
1611 inputToForgetWeights,
1612 inputToCellWeights,
1613 inputToOutputWeights,
1614 recurrentToInputWeights,
1615 recurrentToForgetWeights,
1616 recurrentToCellWeights,
1617 recurrentToOutputWeights,
1618 inputGateBias,
1619 forgetGateBias,
1620 cellBias,
1621 outputGateBias);
1622
1623 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1624 m_flatBufferBuilder,
1625 fbQuantizedLstmBaseLayer,
1626 fbQuantizedLstmParams);
1627
1628 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001629}
1630
Finn Williamsb454c5c2021-02-09 15:56:23 +00001631fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001632 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001633{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001634
Sadik Armagandb059fd2019-03-20 12:28:32 +00001635 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1636
Mike Kelly8c1701a2019-02-11 17:01:27 +00001637 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1638 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1639
1640 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001641 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001642 m_flatBufferBuilder.CreateString(layer->GetName()),
1643 layerType,
1644 m_flatBufferBuilder.CreateVector(inputSlots),
1645 m_flatBufferBuilder.CreateVector(outputSlots));
1646}
1647
Finn Williamsb454c5c2021-02-09 15:56:23 +00001648void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001649{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001650
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001651 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001652 m_serializedLayers.push_back(anyLayer);
1653}
1654
Mike Kellya0766c32019-02-19 17:22:07 +00001655template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001656flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001657{
1658 const T* buffer = reinterpret_cast<const T*>(memory);
1659 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1660 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1661 return fbVector;
1662}
1663
Finn Williamsb454c5c2021-02-09 15:56:23 +00001664flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001665{
Mike Kellya0766c32019-02-19 17:22:07 +00001666 // Get the dimensions
1667 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001668 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1669 {
1670 shape.push_back(tensorInfo.GetShape()[dim]);
1671 }
1672
Colm Donelan800b2812021-02-12 12:43:35 +00001673 std::vector<bool> specificity;
1674 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1675 // matches the size of dimensions.
1676 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1677 {
1678 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
1679 }
1680
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001681 if (tensorInfo.HasPerAxisQuantization())
1682 {
1683 // Create FlatBuffer TensorInfo
1684 auto flatBufferTensorInfo =
1685 serializer::CreateTensorInfo(m_flatBufferBuilder,
1686 m_flatBufferBuilder.CreateVector(shape),
1687 GetFlatBufferDataType(tensorInfo.GetDataType()),
1688 tensorInfo.GetQuantizationScales()[0],
1689 tensorInfo.GetQuantizationOffset(),
1690 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001691 tensorInfo.GetQuantizationDim().value(),
1692 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001693 (tensorInfo.GetShape().GetDimensionality()),
1694 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001695 return flatBufferTensorInfo;
1696 }
1697
Mike Kellya0766c32019-02-19 17:22:07 +00001698 // Create FlatBuffer TensorInfo
1699 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1700 m_flatBufferBuilder.CreateVector(shape),
1701 GetFlatBufferDataType(tensorInfo.GetDataType()),
1702 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001703 tensorInfo.GetQuantizationOffset(),
1704 0,
1705 0,
1706 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001707 (tensorInfo.GetShape().GetDimensionality()),
1708 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001709 return flatBufferTensorInfo;
1710}
1711
1712flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001713 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001714{
1715 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1716
Mike Kellya0766c32019-02-19 17:22:07 +00001717 flatbuffers::Offset<void> fbPayload;
1718
1719 switch (tensorInfo.GetDataType())
1720 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001721 case armnn::DataType::Float32:
1722 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001723 {
1724 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1725 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1726 m_flatBufferBuilder,
1727 fbVector);
1728 fbPayload = flatBuffersData.o;
1729 break;
1730 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001731 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001732 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001733 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001734 {
1735 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1736 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1737 m_flatBufferBuilder,
1738 fbVector);
1739 fbPayload = flatBuffersData.o;
1740 break;
1741 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001742 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001743 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001744 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001745 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001746 default:
1747 {
1748 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1749 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1750 m_flatBufferBuilder,
1751 fbVector);
1752 fbPayload = flatBuffersData.o;
1753 }
1754 }
1755 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1756 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001757 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001758 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1759 fbPayload);
1760 return flatBufferConstTensor;
1761}
1762
Finn Williamsb454c5c2021-02-09 15:56:23 +00001763flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001764{
1765 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1766 serializer::CreateFeatureCompatibilityVersions(
1767 m_flatBufferBuilder,
1768 1 // Binding ids scheme version
1769 );
1770 return versionsTable;
1771}
1772
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001773std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001774 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001775{
Mike Kellya0766c32019-02-19 17:22:07 +00001776 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001777
1778 // Get the InputSlots
1779 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1780 {
1781 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1782
1783 // Get the Connection for the InputSlot
1784 const IOutputSlot* connection = inputSlot.GetConnection();
1785
1786 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001787 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1788 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001789 // Create FlatBuffer InputSlot
1790 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1791 }
1792 return inputSlots;
1793}
1794
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001795std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001796 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001797{
1798 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1799
1800 // Get the OutputSlots
1801 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1802 {
1803 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001804 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001805
Mike Kelly8c1701a2019-02-11 17:01:27 +00001806 // Create FlatBuffer Outputslot
1807 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1808 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001809 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001810 }
1811 return outputSlots;
1812}
1813
Finn Williamsb454c5c2021-02-09 15:56:23 +00001814void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1815 const BaseDescriptor& descriptor,
1816 const std::vector<armnn::ConstTensor>& constants,
1817 const char* name,
1818 const armnn::LayerBindingId id)
1819{
1820 IgnoreUnused(constants);
1821
1822 switch (layer->GetType())
1823 {
1824 case armnn::LayerType::Activation :
1825 {
1826 const armnn::ActivationDescriptor& layerDescriptor =
1827 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1828 SerializeActivationLayer(layer, layerDescriptor, name);
1829 break;
1830 }
1831 case armnn::LayerType::Addition :
1832 {
1833 SerializeAdditionLayer(layer, name);
1834 break;
1835 }
1836 case armnn::LayerType::ArgMinMax :
1837 {
1838 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1839 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1840 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1841 break;
1842 }
1843 case armnn::LayerType::BatchNormalization :
1844 {
1845 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1846 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1847 SerializeBatchNormalizationLayer(layer,
1848 layerDescriptor,
1849 constants,
1850 name);
1851 break;
1852 }
1853 case armnn::LayerType::BatchToSpaceNd :
1854 {
1855 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1856 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1857 SerializeBatchToSpaceNdLayer(layer,
1858 layerDescriptor,
1859 name);
1860 break;
1861 }
1862 case armnn::LayerType::Comparison :
1863 {
1864 const armnn::ComparisonDescriptor& layerDescriptor =
1865 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
1866 SerializeComparisonLayer(layer,
1867 layerDescriptor,
1868 name);
1869 break;
1870 }
1871 case armnn::LayerType::Concat :
1872 {
1873 const armnn::ConcatDescriptor& layerDescriptor =
1874 static_cast<const armnn::ConcatDescriptor&>(descriptor);
1875 SerializeConcatLayer(layer,
1876 layerDescriptor,
1877 name);
1878 break;
1879 }
1880 case armnn::LayerType::Constant :
1881 {
1882 SerializeConstantLayer(layer,
1883 constants,
1884 name);
1885 break;
1886 }
1887 case armnn::LayerType::Convolution2d :
1888 {
1889 const armnn::Convolution2dDescriptor& layerDescriptor =
1890 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
1891 SerializeConvolution2dLayer(layer,
1892 layerDescriptor,
1893 constants,
1894 name);
1895 break;
1896 }
1897 case armnn::LayerType::DepthToSpace :
1898 {
1899 const armnn::DepthToSpaceDescriptor& layerDescriptor =
1900 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
1901 SerializeDepthToSpaceLayer(layer,
1902 layerDescriptor,
1903 name);
1904 break;
1905 }
1906 case armnn::LayerType::DepthwiseConvolution2d :
1907 {
1908 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
1909 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
1910 SerializeDepthwiseConvolution2dLayer(layer,
1911 layerDescriptor,
1912 constants,
1913 name);
1914 break;
1915 }
1916 case armnn::LayerType::Dequantize :
1917 {
1918 SerializeDequantizeLayer(layer,
1919 name);
1920 break;
1921 }
1922 case armnn::LayerType::DetectionPostProcess :
1923 {
1924 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
1925 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
1926 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
1927 break;
1928 }
1929 case armnn::LayerType::Division :
1930 {
1931 SerializeDivisionLayer(layer, name);
1932 break;
1933 }
1934 case armnn::LayerType::ElementwiseUnary :
1935 {
1936 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
1937 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
1938 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
1939 break;
1940 }
1941 case armnn::LayerType::Fill :
1942 {
1943 const armnn::FillDescriptor& layerDescriptor =
1944 static_cast<const armnn::FillDescriptor&>(descriptor);
1945 SerializeFillLayer(layer, layerDescriptor, name);
1946 break;
1947 }
1948 case armnn::LayerType::Floor :
1949 {
1950 SerializeFloorLayer(layer, name);
1951 break;
1952 }
1953 case armnn::LayerType::FullyConnected :
1954 {
1955 const armnn::FullyConnectedDescriptor& layerDescriptor =
1956 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
1957 SerializeFullyConnectedLayer(layer, layerDescriptor, constants, name);
1958 break;
1959 }
1960 case armnn::LayerType::Gather :
1961 {
1962 const armnn::GatherDescriptor& layerDescriptor =
1963 static_cast<const armnn::GatherDescriptor&>(descriptor);
1964 SerializeGatherLayer(layer, layerDescriptor, name);
1965 break;
1966 }
1967 case armnn::LayerType::Input:
1968 {
1969 SerializeInputLayer(layer, id, name);
1970 break;
1971 }
1972 case armnn::LayerType::InstanceNormalization :
1973 {
1974 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
1975 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
1976 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
1977 break;
1978 }
1979 case armnn::LayerType::L2Normalization :
1980 {
1981 const armnn::L2NormalizationDescriptor& layerDescriptor =
1982 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
1983 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
1984 break;
1985 }
1986 case armnn::LayerType::LogicalBinary :
1987 {
1988 const armnn::LogicalBinaryDescriptor& layerDescriptor =
1989 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
1990 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
1991 break;
1992 }
1993 case armnn::LayerType::LogSoftmax :
1994 {
1995 const armnn::LogSoftmaxDescriptor& layerDescriptor =
1996 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
1997 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
1998 break;
1999 }
2000 case armnn::LayerType::Lstm :
2001 {
2002 const armnn::LstmDescriptor& layerDescriptor =
2003 static_cast<const armnn::LstmDescriptor&>(descriptor);
2004 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2005 break;
2006 }
2007 case armnn::LayerType::QLstm :
2008 {
2009 const armnn::QLstmDescriptor& layerDescriptor =
2010 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2011 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2012 break;
2013 }
2014 case armnn::LayerType::Maximum :
2015 {
2016 SerializeMaximumLayer(layer, name);
2017 break;
2018 }
2019 case armnn::LayerType::Mean :
2020 {
2021 const armnn::MeanDescriptor& layerDescriptor =
2022 static_cast<const armnn::MeanDescriptor&>(descriptor);
2023 SerializeMeanLayer(layer, layerDescriptor, name);
2024 break;
2025 }
2026 case armnn::LayerType::Merge :
2027 {
2028 SerializeMergeLayer(layer, name);
2029 break;
2030 }
2031 case armnn::LayerType::Minimum :
2032 {
2033 SerializeMinimumLayer(layer, name);
2034 break;
2035 }
2036 case armnn::LayerType::Multiplication :
2037 {
2038 SerializeMultiplicationLayer(layer, name);
2039 break;
2040 }
2041 case armnn::LayerType::Normalization :
2042 {
2043 const armnn::NormalizationDescriptor& layerDescriptor =
2044 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2045 SerializeNormalizationLayer(layer, layerDescriptor, name);
2046 break;
2047 }
2048 case armnn::LayerType::Output:
2049 {
2050 SerializeOutputLayer(layer, id, name);
2051 break;
2052 }
2053 case armnn::LayerType::Pad :
2054 {
2055 const armnn::PadDescriptor& layerDescriptor =
2056 static_cast<const armnn::PadDescriptor&>(descriptor);
2057 SerializePadLayer(layer, layerDescriptor, name);
2058 break;
2059 }
2060 case armnn::LayerType::Permute :
2061 {
2062 const armnn::PermuteDescriptor& layerDescriptor =
2063 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2064 SerializePermuteLayer(layer, layerDescriptor, name);
2065 break;
2066 }
2067 case armnn::LayerType::Pooling2d :
2068 {
2069 const armnn::Pooling2dDescriptor& layerDescriptor =
2070 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2071 SerializePooling2dLayer(layer, layerDescriptor, name);
2072 break;
2073 }
2074 case armnn::LayerType::Prelu :
2075 {
2076 SerializePreluLayer(layer, name);
2077 break;
2078 }
2079 case armnn::LayerType::Quantize :
2080 {
2081 SerializeQuantizeLayer(layer, name);
2082 break;
2083 }
2084 case armnn::LayerType::QuantizedLstm:
2085 SerializeQuantizedLstmLayer(layer, constants, name);
2086 break;
2087 case armnn::LayerType::Reshape:
2088 {
2089 const armnn::ReshapeDescriptor &layerDescriptor =
2090 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2091 SerializeReshapeLayer(layer, layerDescriptor, name);
2092 break;
2093 }
2094 case armnn::LayerType::Rank:
2095 {
2096 SerializeRankLayer(layer, name);
2097 break;
2098 }
2099 case armnn::LayerType::Reduce:
2100 {
2101 const armnn::ReduceDescriptor& layerDescriptor =
2102 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2103 SerializeReduceLayer(layer, layerDescriptor, name);
2104 break;
2105 }
2106 case armnn::LayerType::Resize:
2107 {
2108 const armnn::ResizeDescriptor& layerDescriptor =
2109 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2110 SerializeResizeLayer(layer, layerDescriptor, name);
2111 break;
2112 }
2113 case armnn::LayerType::Slice:
2114 {
2115 const armnn::SliceDescriptor& layerDescriptor =
2116 static_cast<const armnn::SliceDescriptor&>(descriptor);
2117 SerializeSliceLayer(layer, layerDescriptor, name);
2118 break;
2119 }
2120 case armnn::LayerType::Softmax:
2121 {
2122 const armnn::SoftmaxDescriptor& layerDescriptor =
2123 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2124 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2125 break;
2126 }
2127 case armnn::LayerType::SpaceToBatchNd:
2128 {
2129 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2130 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2131 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2132 break;
2133 }
2134 case armnn::LayerType::SpaceToDepth:
2135 {
2136 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2137 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2138 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2139 break;
2140 }
2141 case armnn::LayerType::Splitter:
2142 {
2143 const armnn::SplitterDescriptor& layerDescriptor =
2144 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2145 SerializeSplitterLayer(layer, layerDescriptor, name);
2146 break;
2147 }
2148 case armnn::LayerType::Stack:
2149 {
2150 const armnn::StackDescriptor& layerDescriptor =
2151 static_cast<const armnn::StackDescriptor&>(descriptor);
2152 SerializeStackLayer(layer, layerDescriptor, name);
2153 break;
2154 }
2155 case armnn::LayerType::StandIn:
2156 {
2157 const armnn::StandInDescriptor& layerDescriptor =
2158 static_cast<const armnn::StandInDescriptor&>(descriptor);
2159 SerializeStandInLayer(layer, layerDescriptor, name);
2160 break;
2161 }
2162 case armnn::LayerType::StridedSlice:
2163 {
2164 const armnn::StridedSliceDescriptor& layerDescriptor =
2165 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2166 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2167 break;
2168 }
2169 case armnn::LayerType::Subtraction:
2170 {
2171 SerializeSubtractionLayer(layer, name);
2172 break;
2173 }
2174 case armnn::LayerType::Switch:
2175 {
2176 SerializeSwitchLayer(layer, name);
2177 break;
2178 }
2179 case armnn::LayerType::Transpose:
2180 {
2181 const armnn::TransposeDescriptor& layerDescriptor =
2182 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2183 SerializeTransposeLayer(layer, layerDescriptor, name);
2184 break;
2185 }
2186 case armnn::LayerType::TransposeConvolution2d:
2187 {
2188 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2189 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2190 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2191 break;
2192 }
2193 default:
2194 {
2195 throw InvalidArgumentException(
2196 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2197 layer->GetName(),
2198 id));
2199 }
2200 }
2201}
2202
Finn Williams85d36712021-01-26 22:30:06 +00002203void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002204{
2205 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002206 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2207 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002208
2209 // Create FlatBuffer SerializedGraph
2210 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002211 fbBuilder,
2212 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2213 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2214 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2215 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002216
2217 // Serialize the graph
2218 fbBuilder.Finish(serializedGraph);
2219}
2220
Finn Williamsb454c5c2021-02-09 15:56:23 +00002221
Finn Williams85d36712021-01-26 22:30:06 +00002222bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002223{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002224 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002225
Matthew Sloyan0663d662020-09-14 11:47:26 +01002226 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002227 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002228 return !stream.bad();
2229}
2230
Finn Williams2605b232020-06-10 15:53:46 +01002231} // namespace armnnSerializer