blob: 15ae78cb6533111df2807faf40d347368567a887 [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 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001721 case armnn::DataType::Signed64:
1722 {
1723 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1724 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1725 m_flatBufferBuilder,
1726 fbVector);
1727 fbPayload = flatBuffersData.o;
1728 break;
1729 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001730 case armnn::DataType::Float32:
1731 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001732 {
1733 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1734 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1735 m_flatBufferBuilder,
1736 fbVector);
1737 fbPayload = flatBuffersData.o;
1738 break;
1739 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001740 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001741 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001742 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001743 {
1744 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1745 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1746 m_flatBufferBuilder,
1747 fbVector);
1748 fbPayload = flatBuffersData.o;
1749 break;
1750 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001751 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001752 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001753 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001754 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001755 default:
1756 {
1757 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1758 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1759 m_flatBufferBuilder,
1760 fbVector);
1761 fbPayload = flatBuffersData.o;
1762 }
1763 }
1764 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1765 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001766 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001767 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1768 fbPayload);
1769 return flatBufferConstTensor;
1770}
1771
Finn Williamsb454c5c2021-02-09 15:56:23 +00001772flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001773{
1774 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1775 serializer::CreateFeatureCompatibilityVersions(
1776 m_flatBufferBuilder,
1777 1 // Binding ids scheme version
1778 );
1779 return versionsTable;
1780}
1781
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001782std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001783 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001784{
Mike Kellya0766c32019-02-19 17:22:07 +00001785 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001786
1787 // Get the InputSlots
1788 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1789 {
1790 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1791
1792 // Get the Connection for the InputSlot
1793 const IOutputSlot* connection = inputSlot.GetConnection();
1794
1795 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001796 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1797 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001798 // Create FlatBuffer InputSlot
1799 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1800 }
1801 return inputSlots;
1802}
1803
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001804std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001805 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001806{
1807 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1808
1809 // Get the OutputSlots
1810 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1811 {
1812 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001813 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001814
Mike Kelly8c1701a2019-02-11 17:01:27 +00001815 // Create FlatBuffer Outputslot
1816 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1817 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001818 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001819 }
1820 return outputSlots;
1821}
1822
Finn Williamsb454c5c2021-02-09 15:56:23 +00001823void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1824 const BaseDescriptor& descriptor,
1825 const std::vector<armnn::ConstTensor>& constants,
1826 const char* name,
1827 const armnn::LayerBindingId id)
1828{
1829 IgnoreUnused(constants);
1830
1831 switch (layer->GetType())
1832 {
1833 case armnn::LayerType::Activation :
1834 {
1835 const armnn::ActivationDescriptor& layerDescriptor =
1836 static_cast<const armnn::ActivationDescriptor&>(descriptor);
1837 SerializeActivationLayer(layer, layerDescriptor, name);
1838 break;
1839 }
1840 case armnn::LayerType::Addition :
1841 {
1842 SerializeAdditionLayer(layer, name);
1843 break;
1844 }
1845 case armnn::LayerType::ArgMinMax :
1846 {
1847 const armnn::ArgMinMaxDescriptor& layerDescriptor =
1848 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
1849 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
1850 break;
1851 }
1852 case armnn::LayerType::BatchNormalization :
1853 {
1854 const armnn::BatchNormalizationDescriptor& layerDescriptor =
1855 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
1856 SerializeBatchNormalizationLayer(layer,
1857 layerDescriptor,
1858 constants,
1859 name);
1860 break;
1861 }
1862 case armnn::LayerType::BatchToSpaceNd :
1863 {
1864 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
1865 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
1866 SerializeBatchToSpaceNdLayer(layer,
1867 layerDescriptor,
1868 name);
1869 break;
1870 }
1871 case armnn::LayerType::Comparison :
1872 {
1873 const armnn::ComparisonDescriptor& layerDescriptor =
1874 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
1875 SerializeComparisonLayer(layer,
1876 layerDescriptor,
1877 name);
1878 break;
1879 }
1880 case armnn::LayerType::Concat :
1881 {
1882 const armnn::ConcatDescriptor& layerDescriptor =
1883 static_cast<const armnn::ConcatDescriptor&>(descriptor);
1884 SerializeConcatLayer(layer,
1885 layerDescriptor,
1886 name);
1887 break;
1888 }
1889 case armnn::LayerType::Constant :
1890 {
1891 SerializeConstantLayer(layer,
1892 constants,
1893 name);
1894 break;
1895 }
1896 case armnn::LayerType::Convolution2d :
1897 {
1898 const armnn::Convolution2dDescriptor& layerDescriptor =
1899 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
1900 SerializeConvolution2dLayer(layer,
1901 layerDescriptor,
1902 constants,
1903 name);
1904 break;
1905 }
1906 case armnn::LayerType::DepthToSpace :
1907 {
1908 const armnn::DepthToSpaceDescriptor& layerDescriptor =
1909 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
1910 SerializeDepthToSpaceLayer(layer,
1911 layerDescriptor,
1912 name);
1913 break;
1914 }
1915 case armnn::LayerType::DepthwiseConvolution2d :
1916 {
1917 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
1918 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
1919 SerializeDepthwiseConvolution2dLayer(layer,
1920 layerDescriptor,
1921 constants,
1922 name);
1923 break;
1924 }
1925 case armnn::LayerType::Dequantize :
1926 {
1927 SerializeDequantizeLayer(layer,
1928 name);
1929 break;
1930 }
1931 case armnn::LayerType::DetectionPostProcess :
1932 {
1933 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
1934 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
1935 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
1936 break;
1937 }
1938 case armnn::LayerType::Division :
1939 {
1940 SerializeDivisionLayer(layer, name);
1941 break;
1942 }
1943 case armnn::LayerType::ElementwiseUnary :
1944 {
1945 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
1946 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
1947 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
1948 break;
1949 }
1950 case armnn::LayerType::Fill :
1951 {
1952 const armnn::FillDescriptor& layerDescriptor =
1953 static_cast<const armnn::FillDescriptor&>(descriptor);
1954 SerializeFillLayer(layer, layerDescriptor, name);
1955 break;
1956 }
1957 case armnn::LayerType::Floor :
1958 {
1959 SerializeFloorLayer(layer, name);
1960 break;
1961 }
1962 case armnn::LayerType::FullyConnected :
1963 {
1964 const armnn::FullyConnectedDescriptor& layerDescriptor =
1965 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
1966 SerializeFullyConnectedLayer(layer, layerDescriptor, constants, name);
1967 break;
1968 }
1969 case armnn::LayerType::Gather :
1970 {
1971 const armnn::GatherDescriptor& layerDescriptor =
1972 static_cast<const armnn::GatherDescriptor&>(descriptor);
1973 SerializeGatherLayer(layer, layerDescriptor, name);
1974 break;
1975 }
1976 case armnn::LayerType::Input:
1977 {
1978 SerializeInputLayer(layer, id, name);
1979 break;
1980 }
1981 case armnn::LayerType::InstanceNormalization :
1982 {
1983 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
1984 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
1985 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
1986 break;
1987 }
1988 case armnn::LayerType::L2Normalization :
1989 {
1990 const armnn::L2NormalizationDescriptor& layerDescriptor =
1991 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
1992 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
1993 break;
1994 }
1995 case armnn::LayerType::LogicalBinary :
1996 {
1997 const armnn::LogicalBinaryDescriptor& layerDescriptor =
1998 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
1999 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2000 break;
2001 }
2002 case armnn::LayerType::LogSoftmax :
2003 {
2004 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2005 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2006 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2007 break;
2008 }
2009 case armnn::LayerType::Lstm :
2010 {
2011 const armnn::LstmDescriptor& layerDescriptor =
2012 static_cast<const armnn::LstmDescriptor&>(descriptor);
2013 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2014 break;
2015 }
2016 case armnn::LayerType::QLstm :
2017 {
2018 const armnn::QLstmDescriptor& layerDescriptor =
2019 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2020 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2021 break;
2022 }
2023 case armnn::LayerType::Maximum :
2024 {
2025 SerializeMaximumLayer(layer, name);
2026 break;
2027 }
2028 case armnn::LayerType::Mean :
2029 {
2030 const armnn::MeanDescriptor& layerDescriptor =
2031 static_cast<const armnn::MeanDescriptor&>(descriptor);
2032 SerializeMeanLayer(layer, layerDescriptor, name);
2033 break;
2034 }
2035 case armnn::LayerType::Merge :
2036 {
2037 SerializeMergeLayer(layer, name);
2038 break;
2039 }
2040 case armnn::LayerType::Minimum :
2041 {
2042 SerializeMinimumLayer(layer, name);
2043 break;
2044 }
2045 case armnn::LayerType::Multiplication :
2046 {
2047 SerializeMultiplicationLayer(layer, name);
2048 break;
2049 }
2050 case armnn::LayerType::Normalization :
2051 {
2052 const armnn::NormalizationDescriptor& layerDescriptor =
2053 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2054 SerializeNormalizationLayer(layer, layerDescriptor, name);
2055 break;
2056 }
2057 case armnn::LayerType::Output:
2058 {
2059 SerializeOutputLayer(layer, id, name);
2060 break;
2061 }
2062 case armnn::LayerType::Pad :
2063 {
2064 const armnn::PadDescriptor& layerDescriptor =
2065 static_cast<const armnn::PadDescriptor&>(descriptor);
2066 SerializePadLayer(layer, layerDescriptor, name);
2067 break;
2068 }
2069 case armnn::LayerType::Permute :
2070 {
2071 const armnn::PermuteDescriptor& layerDescriptor =
2072 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2073 SerializePermuteLayer(layer, layerDescriptor, name);
2074 break;
2075 }
2076 case armnn::LayerType::Pooling2d :
2077 {
2078 const armnn::Pooling2dDescriptor& layerDescriptor =
2079 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2080 SerializePooling2dLayer(layer, layerDescriptor, name);
2081 break;
2082 }
2083 case armnn::LayerType::Prelu :
2084 {
2085 SerializePreluLayer(layer, name);
2086 break;
2087 }
2088 case armnn::LayerType::Quantize :
2089 {
2090 SerializeQuantizeLayer(layer, name);
2091 break;
2092 }
2093 case armnn::LayerType::QuantizedLstm:
2094 SerializeQuantizedLstmLayer(layer, constants, name);
2095 break;
2096 case armnn::LayerType::Reshape:
2097 {
2098 const armnn::ReshapeDescriptor &layerDescriptor =
2099 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2100 SerializeReshapeLayer(layer, layerDescriptor, name);
2101 break;
2102 }
2103 case armnn::LayerType::Rank:
2104 {
2105 SerializeRankLayer(layer, name);
2106 break;
2107 }
2108 case armnn::LayerType::Reduce:
2109 {
2110 const armnn::ReduceDescriptor& layerDescriptor =
2111 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2112 SerializeReduceLayer(layer, layerDescriptor, name);
2113 break;
2114 }
2115 case armnn::LayerType::Resize:
2116 {
2117 const armnn::ResizeDescriptor& layerDescriptor =
2118 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2119 SerializeResizeLayer(layer, layerDescriptor, name);
2120 break;
2121 }
2122 case armnn::LayerType::Slice:
2123 {
2124 const armnn::SliceDescriptor& layerDescriptor =
2125 static_cast<const armnn::SliceDescriptor&>(descriptor);
2126 SerializeSliceLayer(layer, layerDescriptor, name);
2127 break;
2128 }
2129 case armnn::LayerType::Softmax:
2130 {
2131 const armnn::SoftmaxDescriptor& layerDescriptor =
2132 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2133 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2134 break;
2135 }
2136 case armnn::LayerType::SpaceToBatchNd:
2137 {
2138 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2139 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2140 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2141 break;
2142 }
2143 case armnn::LayerType::SpaceToDepth:
2144 {
2145 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2146 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2147 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2148 break;
2149 }
2150 case armnn::LayerType::Splitter:
2151 {
2152 const armnn::SplitterDescriptor& layerDescriptor =
2153 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2154 SerializeSplitterLayer(layer, layerDescriptor, name);
2155 break;
2156 }
2157 case armnn::LayerType::Stack:
2158 {
2159 const armnn::StackDescriptor& layerDescriptor =
2160 static_cast<const armnn::StackDescriptor&>(descriptor);
2161 SerializeStackLayer(layer, layerDescriptor, name);
2162 break;
2163 }
2164 case armnn::LayerType::StandIn:
2165 {
2166 const armnn::StandInDescriptor& layerDescriptor =
2167 static_cast<const armnn::StandInDescriptor&>(descriptor);
2168 SerializeStandInLayer(layer, layerDescriptor, name);
2169 break;
2170 }
2171 case armnn::LayerType::StridedSlice:
2172 {
2173 const armnn::StridedSliceDescriptor& layerDescriptor =
2174 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2175 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2176 break;
2177 }
2178 case armnn::LayerType::Subtraction:
2179 {
2180 SerializeSubtractionLayer(layer, name);
2181 break;
2182 }
2183 case armnn::LayerType::Switch:
2184 {
2185 SerializeSwitchLayer(layer, name);
2186 break;
2187 }
2188 case armnn::LayerType::Transpose:
2189 {
2190 const armnn::TransposeDescriptor& layerDescriptor =
2191 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2192 SerializeTransposeLayer(layer, layerDescriptor, name);
2193 break;
2194 }
2195 case armnn::LayerType::TransposeConvolution2d:
2196 {
2197 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2198 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2199 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2200 break;
2201 }
2202 default:
2203 {
2204 throw InvalidArgumentException(
2205 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2206 layer->GetName(),
2207 id));
2208 }
2209 }
2210}
2211
Finn Williams85d36712021-01-26 22:30:06 +00002212void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002213{
2214 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002215 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2216 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002217
2218 // Create FlatBuffer SerializedGraph
2219 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002220 fbBuilder,
2221 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2222 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2223 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2224 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002225
2226 // Serialize the graph
2227 fbBuilder.Finish(serializedGraph);
2228}
2229
Finn Williamsb454c5c2021-02-09 15:56:23 +00002230
Finn Williams85d36712021-01-26 22:30:06 +00002231bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002232{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002233 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002234
Matthew Sloyan0663d662020-09-14 11:47:26 +01002235 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002236 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002237 return !stream.bad();
2238}
2239
Finn Williams2605b232020-06-10 15:53:46 +01002240} // namespace armnnSerializer